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 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...
随机推荐
- 3. Spring Boot Servlet
转自:https://blog.csdn.net/catoop/article/details/50501686
- json问题小结
json 键值对增加.删除 obj.key='value'; // obj.key=obj[key]=eval("obj."+key); delete obj.key; vue中新 ...
- 【习题 3-9 UVA - 10340】All in All
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 相当于让你判断s1是不是s2的子序列. for一遍就好 [代码] #include <bits/stdc++.h> us ...
- POJ 3259 Wormholes 邻接表的SPFA判断负权回路
http://poj.org/problem?id=3259 题目大意: 一个农民有农场,上面有一些虫洞和路,走虫洞可以回到 T秒前,而路就和平常的一样啦,需要花费时间走过.问该农民可不可能从某个点出 ...
- JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中
JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中 一.JMS的理解JMS(Java Message Service)是jcp组织02-03年定义了jsr914规范(http://j ...
- 【z05】聪明的质检员
[题目链接]:http://noi.qz5z.com/viewtask.asp?id=z05 [题解] 显然w越大,最后的Y也就越大; 可以依靠这个搞二分: 如果二分枚举的tw得到的Y比S小,则减小t ...
- [Angular] HostListener Method Arguments - Blocking Default Keyboard Behavior
We are going to see how to using method arguments for @HostListener. First, we can use HostListener ...
- log4cxx入门篇
log4cxx入门篇 先看官网:http://logging.apache.org/log4cxx/index.html 转载自:http://wenku.baidu.com/view/d88 ...
- swift学习第十二天:类的属性定义
类的属性介绍 Swift中类的属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作为类实例的一部分, ...
- struts2-token防止重复提交解决办法
1.配置struts.xml全局防重复提交拦截器栈: <struts> <package name="module" extends="struts-d ...