Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

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直连时安全验证问题

如果解决P2P连接时,服务提供者如何验证服务消费者?使用应用UUID验证?每一个应用在启动后都会生成一个UUID,该UUID是惟一的,所以可以服务提供方可以根据UUID向Broker查询,如果已经在Broker注册,则表示合法,然后服务提供方运行其访问。 发给服务提供者时,不需要发送JWT Token,只要发送AppMetadata给服务方就可以。

注意:这种方式存在安全风险,如从控制台查询到应用列表从而获得应用的UUID,但是对于内部通讯来说,还是有一定的安全保证的,主要是应用的UUID在应用重新启动后会使用新的。

该方案目前还是草案,RSocket Broker还没有添加对应的安全限制,还是开发连接的,并没有进行对应的安全验证。

Metrics

需要将各种metrics信息进行记录,如客户端的连接数等,这些方便后续的metrics审计等。

RSocket

Network Protocol

  • Binary: byte stream
  • Async message
  • Multi transports
  • Reactive Semantics

Symmetric interactions

  • request/response
  • request/stream
  • fire-and-forget
  • channel

Transports

  • TCP+TLS
  • WebSocket+TLS
  • UDP(Aeron)
  • RDMA

Polyglot

Clone this wiki locally