Java輕量級分布式RPC框架:lindzh RPC
輕量級分部署服務調度框架的基本原理是服務提供方Provider提供rpc服務,同時把ip和端口以及發布的rpc服務注冊到注冊中心,客戶端或者 rpc消費者從注冊中心獲取服務Provider列表,同時獲取Provider提供的服務列表。另外客戶端還會監聽注冊中心的數據變化,獲知 server宕機或者服務不可用,將該Provider從客戶端Provider緩存列表中剔除,方便做容錯和負載均衡。
基本原理
特性
一、 負載均衡 提供基于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)。
整體架構
泛型: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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!