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

RSocket Routing

linux_china edited this page Apr 13, 2020 · 18 revisions

目前RSocket的路由策略是基于官方标准的Routing Metadata Extension, 详细可以参考 io.rsocket.metadata.RoutingMetadata

文本型的RoutingMetadata

目前的路由设计通常要支持以下一些信息:

  • group: 服务所在的分组,如机房,或者机房内的虚拟集群等,如服务在不同的K8S集群等
  • version: 服务的版本,如1.0.0,出于A/B测试等,可能有不同的版本划分,如灰度测试等
  • service name: 这个是服务的全名,如com.alibaba.user.UserService,这个主要是服务名称的定位,包括命名空间 + 服务名
  • method: 也就是要最终的处理函数,如Java Interface中的函数,gRPC中的rpc函数等
  • endpoint(接入点): 指定目标服务器,这个主要用于开发调试、A/B测试等场景,也可以做一对一的调试

目前大多数路由都是基于文本匹配的,如果Spring RSocket中使用@MessageMapping的value和路由Key的匹配。在Alibaba RSocket中,路由key的格式如下:

dc1!com.alibaba.user.UserService.findById:1.0.0

group和service之间用感叹号分隔,服务和version之间以冒号分隔,如果group和version为空,则为"com.alibaba.user.UserService.findById",这个和Spring RSocket兼容。

二进制RoutingMetadata

考虑到使用文本解析比较消耗性能,所以针对broker场景设计了一个Binary Routing,将路由文本进行hashcode化,然后基于hashcode的int值进行逻辑判断,这样就免去在broker上的RSocket协议解析,做到性能机制。 详细信息,请参考 BinaryRoutingMetadata

目前RSocket Broker同时支持两套路由策略,这样可以保证注入Spring RSocket、HTTP Gateway等都能顺利接入。

Endpoint说明

接入点是指请求方指定服务处理的目标服务器,如IP、服务ID、或者服务元信息。 在构建RSocket ServiceStub的RSocketRemoteServiceBuilder中你可以指定endpoint,典型支持如下:

ip=192.168.1.33
uuid=xxxxxx

这些值,你可以在RSocket控制台查找到。

还有一种是基于元信息查找,如在RSocket服务端应用的application.properties文件包含RSocket metadata元信息,如下述开发者为lijuan:

rsocket.metadata.developer=leijuan

那么你将endpoint调整"developer=leijuan",就可以将请求路由到包含对应metadata的服务提供方。

注意: 目前endpoint并不支持多个规则的处理逻辑,如多个元信息匹配,在使用的时候注意一下。

Spring RSocket标准路由

Spring RSocket使用的是RSocket的标准路由规范,这个和RSocket Broker都是兼容的,如果你要使用Spring RSocket的RSocketRequester,你可以进行如下设置:

    @Bean
    public RSocketRequester rsocketRequester(UpstreamManager upstreamManager) {
        LoadBalancedRSocket loadBalancedRSocket = upstreamManager.findBroker().getLoadBalancedRSocket();
        RSocketStrategies rSocketStrategies = RSocketStrategies.builder()
                .encoder(new HessianEncoder())
                .decoder(new HessianDecoder())
                .build();
        return RSocketRequester.wrap(loadBalancedRSocket,
                MimeType.valueOf("application/x-hessian"),
                MimeType.valueOf("message/x.rsocket.composite-metadata.v0"),
                rSocketStrategies);
    }

然后你直接使用Spring RSocket相关标准接口即可:

Mono<User> user = requester.route("com.alibaba.user.UserService.findById").data(id).retrieveMono(User.class);

References

Routing Metadata Extension: https://github.com/rsocket/rsocket/blob/master/Extensions/Routing.md

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