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( * ); Console.WriteLine("客户端调用了HelloString方法"); return para;
} /// <summary>
/// 只有一个参数,返回值为int类型的方法
/// </summary>
/// <param name="para"></param>
/// <returns>返回值为int类型</returns>
public int HelloInt(int para)
{
System.Threading.Thread.Sleep( * ); 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( * ); Console.WriteLine("客户端调用了HelloBoolean方法"); return para;
} /// <summary>
/// 返回执行为空的方法
/// </summary>
public void HelloVoid()
{
System.Threading.Thread.Sleep( * ); Console.WriteLine("客户端调用了HelloVoid方法"); Console.WriteLine("HelloWorld");
} /// <summary>
/// 无参数,返回值为null的方法
/// </summary>
/// <returns>返回值为null</returns>
public string HelloNull()
{
System.Threading.Thread.Sleep( * ); 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(); //设置传输协议工厂
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的node.js rpc服务
1.在node.js 服务下创建node_modules文件,npm install thrift 下载thrift到该文件下. 2.编写idl文件.user.thrift 内容如下: struct ...
- Spark RPC框架源码分析(二)RPC运行时序
前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...
- go-micro开发RPC服务的方法及其运行原理
go-micro是一个知名的golang微服务框架,最新版本是v4,这篇文章将介绍go-micro v4开发RPC服务的方法及其运作原理. 基本概念 go-micro有几个重要的概念,后边开发RPC服 ...
- RPC服务框架探索之Thrift
前言架构服务化后,需要实现一套方便调用各服务的框架,现在开源如日中天,优先会寻找开源实现,如果没有合适自家公司业务的,才会考虑从零开发,尤其是一切以KPI为准绳的公司,谁会跟钱过不去?N个月之前,公司 ...
- go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务
0.转载 go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 0.1源码地址 https://github.com/liuyuede123/go-z ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- Thrift 个人实战--Thrift RPC服务框架日志的优化
前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...
- WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务
在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主要说明在.NET的环境下,如何使用 WCF Data Se ...
随机推荐
- Springboot数据访问,棒棒哒!
Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...
- error C2039: 'SetDefaultDllDirectories'错误解决办法
使用VS2013+WDK8.1+Win7开发UMDF驱动,当使用了CComPtr类,包含了atlcomcli.h头文件却报错,错误如下: Error 3 error C2039: 'SetDefaul ...
- Python爬虫学习之获取网页源码
偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...
- web.xml报错
The content of element type "web-app" must match "(icon?,display-name?,description?,d ...
- jQuery插件ImgAreaSelect 实例讲解二
在上一篇随笔http://www.cnblogs.com/chenguanai/p/6883401.html中,已经了解了头像的上传预览和裁剪功能:那么这次就再看一下imgareaselect的裁剪功 ...
- 开涛spring3(3.3) - DI 之 3.3 更多DI的知识
3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...
- 日志组件一:Log4j
log4j是Apache的一个开源项目,陪伴了我们多年,但是现在已经不更新了.官网原文如下: Log4j 1.x has been widely adopted and used in many ap ...
- ASP微信开发获取用户经纬度
wx.config({ //debug: true, debug: true, appId: '<%= appId %>', timestamp: '<%= timestamp %& ...
- java面试题之int和Integer的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- 按钮开关demo
源码如下: <style> .container{ margin: 0px;padding: 100px 250px;} .switch-test{ -webkit-appearance: ...