前面介绍了 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 stringHelloString(string para)
- {
- System.Threading.Thread.Sleep(1*1000);
- Console.WriteLine("客户端调用了HelloString方法");
- return para;
- }
- /// <summary>
- /// 只有一个参数,返回值为int类型的方法
- /// </summary>
- /// <param name="para"></param>
- /// <returns>返回值为int类型</returns>
- public intHelloInt(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 boolHelloBoolean(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 voidMain(string[] args)
- {
- try
- {
- //设置服务端口为8080TServerSocket serverTransport =newTServerSocket(9081);
- //设置传输协议工厂TBinaryProtocol.Factory factory =new TBinaryProtocol.Factory();
- //关联处理器与服务的实现
- TProcessor processor =newHelloService.Processor(new MyHelloService());
- //创建服务端对象TServer server =newTThreadPoolServer(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 voidMain(string[] args)
- {
- try
- {
- //设置服务端端口号和地址TTransport transport =newTSocket("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
来源: http://www.cnblogs.com/zhangweizhong/p/6884911.html