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接口的更多相关文章
- Thrift对多接口服务的支持
Thrift对多接口服务的支持 Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现. 但是很多时候,我们的服务不能实现在一个接 ...
- JAVA RPC (五) 之thrift序列化RPC消息体
让大家久等了.继续更新thrift序列化的消息体,下面我们一步一步的看一看thrift的rpc是怎么实例化消息体的. 首先我们先准备一个request文件 namespace java bky str ...
- 手写RPC框架指北另送贴心注释代码一套
Angular8正式发布了,Java13再过几个月也要发布了,技术迭代这么快,框架的复杂度越来越大,但是原理是基本不变的.所以沉下心看清代码本质很重要,这次给大家带来的是手写RPC框架. 完整代码以及 ...
- 看了这篇你就会手写RPC框架了
一.学习本文你能学到什么? RPC的概念及运作流程 RPC协议及RPC框架的概念 Netty的基本使用 Java序列化及反序列化技术 Zookeeper的基本使用(注册中心) 自定义注解实现特殊业务逻 ...
- 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念
http接口.api接口.RPC接口.RMI.webservice.Restful等概念 收藏 Linux一叶 https://my.oschina.net/heavenly/blog/499661 ...
- 程序员的自我救赎---11.1:RPC接口使用规范
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- RPC接口mock测试
转载:http://blog.csdn.net/ronghuanye/article/details/71124127 1 简介 Dubbo目前的应用已经越来越广泛.或者基于Dubbo二 ...
- rpc接口和http接口的区别和联系
1 什么是http接口 http接口是基于http协议的post和get接口. 2 什么是rpc接口 rpc接口就相当于调用本地接口一样调用远程服务的接口. 3 常用的rpc框架 thrift 自动代 ...
- java 从零开始手写 RPC (03) 如何实现客户端调用服务端?
说明 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...
随机推荐
- 洛谷 P1571 眼红的Medusa
P1571 眼红的Medusa 题目描述 虽然Miss Medusa到了北京,领了科技创新奖,但是他还是觉得不满意.原因是,他发现很多人都和他一样获了科技创新奖,特别是其中的某些人,还获得了另一个奖项 ...
- libiconv 支持的编码
libiconv 支持的编码 php 中的 iconv() 函数常用来作编码转换用.作一些不同编码的动态数据的转换时常遇到一些未知编码的数据,这时 iconv() 支持那些编码转换就很重要. 刚开始, ...
- ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎么回事?
原网址:http://huangxuan.me/2015/09/22/js-version/ JavaScript 有着很奇怪的命名史. 1995 年,它作为网景浏览器(Netscape Naviga ...
- Android Material风格的应用(三)--DrawerLayout
添加抽屉导航 Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewAndroid Mater ...
- java中那些已经有的好用轮子
后续补充 IOUtils http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/IOUtils.html ...
- 如何把别人的原理图和pcb图建立一个完整的工程
这里是我从网友那里下载的pcb图和原理图 我们怎么通过这两个文件建立一个完整的工程 我们选中pcb图文件,通过下面的操作,就可以导出pcb封装库: 同样的方法,我选中pcb图,然后用下面图的方法,就可 ...
- 软件——python,主函数
1;; 如何在spyder中运行python程序 如下图, 写入一个输出 ' hellow word '的程序 然后点击运行按钮就可以运行了.
- PythonNET网络编程2
UDP应用:广播 广播:一点发送,多点接收 广播地址:一个网段内有一个指定的广播地址,是该网段的最大地址 192.168.2.255 广播风暴:一个网络中有大量的广播就会产生广播风暴占用大量带宽,影响 ...
- [D3] Make D3 v4 Charts Responsive with the viewBox attribute
Making SVGs responsive is unfortunately not as simple as adding some media queries. This lesson intr ...
- 在 Swift 项目中实现侧滑菜单-利用 SWRevealViewController
你可以完全自己手动写一个侧滑菜单,但是现在在 GitHub 上面已经有很多免费的开源库了,如果不是有很特别的需求,大可不必新建一个轮子. 在这里我使用的这个第三方库名字叫做 SWRevealViewC ...