Java輕量級分布式RPC框架:lindzh RPC

jopen 9年前發布 | 18K 次閱讀 WEB服務/RPC/SOA lindzh RPC

輕量級分部署服務調度框架的基本原理是服務提供方Provider提供rpc服務,同時把ip和端口以及發布的rpc服務注冊到注冊中心,客戶端或者 rpc消費者從注冊中心獲取服務Provider列表,同時獲取Provider提供的服務列表。另外客戶端還會監聽注冊中心的數據變化,獲知 server宕機或者服務不可用,將該Provider從客戶端Provider緩存列表中剔除,方便做容錯和負載均衡。

基本原理

Alt text

特性

一、  負載均衡
提供基于RoundRobin和隨機方式的負載均衡
二、  高可用
Consumer會從注冊中心獲取到服務列表及該服務的提供者列表,如果某個提供者Provider網絡異常或者宕機,
Consumer能馬上感知到,加入不可用列表,如果從注冊中心收到服務不可用會剔除緩存,不可用列表會重新嘗試發起
連接,如果網絡正常了會立即恢復。
三、  泛型
一般的rpc調用需要拿到服務提供方的業務api(interface class,入參class,返回值class打包到一個jar中,
依賴該jar),如果使用泛型,只需要填寫interface的name,版本,方法名稱,參數名稱,參數值,如果是對象,
將對象字段封裝到一個Map中即可,無需依賴任何業務jar即可完成rpc調用。
四、  Rpc上下文附件
Rpc調用方可以將需要傳遞的上下文信息填寫到上下文中,而不是作為rpc的入參,這樣Provider可以從上下文中獲取
到掉用方的上下文信息。
五、  高可用注冊中心
Rpc 框架提供了zookeeper,etcd,redis pubsub(支持單個,或者sentinel集群模式)的注冊中心,具備高可
用功能。
六、  實時動態監控
Provider提供了監控的api,監控可以使用該api加入到項目或者公司的監控平臺。
七、  內存使用少
Rpc使用的內存模型是tcp連接建立后自動分配一塊內存,讀和寫都在該內存中,不需要為每次請求分配內存,同一個
tcp內存復用,數據使用了壓縮的方式保存和發送,不支持返回數據量超大的調用(壓縮后超過1m)。

整體架構

Alt text

泛型:GenericService,Consumer不依賴Provider的api jar包即可完成remote api調用
監控:StatMonitor,consumer注冊需要的遠程服務StatMonitor,調用rpc獲取監控數據
Webui:一個可視化rpc管理界面,https://github.com/lindzh/rpc-webui
RPC調用:使用jdk proxy封裝發送tcp數據,并等待數據返回,完成RPC調用。
負載均衡:在集群模式下,同一個版本的Rpc服務在多臺服務器上部署,Consumer發起rpc調用使用負載均衡。
自動容錯:發現rpc provider不可用及時剔除,當可用時加入。
代理:rpcClient注冊一個remote intface時會返回一個代理。
多注冊中心:提供Zookeeper,etcd,redis等注冊中心,并可以實現高可用。

使用

Provider

SimpleRpcServer rpcServer = new SimpleRpcServer();
rpcServer.setHost("192.168.132.87");
rpcServer.setPort(4321);
//將一個service暴露為rpc服務
rpcServer.register(LoginRpcService.class, new LoginRpcServiceImpl());
rpcServer.startService();
// Thread.currentThread().sleep(100000);//wait for call
rpcServer.stopService();

Consumer

SimpleRpcClient rpcClient = new SimpleRpcClient();
rpcClient.setHost("192.168.132.87");
rpcClient.setPort(4321);
LoginRpcService loginRpcService = rpcClient.register(LoginRpcService.class);
rpcClient.startService();
boolean loginResult = loginRpcService.login("admin", "admin");
rpcClient.stopService();
https://github.com/lindzh/rpc

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!