1. 程式人生 > >Thrift寫RPC接口

Thrift寫RPC接口

說明 其他 源代碼下載 關於 創建服務 thread har 接口 servers

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接口