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 Feb 15, 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: 指定目标服务器,这个主要用于调试等,在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兼容。

二进制RoutingMetadata

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

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

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