This repository has been archived by the owner on Jul 16, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 167
RSocket P2P
linux_china edited this page May 8, 2021
·
5 revisions
在一些性能非常关键的场景中,我们需要通过直连的服务提供方,这样性能比较高。
服务直连的优点:
- 性能非常高:不需要经过Broker,可以减少TCP两跳,性能更高一些
服务直连的缺点:
- 服务提供方需要提供对应的端口监听
- 服务提供方要对服务台消费者连接时要进行对应的权限判断,可能还需要设置TLS等
- 服务调用方的网络和服务提供方的网络是打通的,可以直接连接
- 服务提供方要维护大量的网络连接,相对比较消耗资源
通常我们不建议服务消费方到服务提供方之间的直连,只有是性能非常关键的场景,才建议开启P2P直连。
服务直连是基于服务接口级别的,而不是基于应用级别的,一个应用提供的服务列表中,并不全是高QPS的场景。
那么如何开启服务的直连?
- application.properties文件中添加
rsocket.p2p-services=com.alibaba.user.UserService2
配置项 - RSocketRemoteServiceBuilder中调用p2p()方法设置该服务接口直连
如果服务提供者为提供对应的端口监听,则会通过Broker完成对应的调用。
RSocket服务直连的背后原理:
- 服务消费方要告知UpstreamManager,有相关的service需要直连
- 应用和Broker创建连接后,如果Broker发现有对应的服务实例,且服务实例列表包含监听端口,则推送ServiceInstancesChangedEvent事件
- 应用接收到ServiceInstancesChangedEvent事件后,如果首次,则会创建该Service对应的UpstreamCluster,如果对应的UpstreamCluster已存在,则进行实例列表更新
- 为了确保服务对应的列表幂等,UpstreamManager会每隔120秒进行一次和Broker同步
- 服务消费方在调用远程服务,如果服务接口对应包含UpstreamCluster,则会走质量对应的UpstreamCluster
- Broker实时给服务提供者推送对应的服务消费者????
如果解决P2P连接时,服务提供者如何验证服务消费者?使用应用UUID验证?每一个应用在启动后都会生成一个UUID,该UUID是惟一的,所以可以服务提供方可以根据UUID向Broker查询,如果已经在Broker注册,则表示合法,然后服务提供方运行其访问。 发给服务提供者时,不需要发送JWT Token,只要发送AppMetadata给服务方就可以。
注意:这种方式存在安全风险,如从控制台查询到应用列表从而获得应用的UUID,但是对于内部通讯来说,还是有一定的安全保证的,主要是应用的UUID在应用重新启动后会使用新的。
该方案目前还是草案,RSocket Broker还没有添加对应的安全限制,还是开发连接的,并没有进行对应的安全验证。
需要将各种metrics信息进行记录,如客户端的连接数等,这些方便后续的metrics审计等。
- Binary: byte stream
- Async message
- Multi transports
- Reactive Semantics
- request/response
- request/stream
- fire-and-forget
- channel
- TCP+TLS
- WebSocket+TLS
- UDP(Aeron)
- RDMA