打印快递单的软件(Spring官方RSocket Broker 0.3.0发布:快速构建你的RSocket架构)



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)。

  • 路由节点ID:这是应用于由代理创建的长连接的唯一标识符,通常是UUID,但也可以由用户自己指定。连接的唯一性将使每个代理集群的全局路由表更加方便。注意routeId是长连接的标识符,不是应用的标识符,应用的标识符是用标签来标识的。如果应用程序和代理创建了两个长连接,那么就有两个不同的routeId。当然,在这种情况下,每个连接可以提供不同的服务名。
  • 服务名:这实际上是服务的DNS名称。如果其他应用程序想要调用该应用程序提供的RSocket服务,则需要指定服务名。虽然Spring RSocket提供了messagemapping,但是映射的键是应用程序内部的,这不能保证全局唯一性。只有服务名+RSocket映射键才能定位指定的服务,这与http的原理是一致的:映射键类似于HTTP Path,而服务名类似于域名。
  • 标签:标签用于标识应用程序提供的RSocket服务。当然,RSocket Broker规范也提供了一些默认标签,比如实例名、集群名、区域、主版本等等。标签不仅是服务的元信息,还可以参与服务路由。例如,您可以设置服务版本、集群名称等。,而之前开发中长期存在的定向路由,可以通过标签轻松解决。例如,可以用instance name = app-雷娟标记服务,然后在调用中设置insurancename,以调用由开发人员启动的服务实例。你不用担心标签路由的性能,有咆哮位图支持,速度非常快。
  • 应用程序可以向集群中的一个或多个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接口了。示例如下:

    好用快递单打印软件



    三 Spring RSocket Broker的一些思考

    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的请求找不到目标节点。这时候我该怎么办?

  • 拒绝请求,立即返回失败:这就是我们常说的快速失败设计,广泛应用于企业架构设计中。如果采用同步通信和线程池的方式,你基本上不得不使用这种设计,否则长时间的线程堵塞会立刻让你的服务无法响应请求。
  • 等待服务上线:代理先持有请求,服务上线后再转发给在线服务。这种设计有时非常有用。例如,在FaaS场景中,网关已经验证该功能存在,而目前它只是离线的功能,所以只需在线触发该功能并要求等待。另外还有网络抖动的问题,会导致连接中断。这时候你也可以选择等待服务上线。另一个场景是服务发布。例如,长尾服务只有一个实例。只要你能在3-5秒内重启应用,此时broke可以帮你持有请求,然后配合客户端的重试。即使只有一个实例,也不会觉得服务中断。例如,在K8S中,将应用的图像设置为last,然后设置为获取最新的图像,这样redploy按钮就可以了。当然,这个请求的等待时间不是无限的。您可以设置超时,然后返回一个错误。
  • 回到上面的场景,此时Broker-1将保留请求。当service-1上线时,请求将被立即转发到online节点进行处理。与同步通信不同,异步等待对反应式系统没有系统压力,所以等待服务上线绝对没有问题。当然,至于那种模式,你可以根据实际的技术需求来选择。RSocket Broker支持这两种模式。

    4消息广播模型

    RSocket broker还支持消息广播,即将RSocket请求转发给一组服务节点。广播主要包括以下几种模式:

  • FireAndForget model:如果配置push场景,将配置更新请求发送到service-name对应的服务列表。
  • Requestresponse模型:向多个服务发送请求,然后将第一个响应的响应返回给调用者,不管响应的结果是成功还是失败,类似于JavaScript中的Promise.race()。Promise.race()特性,业务场景好像很少。为了便于理解,这里加了一个超时,转换成:& # 34;在指定的时间内尽快返回正确的结果& # 34;。比如在数据同步的场景下,数据会同步到多台备份服务器上,但是由于各种原因,备份服务器上的数据同步可能会延迟或丢失,所以我从多台备份服务器上查询数据,约定如果备份服务器上没有数据,1秒超时后返回异常,以保证尽快从备份服务器集群中获取正确的数据。当然,在实际架构中,我们会增加一层缓存支持,避免同时向服务发起多个请求,浪费更多资源。
  • RequestStream模型:向多个服务提供者发送请求,然后汇总返回的流,再将合并后的消息流返回给调用者。在监控场景中非常有用。您希望每个服务或应用程序在5分钟内报告日志,然后进行统计,这在这个时候非常有帮助。
  • 渠道模式:持续向多个服务商的渠道发送信息,然后汇总发送的信息。如果你有多个作业要发出,然后汇总每个申请对作业的回复结果,可以使用这个模型。
  • 从以上几款来看,基本可以覆盖大量的播出需求。如果公司要你做配置推送的配置服务器,借助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立即实现一些典型的业务场景:

  • Config/Registry Server:由于应用程序已经与代理建立了长连接,所以元信息也被发送到代理,因此注册服务器也将这样做。RSocket Broker支持各种消息广播模型,所以Config Server基本准备好了。单个应用的配置推送,基于独立标签的推送,基于服务名的整体推送,都可以。
  • Web控制台:嵌入代理后,开发一个Web控制台,这对Spring Boot来说非常简单。
  • 数据网关:如果你想做一个对外提供数据访问服务的数据网关,所有的数据工作者节点都连接到代理,然后代理就可以对外提供服务。
  • Ops系统集成:这可以通过使用Spring Boot等进行集成,例如检查access应用程序的健康状况,只需向应用程序发送一条消息。
  • 以及应用Broker的优雅下线:通过推送brokers的配置信息,应用可以连接到新的brokers节点,完成brokers集群的下线。应用的上线和下线,在代理集群发送一个ROUTE_REMOVE的消息,3-5后下线。
  • 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

    本文为阿里云原创内容,未经允许不得转载。

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友