RSocket 从入门到落地:两种微服务对比

article/2025/8/17 15:21:03

640?wx_fmt=jpeg

✏️ Pic by Alibaba Tech on Facebook


技术实践的作用在于:除了用于构建业务,也是为了验证某项技术或框架是否值得大规模推广。


这是《RSocket 从入门到落地》系列文章的第三篇,来一起对比下开发微服务应用和微服务之间的网络通讯。该系列文章作者是阿里巴巴资深技术专家雷卷。


第一篇:Servlet vs RSocket「传送门」

第二篇:Spring Cloud Config Server 的 RSocket 实现方式「传送门」


如何发布一个微服务


我们如何编写和发布一个微服务?


这个当然非常简单,用 Spring Boot 创建一个小应用,然后写一些 Rest Controller,然后应用启动,启动监听端口,然后就对外提供服务啦。 这里面有三个非常重要的点:服务实现,服务端口监听和注册中心。 如果是Web服务,RestController 是实现,然后 Eureka 或者 Nacos 作为服务注册中心。然后 Config server是注册中心。 典型的结构如下:


640?wx_fmt=png


上图中,一些功能比较强的注册中心还要负责服务的健康度检查。



如何停止一个微服务


服务停止和服务发布同样重要。


当服务 ready 后,向注册中心注册,对外提供服务。但是下线,不能任性,要有一个流程。首先告诉注册中心一个应用要下线,然后注册中心向所有的应用广播,Xxx 服务中的 IP 要下线,所有应用收到消息后,更新路由表,在等上一个30秒或者更少(根据超时时间来决定),然后断开连接,最后应用想注册中心发出下线指令,然后下线。



基于 RSocket 的微服务如何发布?


一样,需要写一个 Spring Boot 应用,然后实现 RSocket 的 Reactive Service 接口,然后启动应用,连接到Broker,结束。


为何不启动监听端口,其他人如何访问我的服务呢? 


下面我们介绍一下。RSocket 有两种模式,一种是独立对外发布服务,另外一种是基于Broker对外发布服务,前一种是要监听的,后一种则不需要,结构图如下:


640?wx_fmt=png


RSocket 是全双工相互通讯的,所以一个连接既可以用于服务发布,可以用于服务调用。服务发布的时候,会在发布端添加一个 RSocket 的Handler,负责处理连接上发过来的请求,就这样。 所以对一些服务发布是不需要端口监听的。没有端口监听,那好处太多了:


  • 安全:想通过端口扫描攻击我,不可行。

  • TLS证书:没有监听端口,但是还是有一点安全风险,就是别人会伪造TCP请求,当然这个有点难度,但是借助工具,还是有人能做到。 如果是证书,那只需要Broker一个有证书就可以啦,其他服务发布者都不需要。如果有监听端口的话,可能每一个应用都需要配置证书。

  • 强烈的瘦身:Tomcat,ServerSocket,连接池,线程池等都不需要,应用一下子轻了好几十斤。我可以愉快的编译和部署啦,程序基本可以秒启动。

  • 无网络要求:CNI,容器容器直接通讯,这些可以全不要,类似的网络黑科技在 RSocket 面前都不需要,可以说网络无损且皮实。 传统网络,可以,就几个Docker主机,没有问题,Kubernetes和传统混搭,也可以。

  • FaaS的好朋友:你知道的,函数挂上去就可以,不需要处理任何事情。体积小、启动快、而且不用考虑安全需要。不会有安全团队找你麻烦啦,你这个接口非常重要,安全如何做的。


这种架构后,没有注册中心,不需要应用下线推送,应用接入 Broker 后,Service Mesh 需要的特性全都满足:安全,metrics,access logging,灰度等,全部基于消息搞定了。


如果停止RSocket微服务


前面讲到服务下线流程,有点复杂。 


RSocket 服务下线则非常简单,给 Broker 发一个指令说哪个连接要下线,然后 Broker 将这个RSocket 连接从服务列表中拿出来,然后触发一个30秒的延迟事件给服务发布方,确保该服务进入Drain(请求消费完毕)模式,服务发布者收到事件后,应用applicationContext.close()然后coutdown latch退出。 如果都是request/response,这个没有问题,但是 RSocket 还提供非常复杂的通讯,所以优雅下线可能还需要一些工作,如request/stream到另外一个RSocket连接上。 


如果你的应用跑在Kubernetes中,应用退出后,也代表这个 POD 停掉,这个时候 K8s 会尝试重新启动一个新的 POD,如果你设置容器启动拉取最新的 Docker 镜像,其实你已经完成了一次重新发布。而这一切只需要 broker 给这个 RSocket 连接发送一个退出的事件。


总结


眼尖的同学可能会有疑问,这个是中心化设计,有瓶颈,性能和风险很大。确实有这个问题。但是我们知道,一些服务,如会员、商品、交易等,可以继续以 P2P 方式通讯,没有问题。但是一些非关键的服务,可以通过 Broker 方式来完成。但是,这个 Broker 非常高效,这也是RSocket 为何设计了一套自定义的二进制通讯协议,是出于性能要求,所以一个连接过来,通常只需要分析很少的 bytes,然后将流量转发到后端就可以,零拷贝技术(zero-copy)。可以理解为路由器方式,性能非常高。 最关键的是,整个通讯全异步,零阻塞,没有之前的线程池爆掉的风险,所以是非常稳定的,可以告别配置线程池的日子了。


本文作者:

雷卷,GitHub ID linux-china,Java 程序员,阿里云智能资深技术专家。


/ 推荐一个值得参与的开发者活动 /


640?wx_fmt=jpeg


©每周一推

第一时间获得下期分享


640?wx_fmt=gif

Tips:

# 点下“看”❤️

# 然后,公众号对话框内发送“Polo衫,试试手气??

# 本期奖品是 Aliware 定制 Polo衫


http://chatgpt.dhexx.cn/article/Y1TWdCxL.shtml

相关文章

开源的技术底座技术中台spring cloud Rsocket 微服务

一、项目背景 企业对新技术、用户体验、需求响应、交互协作提出了新的要求 1、应用新技术: 物联网、人工智能、大数据挖掘和分析、机器人、自动化等 2、重用核心能力: 使组织能够在其ERP核心解决方案的基础上进行构建,并为“下一步做什么”铺…

spring响应式编程13 RSocket:一种新的高性能网络通信协议

前面几讲我们讨论了如何使用 WebFlux 构建响应式 Web 服务的实现方案。WebFlux 和 WebMVC 一样,都是基于 HTTP 协议实现请求-响应式的交互方式。这种交互方案很简单,但不够灵活,也无法应对所有的响应式应用场景。那么,有没有在网络…

RSocket 学习(二):HTTP VS WebSocket VS RSocket

在比对 HTTP、WebSocket、RSocket 之前,我们先通过下面这张 OSI 七层模型的图快速梳理一下网络通信的面貌, 以便后续更好地理解它们。 osi model.png 一. HTTP 的特性 超文本传输协议(英语:HyperText Transfer Protocol&#xff0…

基于RSocket协议实现客户端与服务端通信

RSocket基础开发demo package com.pshdhx.rsocket;import io.rsocket.Payload; import io.rsocket.RSocket; import io.rsocket.util.DefaultPayload; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import reactor.core.publisher.Flux; import …

响应式编程之网络新约:RSocket

响应式reactive是Java中高效应用的下一个前沿,但它目前主要有两个障碍:数据访问和网络。RSocket是一种新的第7层语言无关的应用网络协议(解决后者),它由Facebook,Netifi和Pivotal等工程师开发,提…

一篇文章了解RSocket协议

RSocket是一个类似于HTTP的通讯协议。在了解Rsocket协议之前,先简单介绍下HTTP协议。 之所以推出springboot的技术,一个原因是因为前后端设计的分离。因为基于HTTP协议可以直接返回REST数据内容。 REST是一个简单且容易使用的异构处理架构,R…

RSocket 学习(一):初探

girl.jpg 一. RSocket 介绍 RSocket 是一种二进制字节流传输协议,位于 OSI 七层模型中的5、6层,对应 TCP/IP 模型中的应用层。RSocket 并没有规定必须使用何种底层传输层协议,开发者可以使用不同的底层传输协议,包括 TCP、WebSock…

RSocket——Http协议的替代者

1. 简介 RSocket是一种二进制的点对点通信协议,是一种新的网络通信第七层协议。旨在用于分布式应用程序中。从这个意义上讲,RSocket是HTTP等其他协议的替代方案。它是一种基于Reactive Streams规范具有异步,背压的双向,多路复用&…

java-语言学习-eclipse安装java汉化包

java的汉化: 1.打开链接:https://www.eclipse.org/babel/ 2.进入网页后,往下翻一点,看到一个download(下图红框所示),点开。 3.进入一个页面后,往下翻一点点,看到有几…

安装Eclipse的中文语言包

安装Eclipse的中文语言包 下载语言包 1、进入网址 http://www.eclipse.org/babel 2、对应版本下载中文语言包 3、替换Eclipse软件安装文件的features、plugins,再次启动加载 4、替换出现The Eclipse executable launcher was unable to locate its companion l…

Eclipse 官方简体中文语言包下载地址及安装方法

转自: http://www.cnblogs.com/yaotong/archive/2011/12/28/2305421.html 打开Eclipse Babel Project 主页: http://www.eclipse.org/babel/downloads.php 根据Eclipse的版本找到相应的插件地址,复制下来。 进入Eclipse,选择Help->Install New Softwa…

Eclipse-中文语言包

Eclipse-中文语言包 效果图 版本使用中文语言包 下载过程 点击如下 打开插件市场 填写链接 填写此链接地址https://download.eclipse.org/technology/babel/update-site/latest/到下图 简体中文选择 简体中文选择 选择允许协议 安装代码提示插件codota 是什么 打开插件市场 搜…

Eclipse汉化 中文语言包下载安装 Babel Language Pack

相关链接 Java & Eclipse & Maven 使用配置方法 Eclipse平台上新建Java项目使用Junit测试 如何在Eclipse平台使用git从GitHub上下载文件至本地及管理本地git项目 Eclipse汉化 中文语言包下载安装 Babel Language Pack 点击进入Eclipse Babel Project 下拉可见 选择与自…

eclipse中文语言包安装(别看网上那些乱七八糟的,我这个最简单)

一、安装好JDK和eclispe。(这个步骤不用多说了) 二、步骤 1、找语言包并下载:https://www.eclipse.org/babel/downloads.php 找到汉化文件下载备用。 2、把下载好的文件复制到 eclipse的dropins文件夹中。 3、启动eclispe,汉化…

Eclipse语言包在官网下载不了-解决方案

可能家里的网络不好,在官网语言包一直出现这个问题,网上找了很久没找到解决方案,应该是家里网络和对方服务器不对付。就发现有下面这个选项,选了nanjing的节点就解决了。

eclipse汉化-设置语言包

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。 一、通过插件的方式进行eclipse的汉化 1、登陆Eclipse Babel Project Downloads | The Eclipse Foundationhttps://ww…

基于遥感影像的道路提取论文、开源代码和数据集汇总

文章目录 前言2017DeepRoadMapperTopology Loss 2018RoadTraceriterative-deep-learning 2019Leveraging Crowdsourced GPS Data for Road Extraction from Aerial ImageryRoadNetRoadTaggerGenerative Graph Transformerroad_connectivityNL-LinkNet: Toward Lighter but More…

遥感影像云检测-云检测数据集信息及下载

常用云检测数据集信息及下载 1.LandSat7云量评估数据集2.LandSat8-Biome生物群落云量评估数据集3.LandSat8-38Cloud数据集4.高分系列-GF1-WHU遥感影像云数据集5.Sentinel-2 Cloud Mask Catalogue5.1.数据介绍5.2.数据集目录编排5.3.统计数据5.4.错误和不确定性 6.CESBIO数据集(…

AI实战营第二期 第七节 《语义分割与MMSegmentation》——笔记8

文章目录 摘要主要特性 案例什么是语义分割应用:无人驾驶汽车应用:人像分割应用:智能遥感应用 : 医疗影像分析 三种分割的区别语义分割的基本思路按颜色分割逐像素份分类全卷积网络 Fully Convolutional Network 2015存在问题 基于多层级特征…

【毕业设计_课程设计】基于 U-Net 网络的遥感图像语义分割(源码+论文)

文章目录 0 项目说明1 研究目的2 研究方法3 研究结论4 论文目录5 项目工程 0 项目说明 **基于 U-Net 网络的遥感图像语义分割 ** 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 实验训练使用 Anaconda 版 Python 3.7 下的 TensorF…