lindzh RPC輕量級分布式RPC框架
輕量級分部署服務(wù)調(diào)度框架的基本原理是服務(wù)提供方Provider提供rpc服務(wù),同時把ip和端口以及發(fā)布的rpc服務(wù)注冊到注冊中心,客戶端或者 rpc消費(fèi)者從注冊中心獲取服務(wù)Provider列表,同時獲取Provider提供的服務(wù)列表。另外客戶端還會監(jiān)聽注冊中心的數(shù)據(jù)變化,獲知 server宕機(jī)或者服務(wù)不可用,將該P(yáng)rovider從客戶端Provider緩存列表中剔除,方便做容錯和負(fù)載均衡。
基本原理
特性
一、 負(fù)載均衡 提供基于RoundRobin和隨機(jī)方式的負(fù)載均衡 二、 高可用 Consumer會從注冊中心獲取到服務(wù)列表及該服務(wù)的提供者列表,如果某個提供者Provider網(wǎng)絡(luò)異常或者宕機(jī), Consumer能馬上感知到,加入不可用列表,如果從注冊中心收到服務(wù)不可用會剔除緩存,不可用列表會重新嘗試發(fā)起 連接,如果網(wǎng)絡(luò)正常了會立即恢復(fù)。 三、 泛型 一般的rpc調(diào)用需要拿到服務(wù)提供方的業(yè)務(wù)api(interface class,入?yún)lass,返回值class打包到一個jar中, 依賴該jar),如果使用泛型,只需要填寫interface的name,版本,方法名稱,參數(shù)名稱,參數(shù)值,如果是對象, 將對象字段封裝到一個Map中即可,無需依賴任何業(yè)務(wù)jar即可完成rpc調(diào)用。 四、 Rpc上下文附件 Rpc調(diào)用方可以將需要傳遞的上下文信息填寫到上下文中,而不是作為rpc的入?yún)ⅲ@樣Provider可以從上下文中獲取 到掉用方的上下文信息。 五、 高可用注冊中心 Rpc 框架提供了zookeeper,etcd,redis pubsub(支持單個,或者sentinel集群模式)的注冊中心,具備高可 用功能。 六、 實時動態(tài)監(jiān)控 Provider提供了監(jiān)控的api,監(jiān)控可以使用該api加入到項目或者公司的監(jiān)控平臺。 七、 內(nèi)存使用少 Rpc使用的內(nèi)存模型是tcp連接建立后自動分配一塊內(nèi)存,讀和寫都在該內(nèi)存中,不需要為每次請求分配內(nèi)存,同一個 tcp內(nèi)存復(fù)用,數(shù)據(jù)使用了壓縮的方式保存和發(fā)送,不支持返回數(shù)據(jù)量超大的調(diào)用(壓縮后超過1m)。
整體架構(gòu)
泛型:GenericService,Consumer不依賴Provider的api jar包即可完成remote api調(diào)用 監(jiān)控:StatMonitor,consumer注冊需要的遠(yuǎn)程服務(wù)StatMonitor,調(diào)用rpc獲取監(jiān)控數(shù)據(jù) Webui:一個可視化rpc管理界面,https://github.com/lindzh/rpc-webui RPC調(diào)用:使用jdk proxy封裝發(fā)送tcp數(shù)據(jù),并等待數(shù)據(jù)返回,完成RPC調(diào)用。 負(fù)載均衡:在集群模式下,同一個版本的Rpc服務(wù)在多臺服務(wù)器上部署,Consumer發(fā)起rpc調(diào)用使用負(fù)載均衡。 自動容錯:發(fā)現(xiàn)rpc provider不可用及時剔除,當(dāng)可用時加入。 代理:rpcClient注冊一個remote intface時會返回一個代理。 多注冊中心:提供Zookeeper,etcd,redis等注冊中心,并可以實現(xiàn)高可用。
使用
Provider
SimpleRpcServer rpcServer = new SimpleRpcServer();
rpcServer.setHost("192.168.132.87");
rpcServer.setPort(4321);
//將一個service暴露為rpc服務(wù)
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();評論
圖片
表情
