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
作者:章为忠
如有问题,可以微信:18618243664 联系我,非常感谢。
关注我的微信公众号,获取相关的 源代码及视频资料。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?