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 Routing
linux_china edited this page Feb 15, 2020
·
18 revisions
目前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: 指定目标服务器,这个主要用于调试等,在RoutingMetadata中已tag方式保存
目前大多数路由都是基于文本匹配的,如果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等都能顺利接入。
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