Thrift寫RPC接口
Thrift總結(二)創建RPC服務
前面介紹了thrift 基礎的東西,怎麽寫thrift 語法規範編寫腳本,如何生成相關的語言的接口。不清楚的可以看這個《Thrift總結(一)介紹》。做好之前的準備工作以後,下面就開始如何用Thrift寫RPC接口。
如何用Thrift寫RPC接口
1. 打開之前下載的thrift 源碼,thrift-0.10.0\lib\csharp\src ,編譯生成Thrift.dll 文件。
2. 新建一個空白解決方案命名為HelloThrift。在解決方案根目錄下創建一個lib文件夾,將剛剛生成的Thrift.dll文件放入lib文件夾中。在解決方案分中建立兩個控制臺程序和一個類庫,控制臺程序分別命名為HelloThrift.Client 和 HelloThrift.Server,類庫命名為Thrift.Interface。Client、Server和Interface分別引用lib文件夾中的Thrift.dll文件,將準備工作中生成的HelloService文件導入到Interface類庫中。Client和Server分別引用Interface。具體結果如下圖所示
3. 創建完相關的項目和引用之後,在服務端HelloThrift.Server 創建一個類命名為MyHelloService,實現HelloService.Iface接口,代碼如下:
清單1.MyHelloService
using System; using HelloThrift.Interface; namespace HelloThrift.Server { public class MyHelloService : HelloService.Iface { /// <summary> /// 只有一個參數返回值為字符串類型的方法 /// </summary> /// <param name="para">string類型參數</param> /// <returns>返回值為string類型</returns> public string HelloString(string para) { System.Threading.Thread.Sleep(1 * 1000); Console.WriteLine("客戶端調用了HelloString方法"); return para; } /// <summary> /// 只有一個參數,返回值為int類型的方法 /// </summary> /// <param name="para"></param> /// <returns>返回值為int類型</returns> public int HelloInt(int para) { System.Threading.Thread.Sleep(1 * 1000); Console.WriteLine("客戶端調用了HelloInt方法"); return para; } /// <summary> /// 只有一個bool類型參數,返回值為bool類型的方法 /// </summary> /// <param name="para"></param> /// <returns>返回值為bool類型</returns> public bool HelloBoolean(bool para) { System.Threading.Thread.Sleep(1 * 1000); Console.WriteLine("客戶端調用了HelloBoolean方法"); return para; } /// <summary> /// 返回執行為空的方法 /// </summary> public void HelloVoid() { System.Threading.Thread.Sleep(1 * 1000); Console.WriteLine("客戶端調用了HelloVoid方法"); Console.WriteLine("HelloWorld"); } /// <summary> /// 無參數,返回值為null的方法 /// </summary> /// <returns>返回值為null</returns> public string HelloNull() { System.Threading.Thread.Sleep(1 * 1000); Console.WriteLine("客戶端調用了HelloNull方法"); return null; } } }
4. 創建服務器端HelloThrift.Server 宿主的實現代碼,在Program.cs 中添加如下代碼,這樣一個thrift 服務器就創建好了。
清單2.HelloThrift.Server
using System; using Thrift; using Thrift.Protocol; using Thrift.Server; using Thrift.Transport; using HelloThrift.Interface; namespace HelloThrift.Server { class Program { static void Main(string[] args) { try { //設置服務端口為8080 TServerSocket serverTransport = new TServerSocket(9081); //設置傳輸協議工廠 TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory(); //關聯處理器與服務的實現 TProcessor processor = new HelloService.Processor(new MyHelloService()); //創建服務端對象 TServer server = new TThreadPoolServer(processor, serverTransport, new TTransportFactory(), factory); Console.WriteLine("服務端正在監聽9081端口"); server.Serve(); } catch (TTransportException ex)//捕獲異常信息 { //打印異常信息 Console.WriteLine(ex.Message); } } } }
5. 創建完服務端之後,下面開始生成一個客戶端實現代碼,在HelloThrift.Client 的 Program.cs 中添加如下代碼:
清單3.HelloThrift.Client
using System; using HelloThrift.Interface; using Thrift.Protocol; using Thrift.Transport; namespace HelloThrift.Client { class Program { static void Main(string[] args) { try { //設置服務端端口號和地址 TTransport transport = new TSocket("localhost", 9081); transport.Open(); //設置傳輸協議為二進制傳輸協議 TProtocol protocol = new TBinaryProtocol(transport); //創建客戶端對象 HelloService.Client client = new HelloService.Client(protocol); //調用服務端的方法 Console.WriteLine(client.HelloString("HelloThrift")); Console.ReadKey(); } catch (TTransportException e) { Console.WriteLine(e.Message); } } } }
上面的代碼調用了服務端的HelloString方法,服務端也會返回傳入的傳輸值,客戶端將服務端返回的數據打印出來。好了完成了代碼以後,將先啟動Server,在啟動Client。客戶端調用結果 和 服務端請求顯示。
說明
1. 關於使用Thrift 構建我們自己的rpc 的方法,這裏基本講完了。其他的方法本文就不再演示了,調用起來都是一樣。
2. 後續會簡單討論一下Thrift 框架的通信原理。
3. 源代碼下載,HelloThrift.rar
Thrift寫RPC接口