# reactive-rpc-project **Repository Path**: wangjiu7521/reactive-rpc-project ## Basic Information - **Project Name**: reactive-rpc-project - **Description**: 响应式rpc框架 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://gitee.com/wangjiu7521/reactive-rpc-project/blob/master/README.md - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-07-08 - **Last Updated**: 2022-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # reactive-rpc-project ### 介绍 > 一个异步非阻塞,事件驱动的响应式rpc组件 这里的响应式,包括两点,一是高响应,二是支持回压 为了实现快速响应,并更高效的完成开发,本组件底层直接使用netty作为底层依赖,依托于netty的线程模型,可以让客户端的访问得到快速的响应。 而回压,则是订阅者可以根据不同策略主动管理发布者发布的数据(如果发布者发布了大量的数据,而订阅者可能处理不了时), 或是被动的延时请求或暂停请求,比如使用Subscription(响应式编程中的事件的载体),来通知发布者什么时候应当发布多少数据 接触过响应式编程的人应该对Plulisher,Subscriptor,Subscription,Flux,Mono等概念并不陌生, 没错,本组件实现的目的即是可以通过Flux,Mono的API来达到服务间全链路的回压管理, 当然本组件同样支持Future形式以及同步调用的方式(同步调用并不推荐,因为这失去了本组件设计的意义) ### 项目意义 本项目是学习模仿其他各类开源项目,取其亮点加以整合,帮助理解各类开源项目之间的特点而产生。 目前仅作为本人学习实战的项目,不面向生产(本人还没到那个级别)。 ### 项目模块介绍 #### reactive-rpc 响应式rpc的基础模块,所有rpc的底层逻辑都在这里,如果不使用spring,直接使用本模块也是可以的 #### reactive-rpc-spring 在reactive-rpc模块的基础上整合了spring,包含两个注解,@RpcClient,@RpcService,以及ClientBeanPostProcessor和ReactiveServerConfig ClientBeanPostProcessor:负责为消费者将标注了@RpcClient的属性注入Client代理对象,原理模仿@Autowired ReactiveServerConfig:负责启动生产者服务,并将标注了@RpcService的单例Bean注册到服务注册器中,对外暴露服务 #### reactive-rpc-autoconfig 在reactive-rpc-spring的基础上做的进一步封装,做到在springboot项目中能够自动装配,为spring-boot-starter的基础 本模块提供@EnableRpcServer注解,可以将一个服务暴露为RpcServer 本模块的一个特色功能是可以让一个服务以RpcServer作为服务唯一的容器,替换掉springboot本身的web容器,使用方式是 @EnableRpcServer(mainServer=true),将mainServer设置成true,当然,也可以和原本的web容器共存,只要保证端口不冲突就行 #### reactive-rpc-spring-boot-starter 对reactive-rpc-autoconfig的引用,将reactive-rpc-autoconfig封装成一个符合spring-boot-starter标准的组件库 #### webflux 本模块是写了一个webflux的例子,为了与本项目做对比,用来证明webflux提供的 WebClient 工具不支持回压,而本项目能做到。 #### interfaces 本模块作为消费者与生产者的共同依赖,提供了几个测试的接口,表示生产者需要生产的服务,与消费者将要消费的服务 #### consume,product 消费者与生产者的示例模块,以最原生的方式使用 reactive-rpc 组件,依赖的reactive-rpc模块, #### consume-spring,product-spring 使用spring-boot方式构建的消费者与生产者的示例模块,以自动装配的方式使用 reactive-rpc 组件,依赖的 reactive-rpc-spring-boot-starter 模块 ### 软件架构 #### 底层依赖 netty,reactor,spring, #### 协议 自定义协议:RpcRequest 和 RpcReponse #### 序列化方式 protostuff ### 特点 1. 服务消费者与服务提供者之间的多个请求可以共用同一个socket连接(连接复用,即多个线程复用一个连接),这依靠于消费者在每次调用时都产生一个唯一的requestId, 所以即使多次调用使用同一个连接,这也依然可控,这种实现方式除了是为了连接复用外,对于需要授权的请求,这也是很有必要的,因为多次请求可能并不需要多次授权。 2. 如介绍所言,本组件支持Flux,Mono的使用方式(这也是推荐的方式),并通过Subscription来主动控制服务提供者何时生产多少数据, 如果将本组件与WebFlux进行对比的话,那么,webflux目前还并不支持通过Subscription来控制跨服务的数据产生方式,示例在webflux模块。 3. 本组件是面向接口调用,并且设计为仅支持面向接口调用,如果将本组件与dubbo进行对比的话,的确存在许多共同之处,比如使用方式上, 并且未来本组件的完善,主要参考目标也是dubbo,但这并不意味着功能的复制,本组件并不打算做到像dubbo一样复杂, 也并不认为本组件需要去支持不面向接口也能调用服务的功能,以及需要去支持http协议和集成像tomcat,jetty这样的框架, 因为本组件的开发目前仅作为个人学习实战的项目,所以小巧可用才是本组件的设计初衷。 4. 本组件使用自定义协议,序列化方式采用protostuff,使得数据的传输更加高效。 ### 使用说明 1. 服务提供者直接使用:只要导入reactive-rpc包,服务提供者构建一个ServerConfigration和RpcServer即可使用, 并且需要手动构建服务注册器ServerRegister,手动进行服务的注册。 2. 服务消费者直接使用:构建ClientConfigration, 并通过RpcUtil.getRpcInstance(Class interfaceClass, ServiceConfig config,ClientConfiguration configuration)获取服务调用实例。 示例在consume模块。 3. 服务提供者集成spring使用(spring-boot-starter):只要在配置启动类上添加@EnableRpcServer即可使用,并在服务的服务实例类上添加@RpcService注解即可。 另外可以通过指定@EnableRpcServer 的参数mainApplication =true,将rpcServer作为web容器,这样就不需要引入其他的容器了。 示例在product-spring模块。 4. 服务消费者集成spring使用(spring-boot-starter):构建一个ServerAddrList的单例bean,并在需要作为rpcClient的属性上标注@RpcClient注解即可使用,示例在consume-spring模块。 (不能与@Autowired混用) ### TODO 1. 注册中心,redis,zk,nacos 2. 负载均衡 3. 容错,降级,重试 4. 链路监控 5. 分布式事务