分佈式服務框架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.

捐贈

不管金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈

相關文章
相關標籤/搜索