當前位置:
首頁 > 最新 > Thrift RPC實戰 Spring集成Thrift,實現服務端和客戶端代理

Thrift RPC實戰 Spring集成Thrift,實現服務端和客戶端代理

本文主要講解thrift的服務化改造, 這邊側重於闡述對client(服務調用方)的改造和設計思想.


1.基礎概念:

傳統對client的優化, 主要是Client Manager化, 優化方式包括引入連接池, 支持Failover/LoadBalance機制. 上一篇文章中我們已經實踐了thrift服務客戶端對象池的技術改造  PRC服務化, 對於client(服務調用方)而言, 應該隱藏client和server端的交互細節(包括failover/loadbalance), 唯一需要暴露/使用的是服務方提供的介面. 簡而言之, 通過service介面進行rpc服務, 而不是採用client的api去訪問.  用thrift api作為例子

面向介面編程:  先來看下thrift生成的類有那些

其生成的類有如下所示:

評註: HelloService.Iface就是同步HelloService的介面定義, 而HelloService.Client則是與服務端交互的具體客戶端實例.

面向介面編程, 採用裝飾者模式(Decorator Pattern, 介面+組合), 藉助實現HelloService.Iface介面, 握有HelloService.Client實例的方式去實現. 這樣能達到服務化的初步雛形, 但這遠遠不夠.


RPC Client服務化的基本特徵(個人觀點), 可以分為如下:  1). 泛型化, 作為一個服務框架存在, 而不是只用於具體模塊  2). 內部封裝的client需要實現client-manager化, 即支持連接池/failover/loadbalance  3). 通過訂閱服務的方式, 透明的調用服務提供方(不需要知道服務提供方的server ip:port 列表)  本文主要闡述思路, 服務訂閱放在後續的文章, 弱化Client-Manager, 但支持泛型化來實現一個簡單的client service解決方案.


對泛型Thrift Service的支持, 通過採用spring配置以及反射的方式來實現.

對於一個服務提供者來說,需要提供埠,介面以及介面實現類,因此在介面中spring中配置

當然userServiceImpl需要提前聲明,例如:

接下來定義ThriftServerProxy類,定義bean中需要用到的3個屬性,接下來通過反射來實現服務的啟動。

編寫服務端測試:


對於客戶端,從連接池裡面獲取一個可用的服務端連接,通過反射的方式獲取客戶端,在spring-client.xml中配置如下:

連接池採用commons-pool提供的連接池,在spring啟動的時候,注入到bean中,

關鍵代碼如下:

客戶端的代理對象獲取client代碼:

客戶端測試:

當前的不足:  沒有使用訂閱服務列表, 使得在配置中, 需要指定ip:port列表,後續會通過zookeeper編寫發布/訂閱服務列表的實現方案。

參考demo地址如下:

碼云:http://git.oschina.net/shunyang/thrift-all/tree/master/thrift-springgithub:https://github.com/shunyang/thrift-all/tree/master/thrift-spring

歡迎關注我的公眾號,獲取更多文章,並與我交流溝通。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小陽的代碼人生 的精彩文章:

TAG:程序員小陽的代碼人生 |