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實例的方式去實現. 這樣能達到服務化的初步雛形, 但這遠遠不夠.
2.服務化的基本特徵:
RPC Client服務化的基本特徵(個人觀點), 可以分為如下: 1). 泛型化, 作為一個服務框架存在, 而不是只用於具體模塊 2). 內部封裝的client需要實現client-manager化, 即支持連接池/failover/loadbalance 3). 通過訂閱服務的方式, 透明的調用服務提供方(不需要知道服務提供方的server ip:port 列表) 本文主要闡述思路, 服務訂閱放在後續的文章, 弱化Client-Manager, 但支持泛型化來實現一個簡單的client service解決方案.
3服務化改造解決方案:
3.1服務端改造:
對泛型Thrift Service的支持, 通過採用spring配置以及反射的方式來實現.
對於一個服務提供者來說,需要提供埠,介面以及介面實現類,因此在介面中spring中配置
當然userServiceImpl需要提前聲明,例如:
接下來定義ThriftServerProxy類,定義bean中需要用到的3個屬性,接下來通過反射來實現服務的啟動。
編寫服務端測試:
3.2客戶端改造:
對於客戶端,從連接池裡面獲取一個可用的服務端連接,通過反射的方式獲取客戶端,在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:程序員小陽的代碼人生 |