-
Notifications
You must be signed in to change notification settings - Fork 167
RSocket Routing
目前RSocket的路由策略是基于官方标准的Routing Metadata Extension, 详细可以参考 io.rsocket.metadata.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兼容。
考虑到使用文本解析比较消耗性能,所以针对broker场景设计了一个Binary Routing,将路由文本进行hashcode化,然后基于hashcode的int值进行逻辑判断,这样就免去在broker上的RSocket协议解析,做到性能机制。 详细信息,请参考 BinaryRoutingMetadata
目前RSocket Broker同时支持两套路由策略,这样可以保证注入Spring RSocket、HTTP Gateway等都能顺利接入。
接入点是指请求方指定服务处理的目标服务器,如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使用的是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);
Routing Metadata Extension: https://github.com/rsocket/rsocket/blob/master/Extensions/Routing.md
- Binary: byte stream
- Async message
- Multi transports
- Reactive Semantics
- request/response
- request/stream
- fire-and-forget
- channel
- TCP+TLS
- WebSocket+TLS
- UDP(Aeron)
- RDMA