Spring的官方Rsocket Broker开发了很久。我以为会和春云2021.0一起发布,结果没有。不过Spring RSocket Broker已经发布了最新的0.3版本。虽然还是预览版,但是目前已经可以用了。考虑到目前还没有提供官方文档,大家入门Demo还比较困难,所以这篇文章就是为了帮助大家快速入门Spring RSocket Broker,分析RSocket Broker的特点。
一 Spring RSocket Broker架构我们先来看看Spring RSocket Broker的架构图,如下图:
RSocket Broker为群集提供服务。它的主要服务是应用程序注册和rsocket请求的转发。集群中的每个代理维护一个统一的全局路由表。RSocket Broker有两个监听端口:端口8001主要负责提供外部RSocket服务,比如代理之间的长连接,然后在长连接上发送和接收RSocket请求。端口701主要负责集群内代理节点之间的通信,比如同步应用访问的元数据信息,保证全局服务路由表的统一,还包括代理之间的请求转发。当然,经纪人之间的通信协议是RSocket。
服务应用在与代理建立连接时,会向代理发送一些基本信息,对应的属性主要包括:路由节点ID(routeId)、service-name(service-name)和tags (tags)。
应用程序可以向集群中的一个或多个RSocket代理节点注册,这取决于代理客户端的配置,我们将在后面讨论。
注意:这里不要把ServiceName仅仅理解为Java的接口全称,比如com.example.user.UserService当一个应用有多个这样的Java服务时,处理起来会比较麻烦。实际上,serviceName主要用于请求路由。例如,如果一个服务应用程序包括多个服务接口,如UerService、UserExtraService,则可以将ServiceName设置为com.example.user mode,当然,还要确保ServiceName是唯一的。原来的RSocket路由键调整为UserService.findUserById的接口名+方法名模式,所以没有问题。
当应用向代理注册时,如果应用要调用某个RSocket服务,可以根据服务名+路由关键字向代理发起RSocket调用请求,然后代理会根据内部全局路由表找到可以提供服务的服务节点(RouteId)。然后将请求转发到相应的服务节点。处理之后,服务节点将响应返回给代理,代理将响应返回给调用者。
如果当前代理节点上没有对应的服务路由访问,这就是代理将请求转发给有服务节点的代理,这就是请求转发,然后那个代理处理的结果会返回给调用者。有的同学可能会问,可能会出现调用链的死循环,比如broker1转发请求给broker3,broker3上的服务突然下线不存在,broker3可能会发回给Broker1,然后broker1会找另一个broker发送?这种情况不会发生。代理将同步应用在线和离线信息,因此每个代理维护集群的统一全局路由表。因此,代理1将消息转发给代理2,代理2上必须有相应服务的路由连接。即使broker2出现紧急情况,服务对应的路由没有了,也会转发给有服务的broker。当然,如果一个都没有找到,请求此时将被Broker挂起,超时后将返回一个错误。
二 Spring RSocket Broker项目样例接下来,让我们看一个包含三个应用程序的真实开发示例:代理服务器、服务提供者和服务调用者。Spring RSocket Broker对应的开发包已经提交到Maven仓库,你可以在本文最后查看。
1 RSocket Broker服务器
RSocket代理服务器是一个标准的Spring Boot应用程序。您只需要向Spring Boot应用程序添加以下依赖项:
然后在application.yaml文件中添加以下配置:
然后启动Spring Boot应用程序,代理将启动并监听端口7001和8001。有的同学可能会问,为什么不提供一个独立的应用来启动RSocket Broker呢?这可能和春云项目的出发点有关。和Spring Config Server、Registry Server一样,由应用程序嵌入,主要是方便开发者定制Broker的功能,比如添加Web控制台、对接Ops系统等。,而且灵活性会很高。
2 RSocket服务提供商
接下来,我们将创建一个Spring Boot应用程序,向外界提供RSocket服务。首先我们会添加以下依赖项:spring-boot-starter-rsocket是标配,方便Spring Boot应用集成rsocket,另一个是rsocket-broker-client-spring,是Broker Spring客户端,负责完成与RSocket Broker的对接。
然后在服务应用程序的application.yaml中添加以下代理客户端配置。这里,应该解释服务名。建议采用前面提到的DNS命名方式,这样可以保证服务名不会冲突。接下来是经纪人的地址列表,如下:
接下来,我们需要编写一个RSocket服务,它是标准的Spring RSocket。代码如下:
然后,当我们启动服务应用程序时,我们会在RSocket代理的日志输出中看到应用程序向代理注册的信息,这样RSocket服务就向代理注册了。
3 RSocket服务消费者
接下来,我们需要创建一个应用程序来调用RSocket服务,并添加与服务应用程序相同的依赖项。由于应用程序不向外界提供RSocket服务,所以可以将service-name调整为Namespace+应用程序名,这主要是为了避免与其他应用程序重名,如下所示:
接下来就是写一个Web控制器来访问RSocket服务,只需要注入BrokerRSocketRequester Bean,然后调用RSocket服务,类似于Spring RSocket Rsocketer的使用方法,代码如下:
启动应用程序后,可以用curl命令测试它,可以看到熟悉的Hello ping输出。
您可能认为这个客户端调用很简单。其实你只需要集成spring-retrosocket,然后你就熟悉Java接口了。示例如下:
1 RSocket Broker属性
RSocket broker已经发展了很长时间。开发人员都是春云团队的成员。Oleh在反应堆和反应堆方面很有经验。斯潘塞也是Spring Cloud的核心架构师。斯潘塞在很多会议上谈到RSocket给春云带来的改变,完全是颠覆性的。从上面的应用实例也可以看出,不提反应式全异步的性能,就不再需要服务注册,也不需要本地启动监听端口。参与Broker转发后,混合各种云的服务可以通过Broker互相调用。Spring RSocket Broker对RSocket Broker的优势解释如下:
路由和转发用于通过代理在两个RSocket连接之间转发RSocket请求。在某些情况下,客户端和服务器之间的点对点交互就足够了,在企业环境中,将客户端和服务器彼此分离是很有用的。为什么分离是必要的一些例子包括蓝/绿部署、负载平衡、A/B测试、特性切换等。此外,提供中介有助于提高安全性和可伸缩性。最后,通过负载平衡、路由和QoS,可以实现比直接连接更好的整体应用延迟和吞吐量。
2R Socket Broker中直接通信的解决方案
有些同学可能会有疑问。RSocket Broker后会有一定的性能损失。我的申请QPS很高,所以不能有任何延误。没关系。还记得spring-boot-starter-rsocket依赖项被添加到服务应用程序中吗?我们只需要在application.yaml中添加以下配置项来打开RSocket的服务监听端口,然后使用RSocket Broker提供的元信息来创建到目标服务的连接。工作量是有的,但是已经很小了。我们只需要使用reactor-pool来自动管理直接连接的连接池。
3 RSocket Broker请求正在等待
Spring RSocket Broker的另一个特性是服务在线延迟支持。例如,假设App-1和Service-1都在线正常运行,突然Service-1的所有实例都离线了。此时app-1的请求找不到目标节点。这时候我该怎么办?
回到上面的场景,此时Broker-1将保留请求。当service-1上线时,请求将被立即转发到online节点进行处理。与同步通信不同,异步等待对反应式系统没有系统压力,所以等待服务上线绝对没有问题。当然,至于那种模式,你可以根据实际的技术需求来选择。RSocket Broker支持这两种模式。
4消息广播模型
RSocket broker还支持消息广播,即将RSocket请求转发给一组服务节点。广播主要包括以下几种模式:
从以上几款来看,基本可以覆盖大量的播出需求。如果公司要你做配置推送的配置服务器,借助RSocket Broker分分钟就能搞定吗?在RSocket Broker+Agent的帮助下,完成运维、日志收集等都不麻烦。在Prometheus的metrics定时收集场景中,只需要发送一个命令就可以收集所有机器上的度量,这比向每个节点发送一个HTTP请求要简单得多。
5网关和代理
网关设计大多采用主动连接模式,即网关主动连接上游服务的代理模式。当然,要连接到上游服务、服务注册发现、智能DNS等。都是需要的,这里不再重复原理。代理架构采用被动模式,即等待服务连接到代理,即当服务准备好了,主动连接到代理就可以了,然后基于应用和代理之间建立的长连接转发请求。与网关架构相比,代理模型要简单得多,不需要内部管理上游服务的连接池,也不需要服务注册和发现。当然对网络接入没有特殊要求,混合云的场景也适用。
RSocket Broker是基于RSocket协议的,但是也可以通过桥接的方式支持各种协议,比如可以扩展RSocket HTTP桥来支持HTTP访问。
6嵌入式RSocket代理
为了回答前面的问题,RSocket Broker被嵌入到应用程序中。您需要添加相应的依赖项和配置,然后启动相应的应用程序。这类似于Spring Config Server等。,主要是方便开发者扩展Broker的相应功能,并与其他系统集成。结合前面介绍的RSocket Broker的特性,我们可以通过嵌入RSocket Broker立即实现一些典型的业务场景:
7 Spring RSocket代理客户端
目前RSocket Broker的客户端SDK主要有Java和Node.js,但是其他语言的Broker客户端SDK就不用担心了。Broker Client只是在RSocket SDK的复合元数据中增加了一个新的message/x . r socket . broker . frame . v0 Metadata规范。借助RSocket多语言SDK,主流语言开发的应用可以快速连接到broker。
四 总结最后有同学问:现在RSocket成熟了吗?在春天的生态里,它已经很成熟了。RSocket Java SDK是Spring团队开发的。Spring RSocket提供了RSocket和Spring的集成。Spring Boot内置了rsocket-starter,Spring Cloud功能也增加了rsocket支持。考虑到Java开发者的习惯,还提供了spring-retrosocket。其他的Spring产品基本都支持Reactive,所以可以通过Reactive进行对接。没错,RSocket外围已经一切就绪,大家都在等待RSocket Broker的出现,这样整合部署会更简单。除此之外,把各种服务,比如REST API,GraphQL或者RPC框架,迁移到RSocket上是不是很麻烦?如果用Spring来体现,就是加一个@MessageMapping的东西,然后你就可以通过RSocket来访问这些服务了。Dubbo/HSF服务,将spring-retrosocket提供的注释添加到接口中,然后就可以通过RSocket协议访问这些服务了。REST API可以将@MessageMapping添加到控制器中。至于GraphQL,不需要任何调整,只需要添加一个新的GraphqlController,与GraphQL的底层服务进行接口即可。就Spring RSocket Broker目前的特点来说,对于一个中型企业来说,可以说是完全可以胜任,不需要任何调整。这就是Spring Config Server、Spring Registry Server、Spring Cloud Gateway的定位是一样的。
至于春云团队,我们一直在说RSocket对春云的影响和开发经验。相信看完这个,你有自己的判断了。但有句老话:“世上有伯乐,再有千里马。千里马常有,伯乐不常有。”
如果你想了解更多的技术细节,我在示例项目的READM.md中解释过。有兴趣可以去看看项目的Git仓库。示例项目的git仓库地址是:https://github.com/linux-china/spring-rsocket-broker-demo欢迎克隆试用版。
链接:https://repo1.maven.org/maven2/io/rsocket/broker/
作者|雷娟
原文链接:https://developer.aliyun.com/article/848009? UTM _ content = g _ 1000316564
本文为阿里云原创内容,未经允许不得转载。