分布式服务框架XXL-RPC

《分布式服务框架XXL-RPC》

Actions Status Maven Central GitHub release License donate

1、简介

1.1 概述

XXL-RPC 是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能。拥有"高性能、分布式、注册中心、负载均衡、服务治理"等特性。现已开放源代码,开箱即用。javascript

1.2 特性

  • 一、快速接入:接入步骤很是简洁,两分钟便可上手;
  • 二、服务透明:系统完整的封装了底层通讯细节,开发时调用远程服务就像调用本地服务,在提供远程调用能力时不损失本地调用的语义简洁性;
  • 三、多调用方案:支持 SYNC、ONEWAY、FUTURE、CALLBACK 等方案;
  • 四、多通信方案:支持 TCP 和 HTTP 两种通信方式进行服务调用;
  • 五、多序列化方案:支持 HESSIAN、HESSIAN1 等方案;
  • 六、负载均衡/软负载:提供丰富的负载均衡策略,包括:轮询、随机、LRU、LFU、一致性HASH等;
  • 七、注册中心:可选组件,支持服务注册并动态发现(内置“XXL-REGISTRY 轻量级注册中心”(推荐)、“Local注册中心”等);可选择不启用,直接指定服务提供方机器地址通信;
  • 八、服务治理:提供服务治理中心,可在线管理注册的服务信息,如服务锁定、禁用等;
  • 九、服务监控:可在线监控服务调用统计信息以及服务健康情况等(计划中);
  • 十、容错:服务提供方集群注册时,某个服务节点不可用时将会自动摘除,同时消费方将会移除失效节点将流量分发到其他节点,提升系统容错能力。
  • 十一、解决1+1问题:传统分布式通信通常经过nginx或f5作集群服务的流量负载均衡,每次请求在到达目标服务机器以前都须要通过负载均衡机器,即1+1,这将会把流量放大一倍。而XXL-RPC将会从消费方直达服务提供方,每次请求直达目标机器,从而能够避免上述问题;
  • 十二、高兼容性:得益于优良的兼容性与模块化设计,不限制外部框架;除 spring/springboot 环境以外,理论上支持运行在任何Java代码中,甚至main方法直接启动运行;
  • 1三、泛化调用:服务调用方不依赖服务方提供的API;

1.3 背景

RPC(Remote Procedure Call Protocol,远程过程调用),调用远程服务就像调用本地服务,在提供远程调用能力时不损失本地调用的语义简洁性;css

通常公司,尤为是大型互联网公司内部系统由上千上万个服务组成,不一样的服务部署在不一样机器,跑在不一样的JVM上,此时须要解决两个问题:html

  • 一、若是我须要依赖别人的服务,可是别人的服务在远程机器上,我该如何调用?
  • 二、若是其余团队须要使用个人服务,我该怎样发布本身的服务供他人调用?

“XXL-RPC”能够高效的解决这个问题:java

  • 一、如何调用:只须要知晓远程服务的stub和地址,便可方便的调用远程服务,同时调用透明化,就像调用本地服务同样简单;
  • 二、如何发布:只须要提供本身服务的stub和地址,别人便可方便的调用个人服务,在开启注册中心的状况下服务动态发现,只须要提供服务的stub便可;

1.4 下载

文档地址

源码仓库地址

源码仓库地址 Release Download
https://github.com/xuxueli/xxl-rpc Download
https://gitee.com/xuxueli0323/xxl-rpc Download

技术交流

1.5 环境

  • Maven3+
  • Jdk1.7+
  • Tomcat7+

2、快速入门(springboot版本)

2.1 准备工做

  • 一、编译项目nginx

    源码目录介绍:git

    • /doc
    • /xxl-rpc-core :核心依赖;
    • /xxl-rpc-samples :示例项目;
      • /xxl-rpc-sample-frameless :无框架版本示例;
      • /xxl-rpc-sample-springboot :springboot版本示例;
        • /xxl-rpc-sample-springboot-api :公共API接口
        • /xxl-rpc-sample-springboot-client :服务消费方 invoker 调用示例;
        • /xxl-rpc-sample-springboot-server :服务提供方 provider 示例;
      • / xxl-rpc-sample-jfinal :jfinal版本示例;

2.2 配置部署 “分布式服务注册中心XXL-REGISTRY”

推荐使用 "XXL-REGISTRY" 做为注册中心。可前往 XXL-REGISTRY (https://github.com/xuxueli/xxl-registry ) 查看部署文档。很是轻量级,一分钟可完成部署工做。github

2.3 项目中使用XXL-RPC

以示例项目 “xxl-rpc-sample-springboot” 为例讲解;算法

2.3.1 开发“服务API”

开发RPC服务的 “接口 / interface” 和 “数据模型 / DTO”;spring

可参考以下代码:
com.xxl.rpc.sample.api.DemoService com.xxl.rpc.sample.api.dto.UserDTO 

2.3.2 配置开发“服务提供方”

  • 一、配置 “maven依赖”:

需引入:XXL-RPC核心依赖 + 公共API接口依赖docker

<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-rpc-core</artifactId> <version>${parent.version}</version> </dependency> 
  • 二、配置“服务提供方 ProviderFactory”
// 参考代码位置:com.xxl.rpc.sample.server.conf.XxlRpcProviderConfig @Bean public XxlRpcSpringProviderFactory xxlRpcSpringProviderFactory() { XxlRpcSpringProviderFactory providerFactory = new XxlRpcSpringProviderFactory(); providerFactory.setPort(port); providerFactory.setServiceRegistryClass(XxlRegistryServiceRegistry.class); providerFactory.setServiceRegistryParam(new HashMap<String, String>(){{ put(XxlRegistryServiceRegistry.XXL_REGISTRY_ADDRESS, address); put(XxlRegistryServiceRegistry.ENV, env); }}); logger.info(">>>>>>>>>>> xxl-rpc provider config init finish."); return providerFactory; } 
ProviderFactory 参数 说明
netType 服务通信方案,可选范围:NETTY(默认)、NETTY_HTTP ;
serialize 序列化方案,可选范围: HESSIAN(默认)、HESSIAN1 ;
ip 服务方IP,为空自动获取机器IP,支持手动指定
port 服务方端口,默认 7080
accessToken 服务鉴权Token,非空时生效;
serviceRegistryClass 服务注册中心,可选范围:LocalServiceRegistry.class、ZkServiceRegistry.class;支持灵活自由扩展;
serviceRegistryParam 服务注册中心启动参数,参数说明可参考各注册中心实现的 start() 的方法注释;
  • 三、开发“服务实现类”

实现 “服务API” 的接口,开发业务逻辑代码;

可参考以下代码:
com.xxl.rpc.sample.api.DemoService 注意: 一、添加 “@Service” 注解:被Spring容器扫描识别为SpringBean; 二、添加 “@XxlRpcService” 注解:被 “XXL-RPC” 的 ProviderFactory 扫描识别,进行Provider服务注册,若是开启注册中心同时也会进行注册中心服务注册; 
“@XxlRpcService” 注解参数 说明
version 服务版本,默认空;可据此区分同一个“服务API” 的不一样版本;

2.3.3 配置开发“服务消费方”

  • 一、配置 “maven依赖”:

需引入:XXL-RPC核心依赖 + 公共API接口依赖

<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-rpc-core</artifactId> <version>${parent.version}</version> </dependency> 
  • 二、配置“服务消费方 InvokerFactory”
// 参考代码位置:com.xxl.rpc.sample.client.conf.XxlRpcInvokerConfig @Bean public XxlRpcSpringInvokerFactory xxlJobExecutor() { XxlRpcSpringInvokerFactory invokerFactory = new XxlRpcSpringInvokerFactory(); invokerFactory.setServiceRegistryClass(XxlRegistryServiceRegistry.class); invokerFactory.setServiceRegistryParam(new HashMap<String, String>(){{ put(XxlRegistryServiceRegistry.XXL_REGISTRY_ADDRESS, address); put(XxlRegistryServiceRegistry.ENV, env); }}); logger.info(">>>>>>>>>>> xxl-rpc invoker config init finish."); return invokerFactory; } 
InvokerFactory 参数 说明
serviceRegistryClass 服务注册中心,可选范围:LocalServiceRegistry.class、ZkServiceRegistry.class;支持灵活自由扩展;
serviceRegistryParam 服务注册中心启动参数,参数说明可参考各注册中心实现的 start() 的方法注释;
  • 三、注入并实用远程服务
// 参考代码位置:com.xxl.rpc.sample.client.controller.IndexController @XxlRpcReference private DemoService demoService; …… UserDTO user = demoService.sayHi(name); …… 
“@XxlRpcReference” 注解参数 说明
netType 服务通信方案,可选范围:NETTY(默认)、NETTY_HTTP;
serializer 序列化方案,可选范围: HESSIAN(默认)、HESSIAN1;
address 服务远程地址,ip:port 格式;选填;非空时将会优先实用该服务地址,为空时会从注册中心服务地址发现;
accessToken 服务鉴权Token,非空时生效;
version 服务版本,默认空;可据此区分同一个“服务API” 的不一样版本;
timeout 服务超时时间,单位毫秒;
callType 请求类型,可选范围:SYNC(默认)、ONEWAY、FUTURE、CALLBACK;

2.3.4 测试

// 参考代码位置:com.xxl.rpc.sample.client.controller.IndexController 

代码中将上面配置的消费方 invoker 远程服务注入到测试 Controller 中使用,调用该服务,查看看是否正常。 若是正常,说明该接口项目经过XXL-RPC从 client 项目调用了 server 项目中的服务,夸JVM进行了一次RPC通信。

访问该Controller地址便可进行测试:http://127.0.0.1:8081/?name=jack

3、快速入门(frameless 无框架版本)

得益于优良的兼容性与模块化设计,不限制外部框架;除 spring/springboot 环境以外,理论上支持运行在任何Java代码中,甚至main方法直接启动运行;

以示例项目 “xxl-rpc-sample-frameless” 为例讲解;该示例项目以直连IP方式进行演示,也能够选择接入注册中心方式使用,如接入 XXL-REGISTRY。

3.1 API方式建立“服务提供者”:

// 参考代码位置:com.xxl.rpc.sample.server.XxlRpcServerApplication // init XxlRpcProviderFactory providerFactory = new XxlRpcProviderFactory(); providerFactory.initConfig(NetEnum.NETTY, Serializer.SerializeEnum.HESSIAN.getSerializer(), -1, -1, null, 7080, null, null, null); // add services providerFactory.addService(DemoService.class.getName(), null, new DemoServiceImpl()); // start providerFactory.start(); while (!Thread.currentThread().isInterrupted()) { TimeUnit.HOURS.sleep(1); } // stop providerFactory.stop(); 

3.2 API方式建立“服务消费者”:

// 参考代码位置:com.xxl.rpc.sample.client.XxlRpcClientAplication // init client DemoService demoService = (DemoService) new XxlRpcReferenceBean(NetEnum.NETTY, Serializer.SerializeEnum.HESSIAN.getSerializer(), CallType.SYNC, DemoService.class, null, 500, "127.0.0.1:7080", null, null).getObject(); // test UserDTO userDTO = demoService.sayHi("[SYNC]jack"); System.out.println(userDTO); 

4、系统设计

4.1 系统架构图

输入图片说明

4.2 核心思想

提供稳定高性能的RPC远程服务调用功能,简化分布式服务通信开发。

4.3 角色构成

  • 一、provider:服务提供方;
  • 二、invoker:服务消费方;
  • 三、serializer: 序列化模块;
  • 四、remoting:服务通信模块;
  • 五、registry:服务注册中心;
  • 六、admin:服务治理、监控中心:管理服务节点信息,统计服务调用次数、QPS和健康状况;(非必选,暂未整理发布...)

4.4 RPC工做原理剖析

输入图片说明

概念:

  • 一、serialization:序列化,通信数据须要通过序列化,从而支持在网络中传输;
  • 二、deserialization:反序列化,服务接受到序列化的请求数据,须要序列化为底层原始数据;
  • 三、stub:体如今XXL-RPC为服务的api接口;
  • 四、skeleton:体如今XXL-RPC为服务的实现api接口的具体服务;
  • 五、proxy:根据远程服务的stub生成的代理服务,对开发人员透明;
  • 六、provider:远程服务的提供方;
  • 七、consumer:远程服务的消费方;

RPC通信,可大体划分为四个步骤,可参考上图进行理解:(XXL-RPC提供了多种调用方案,此处以 “SYNC” 方案为例讲解;)

  • 一、consumer发起请求:consumer会根据远程服务的stub实例化远程服务的代理服务,在发起请求时,代理服务会封装本次请求相关底层数据,如服务iface、methos、params等等,而后将数据通过serialization以后发送给provider;
  • 二、provider接收请求:provider接收到请求数据,首先会deserialization获取原始请求数据,而后根据stub匹配目标服务并调用;
  • 三、provider响应请求:provider在调用目标服务后,封装服务返回数据并进行serialization,而后把数据传输给consumer;
  • 四、consumer接收响应:consumer接受到相应数据后,首先会deserialization获取原始数据,而后根据stub生成调用返回结果,返回给请求调用处。结束。

4.5 TCP通信模型

输入图片说明

consumer和provider采用NIO方式通信,其中TCP通信方案可选NETTY具体选型,高吞吐高并发;可是仅仅依靠单个TCP链接进行数据传输存在瓶颈和风险,所以XXL-RPC在consumer端自身实现了内部链接池,consumer和provider之间为了一个链接池,当尽情底层通信是会取出一条TCP链接进行通信(可参考上图)。

4.6 sync-over-async

输入图片说明

XXL-RPC采用NIO进行底层通信,可是NIO是异步通信模型,调用线程并不会阻塞获取调用结果,所以,XXL-RPC实现了在异步通信模型上的同步调用,即“sync-over-async”,实现原理以下,可参考上图进行理解:

  • 一、每次请求会生成一个惟一的RequestId和一个RpcResponse,托管到请求池中。
  • 二、调度线程,执行RpcResponse的get方法阻塞获取本次请求结果;
  • 三、而后,底层经过NIO方式发起调用,provider异步响应请求结果,而后根据RequestId寻找到本次调用的RpcResponse,设置响应结果后唤醒调度线程。
  • 四、调度线程被唤醒,返回异步响应的请求数据。

4.7 注册中心

XXL-RPC的注册中心,是可选组件,支持服务注册并动态发现;

可选择不启用,直接指定服务提供方机器地址通信;

选择启用时,内置可选方案:“XXL-REGISTRY 轻量级注册中心”(推荐)、“ZK注册中心”、“Local注册中心”等;

a、XXL-REGISTRY 轻量级注册中心(推荐)

推荐使用内置的 "XXL-REGISTRY" 做为注册中心。可前往 XXL-REGISTRY (https://github.com/xuxueli/xxl-registry ) 查看部署文档。很是轻量级,一分钟可完成部署工做。

更易于集群部署、横向扩展,搭建与学习成本更低,推荐采用该方式;

b、ZK注册中心

内置“ZK注册中心”,可选组件,结构图以下:

输入图片说明

原理:
XXL-RPC中每一个服务在zookeeper中对应一个节点,如图"iface name"节点,该服务的每个provider机器对应"iface name"节点下的一个子节点,如图中"192.168.0.1:9999"、"192.168.0.2:9999"和"192.168.0.3:9999",子节点类型为zookeeper的EPHMERAL类型,该类型节点有个特色,当机器和zookeeper集群断掉链接后节点将会被移除。consumer底层能够从zookeeper获取到可提供服务的provider集群地址列表,从而能够向其中一个机器发起RPC调用。

4.8 在线服务目录

服务提供方新增 "/services" 服务目录功能,可查看在线服务列表;暂时仅针对NETTY_HTTP通信方案,浏览器访问地址 "{端口地址}/services" 便可。

4.9 如何切换“通信方案”选型

XXL-RPC提供多中通信方案:支持 TCP 和 HTTP 两种通信方式进行服务调用;其中 TCP 提供可选方案 NETTY ,HTTP 提供可选方案 NETTY_HTTP (新版本移除了Mina和Jetty通信方案,主推Netty;若是有须要能够参考旧版本;);

若是须要切换XXL-RPC“通信方案”,只须要执行如下两个步骤便可:

  • a、引入通信依赖包,排除掉其余方案依赖,各方案依赖以下:
    • NETTY:依赖 netty-all ;
    • NETTY_HTTP:依赖 netty-all ;
  • b、修改通信枚举,须要同时在“服务方”与“消费方”两端一同修改,通信枚举属性代码位置以下:
    • 服务工厂 "XxlRpcSpringProviderFactory.netType" :可参考springboot示例组件初始化代码;
    • 服务引用注解 "XxlRpcReference.netType" | 服务Bean对象 "XxlRpcReferenceBean.netType" :可参考springboot示例组件初始化代码;

4.9 如何切换“注册中心”选型

XXL-RPC的注册中心,是一个可选组件,不强制依赖;支持服务注册并动态发现;
可选择不启用,直接指定服务提供方机器地址通信;
选择启用时,原生提供多种开箱即用的注册中心可选方案,包括:“XXL-RPC原生轻量级注册中心”、“ZK注册中心”、“Local注册中心”等;

若是须要切换XXL-RPC“注册中心”,只须要执行如下两个步骤便可:

  • a、引入注册注册中心依赖包,排除掉其余方案依赖,各方案依赖以下:
    • XXL-RPC原生轻量级注册中心:轻量级、无第三方依赖;
    • ZK注册中心:依赖 zookeeper
    • Local注册中心:轻量级、零依赖;
  • b、修改注册中心配置,须要同时在“服务方”与“消费方”两端一同修改,代码位置以下:
    • XxlRpcSpringProviderFactory.serviceRegistryClass:注册中心实现类,可选:XxlRegistryServiceRegistry.class、LocalServiceRegistry.class、ZkServiceRegistry.class
    • XxlRpcSpringProviderFactory.serviceRegistryParam:注册中心启动参数,各类注册中心启动参数不一样,可参考其 start 方案了解;

4.10 泛化调用

XXL-RPC 提供 "泛华调用" 支持,服务调用方不依赖服务方提供的API;泛化调用一般用于框架集成,好比 "网关平台、跨语言调用、测试平台" 等; 开启 "泛华调用" 时服务方不须要作任何调整,仅须要调用方初始化一个泛华调用服务Reference ("XxlRpcGenericService") 便可。

“XxlRpcGenericService#invoke” 请求参数 说明
String iface 服务接口类名
String version 服务版本
String method 服务方法
String[] parameterTypes 服务方法形参-类型,如 "int、java.lang.Integer、java.util.List、java.util.Map ..."
Object[] args 服务方法形参-数据
// 服务Reference初始化-注解方式示例 @XxlRpcReference private XxlRpcGenericService genericService; // 服务Reference初始化-API方式示例 XxlRpcGenericService genericService = (XxlRpcGenericService) new XxlRpcReferenceBean(……).getObject(); // 调用方示例 Object result = genericService.invoke( "com.xxl.rpc.sample.server.service.Demo2Service", null, "sum", new String[]{"int", "int"}, new Object[]{1, 2} ); // 服务方示例 public class Demo2ServiceImpl implements Demo2Service { @Override public int sum(int a, int b) { return a + b; } } 

5、版本更新日志

5.1 版本 v1.1 新特性

  • 一、快速接入:接入步骤很是简洁,两分钟便可上手;
  • 二、服务透明:系统完整的封装了底层通讯细节,开发时调用远程服务就像调用本地服务,在提供远程调用能力时不损失本地调用的语义简洁性;
  • 三、注册中心(可选):支持使用zookeeper做为服务注册中心,服务注册并动态发现。同时,也能够不使用注册中心,直接指定服务提供方机器地址进行RPC通信;
  • 四、软负载均衡及容错:服务提供方集群注册时,在使用软负载算法进行流量分发;
  • 五、容错:服务提供方集群注册时,某个服务节点不可用时将会自动摘除,同时消费方将会移除失效节点将流量分发到其他节点,提升系统容错能力。
  • 六、TCP/HTTP通信:支持TCP和HTTP两种通信方式进行服务调用,其中TCP通信能够执行NETTY或MINA做为可选通信方案,以提供高效的服务通信支持;
  • 七、序列化:支持hessian、protobuf和jackson等多种序列化方案;
  • 八、服务治理:提供服务治理中心,可在线管理注册的服务信息,如管理服务节点、节点权重等;(部分实现)
  • 九、服务监控:可在线监控服务调用统计信息以及服务健康情况等(计划中);
  • 十、解决1+1问题:传统分布式通信通常经过nginx或f5作集群服务的流量负载均衡,如hessian,每次请求在到达目标服务机器以前都须要通过负载均衡机器,即1+1,这将会把流量放大一倍。而XXL-RPC将会从消费方至服务提供方创建TCP长链接,每次请求直达目标机器,从而能够避免上述问题;

5.2 版本 v1.2.0 [2018-10-26]

  • 一、核心模块重度重构:模块化划分、包名重构;
  • 二、轻量级/模块化改造:移除对具体组件的依赖,如ZK、Netty、Mina等,改成可选扩展方式;
  • 三、支持多种请求方式,如:SYNC、ONEWAY、FUTURE、CALLBACK 等;
  • 四、各模块扩展改成非强制依赖:扩展依赖须要单独进行 maven 引入(provided类型);提供强制依赖最小精简选型组合 "jetty + hessian + 无注册中心";
  • 五、服务AccessToken鉴权;
  • 六、支持HTTP异步请求,线程优化,统一通信流程;
  • 七、可选ZK注册中心重构,不依赖配置文件,经过代码初始化;
  • 八、可选ZK注册中心初始化逻辑优化,避免并发初始化,阻塞至TCP链接建立成功才容许后续操做;
  • 九、推送core到maven中央仓库;
  • 十、服务注册逻辑优化,旧方案以 "iface" 接口包名进行服务注册, 改成结合 "iface + version" 做为 serviceKey 进行注册,便于接口多服务复用;

5.3 版本 v1.2.1 Release Notes[2018-11-09]

  • 一、内置注册中心选择ZK时逻辑优化,ZK初始化时unlock逻辑调整,优化断线重连特性;
  • 二、除了springboot类型示例;新增无框架示例项目 "xxl-rpc-sample-frameless"。不依赖第三方框架,只需main方法便可启动运行;
  • 三、选型http通信方式时,校验为IP端口格式地址则主动添加地址前缀;
  • 四、RPC异步请求逻辑优化,请求异常时主动通知Client端,避免无效等待时间;
  • 五、http通信方式选型jetty时,线程池升级为QueuedThreadPool,修复jetty9.4版本server自动销毁问题;
  • 六、Server新增 "/services" 目录功能,可查看在线服务列表;

5.4 版本 v1.2.2 Release Notes[2018-11-26]

  • 一、默认通信方案切换为 Netty,可选方案依赖均调整为 provided 类型;提供强制依赖最小精简选型组合 "netty + hessian + 无注册中心(推荐采用:XXL-RPC原生注册中心)";
  • 二、XXL-RPC原生注册中心:底层抽象注册中心模块,并原生提供自研基于DB的注册中心,真正实现开箱即用,更轻量级、下降第三方依赖;至今XXL-RPC以提供三种注册中心具体实现:"XXL-RPC原生注册中心方案","ZK方案","Local方案";其中"XXL-RPC原生注册中心方案"特性以下:
    • 轻量级:基于DB与磁盘文件,只须要提供一个DB实例便可,无第三方依赖;
    • 实时性:借助内部广播机制,新服务上线、下线,能够在1s内推送给客户端;
    • 数据同步:注册中心内部10s会全量同步一次磁盘数据,清理无效服务,确保服务数据实时可用;
    • 性能:服务发现时仅读磁盘文件,性能很是高;服务注册、摘除时经过磁盘文件校验,防止重复注册操做;
    • 扩展性:可方便、快速的横向扩展,只需保证 "注册中心" 配置一致便可,可借助负载均衡组件如Nginx快速集群部署;
    • 多状态:服务内置三种状态:正常状态=支持动态注册、发现,服务注册信息实时更新;锁定状态=人工维护注册信息,服务注册信息固定不变;禁用状态=禁止使用,服务注册信息固定为空;
    • 跨语言:注册中心提供HTTP接口供客户端实用,语言无关,通用性更强;
    • 兼容性:“XXL-RPC原生轻量级注册中心”虽然为XXL-RPC设计,可是不限于XXL-RPC使用。兼容支持任何服务框架服务注册实用,如dubbo、springboot等;
    • 容器化:提供官方docker镜像,并实时更新推送dockerhub,进一步实现"XXL-RPC原生注册中心方案"产品开箱即用;
  • 三、XXL-RPC客户端适配"XXL-RPC原生注册中心",可快速接入,只须要切换注册中心实现为 "NativeServiceRegistry" 便可,文档由专门章节介绍;
  • 四、注册中心启动参数位置调整,与注册中心实现关联;
  • 五、服务提供者参数优化,IP为空时原生动态获取,核心参数启动时加强校验;
  • 六、注册模块API优化,改成批量模式进一步提高性能;
  • 七、文档加强,注册中心配置切换、通信方案配置切换说明;
  • 八、IP工具类优化,兼容 Inet6Address 格式地址;
  • 九、Netty销毁逻辑优化;
  • 十、扩展第三方注册中心ZK底层逻辑优化,避免旧注册信息没法清理的问题;

5.5 版本 v1.3.0 Release Notes[2018-12-02]

  • 一、原生注册中心拆分为独立项目 "xxl-registry"(https://github.com/xuxueli/xxl-registry ),提供服务注册restful服务,并提送响应client端依赖用于简化接入难度;
  • 二、NativeServiceRegistry 改名为 XxlRegistryServiceRegistry;
  • 三、POM依赖升级,冗余POM清理;
  • 四、代码优化:XxlRpcInvokerFactory 移除 static 代码块及相关组件,进一步实现组件无状态;
  • 五、服务注册逻辑优化,避免地址重复生成;

5.6 版本 v1.3.1 Release Notes[2018-12-21]

  • 一、负载均衡/软负载:提供丰富的负载均衡策略,包括:轮询、随机、LRU、LFU、一致性HASH等;
  • 二、服务发现注册逻辑优化:支持批量注册、摘除,升级 xxl-registry 至 v1.0.1;
  • 三、新增jfinal类型示例项目 "xxl-rpc-sample-jfinal" 支持jfinal项目快速接入分布式RPC服务功能;高兼容性,原则上支持任务框架,甚至main方法直接运行;
  • 四、TCP通信方案Server端Channel线程优化(线程参数=60/300/1000),避免IO线程阻塞于业务;
  • 五、TCP通信方案Client端Channel线程优化(线程参数=10/100/1000),避免IO线程阻塞于callback业务;
  • 六、TCP通信方案Client初始化逻辑优化;
  • 七、TCP长连销毁逻辑优化;
  • 八、底层Log整理,RPC报错时打印完整Log,包括请求地址,请求参数等;
  • 九、Server端销毁逻辑优化;
  • 十、static代码块优化,进行组件无状态优化:response factory等;迁移到invoke factory上来;
  • 十一、升级多项pom依赖至较新稳定版本;

5.7 版本 v1.3.2 Release Notes[2019-02-21]

  • 一、泛化调用:服务调用方不依赖服务方提供的API;
  • 二、新增通信方案 "NETTY_HTTP";
  • 三、新增序列化方案 "KRYO";
  • 四、通信效率优化:TCP链接池取消,改成单一长链接,移除commons-pool2依赖;
  • 五、RPC请求路由时空地址处理优化;
  • 六、通信链接池address参数优化,出IP:PORT格式外兼容支持常规URL格式地址;
  • 七、线程名称优化,便于适配监控快速进行线程定位;

5.8 版本 v1.4.0 Release Notes[2019-04-20]

  • 一、LRU路由更新不及时问题修复;
  • 二、JettyClient Buffer 默认长度调整为5M;
  • 三、Netty Http客户端配置优化;
  • 四、升级依赖版本,如netty/mina/spring等

5.9 版本 v1.4.1 Release Notes[2019-05-23]

  • 一、客户端长连优化,修复初始化时服务不可用致使长连冗余建立的问题;
  • 二、升级依赖版本,如netty/mina/jetty/jackson/spring/spring-boot等;
  • 三、空闲连接自动回收:服务端与客户端主动检测空闲连接并回收,及时释放相关资源(netty、mina);空闲超10min自动释放;

5.10 版本 v1.4.2 Release Notes[2019-11-18]

  • 一、长连心跳保活:客户端周期性发送心跳请求给服务端保活;服务端连续三次未收到心跳时,销毁链接;
  • 二、服务线程优化,支持自定义线程参数;
  • 三、API重构:初始化枚举改成接口实例,方便扩展;
  • 四、代码优化,ConcurrentHashMap变量类型改成ConcurrentMap,避免因不一样版本实现不一样致使的兼容性问题;
  • 五、Netty Http客户端优化,识别并过滤非法响应数据;
  • 六、通信方案收敛:主推Netty和Netty_Http,移除Mina和Jetty内置扩展,若有需求自行扩展维护;
  • 七、序列化方案收敛:主推HESSIAN和HESSIAN1,移除protostuff、KRYO、JACKSON内置扩展,若有需求自行扩展维护;
  • 八、升级依赖版本,如netty/mina/hessian/jackson/zookeeper等;

5.11 版本 v1.5.0 Release Notes[迭代中]

TODO

  • 提升系统可用性,以部分功能暂时不可达为代价,防止服务总体缓慢或雪崩
    • 限流=防止负载太高,致使服务雪崩;client、server,双向限流;方法级,QPS限流;在途请求数,流控依据;
    • 降级=10s内超阈值(异常、超时);拒绝服务、默认值;
      • 超过(熔断模式):99.9% 返回默认值,0.1%真实请求;
      • 未超过:熔断模式下,每 10s 增长 10% 的流量,直至恢复;
    • 服务隔离:超时较多的请求,自动路由到 “慢线程池” ,避免占用公共线程池;
    • 预热控制,刚启动的节点,只会分配比较少的请求;逐步增大,直至平均。帮助新节点启动;
  • 支持HTTP异步响应,至此底层remoting层通信全异步化;
  • zk注册中心初始化时取消对集群状态强依赖,底层异常时循环检测;
  • Server启动失败时,ZK销毁中断问题修复,偶发;
  • 服务提供者iface获取方式优化,兼容代理方式获取接口 “getProxiedInterfaces”;
  • 演进计划:
    • 通信:remoting模块;TCP、HTTP、HTTP2可选方案;
    • 限流:ratelimit模块;滑动窗口方式,单机限流,请求/响应方双向限流;[ING]
    • 网关:servlet3 + 泛华调用模块;计划:基于DB轻量级注册中心,服务动态发现,自动转发;
  • admin-服务监控(《xxl-trace》):
    • tps,99线;
    • 成功率;
    • 调用链:
  • rpc filter:方便埋点、监控等;
  • 服务治理实现,服务调用量,成功率,1min上报一次;
  • static代码块移除,进行组件无状态优化,jetty/pool/等;
  • 接入方配置方式优化,provider与invoker配置合并至新组建;
  • 新增 appname 属性,为后续服务 trace 作准备;
  • 新增 nutz 类型示例项目;
  • Server/Client失败尽可能响应,避免等到到timeout;
  • 线程隔离:通信线程池拆分为Fast/Slow两个,针对响应较慢服务方法请求,降级使用Slow线程池;考虑是否能够方法级隔离线程池,避免线程阻塞;
  • rpc时钟参数仅记录,取消时钟校验逻辑;
  • 调用链追踪,监控;结合 xxl-apm 与 xxl-rpc filter共同演进;
  • 限流-熔断-降级,结合xxl-registry与xxl-rpc filter共同演进;
  • [ING]"ConnectClient#clientLock" 优化,复用链接对象;
  • 长连心跳、断线重连、空闲链接回收;

6、其余

6.1 项目贡献

欢迎参与项目贡献!好比提交PR修复一个bug,或者新建 Issue 讨论新特性或者变动。

6.2 用户接入登记

更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。

6.3 开源协议和版权

产品开源免费,而且将持续提供免费的社区技术支持。我的或企业内部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐赠

不管金额多少都足够表达您这份心意,很是感谢 :) 前往捐赠

相关文章
相关标签/搜索