CSharp使用Thrift作为RPC框架入门(一)
前言
本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 在C#语言下的使用方式,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务。
完善开发工具
通过nuget在vs2019中安装thrift
在项目中引用右键点击管理Nuget程序包,在打开的界面输入thrift,如下图:
我们选择ApacheThrift这一项进行安装,安装后,在我们项目里有Thrift45.dll的引用,如下图:
下载thrift代码生成工具
thrift是支持异构语言、异构平台的通信开发RPC框架,它通过中间语言IDL进行描述你要定义的结构、类、服务等,并通过代码生成工具生成各个语言上对应的代码。
接下来,我们进入Apache网站Thrift项目下载Thrift代码生成工具,如下图:
我们把下载的这个exe文件放到我们项目的根目录下,以备后用,如下图:
至此,关于thrift的开发工具,我们已经准备完毕,接下来来编写thrift接口描述文件
thrift描述文件
thrift提供的接口描述文件是以thrift结尾的格式文件,我们来解释一下这种IDL的语法,
- 它提供了基础类型的定义,包括bool、i16、i32、i64、double、string
- enum
- Struct 对一些基础类型的封装,对应C#中Class字段
- 还有一些集合的定义,包含 set<> 对应C#中的HashSet,是一种唯一元素的集合(Thrift框架自己定义了THashSet类型与之相对应);list<>对应C#中的List<>;map<K,V>对应C#的Dictionary<K,V>
- service 这个是thrift的重点,它是一些方法集合,thrift会根据这个定义生成客户端代码和服务端代码
- exception 对应C#中的Exception类型
thrift关于类型的定义以及示例代码请打开这个网址:IDL描述
在IDL描述文件中,Thrift除了对类型的定义外,我们还需要记住一下知识点:
- namespace 在描述文件的头部定义。 以当前文件为根目录,生成多级目录;在生成的代码上添加namespace命名空间。代码如下:
namespace csharp WpfApp1.ceshi
- include 在描述文件的头部定义。 用该命令包含其他thrift描述文件,当编译生成代码时也会编译include指定的thrift文件。代码如下:
include "pe1.thrift"
使用方法,pe1.thrift文件定义如下:
struct pe1
{
1: i32 id;
}
在其他文件中,引入上述文件,定义如下:
include "pe1.thrift"
service GuidGenService
{
string getGuid(1:pe1.pe1 pe1);
}
- typedef 类型定义命令,将thrift支持的类型定义一个别名。代码如下:
typedef i32 int
struct People
{
1: int ID;
2: string Name;
3: i16 Age;
4: list<i32> onelist;
5: set<string> oneSet;
6: map<i32,string> oneset;
}
当定义完描述文件后,我们通过如下cmd命令生成代码文件:
thrift-0.12.0.exe -r -gen csharp People.thrift
我们先要通过cd 将当前路径跳转到thrift-0.12.0.exe所在的路径
示例
我定义了了一个描述文件,如下:
namespace csharp WpfApp1.ceshi
include "pe1.thrift"
typedef i32 int
struct People
{
1: int ID;
2: string Name;
3: i16 Age;
4: list<i32> onelist;
5: set<string> oneSet;
6: map<i32,string> oneset;
}
service HelloService
{
void SetPeople(1: People people1);
}
service GuidGenService
{
string getGuid(1:pe1.pe1 pe1);
}
我们通过上述命令执行后,生成的代码结构如下图:
我们打开people.cs可以看到struct people生成了如下代码:
namespace WpfApp1.ceshi
{
#if !SILVERLIGHT
[Serializable]
#endif
public partial class People : TBase
{
private int _ID;
private string _Name;
private short _Age;
private List<int> _onelist;
private THashSet<string> _oneSet;
private Dictionary<int, string> _oneset;
.....
这里需要注意一下people类的命名空间,这和我们上文讲的时一致的。
我们定义的service GuidGenService生成了如下代码:
该类是我们使用该框架的重点,它给我们生成了客户端和服务器端代码,从图中我们可以看该文件下生成了两个接口ISync和Iface,前者是同步方法,后者生成的是异步调用方法,接下来是一个供我们客户端调用的类,它继承了iface接口,而iface又继承了ISync接口;再往下看是一个Processor,是服务端使用的类。
结尾
这篇文件我们讲了从0到1使用thrift框架的方法,也讲了一些该框架的基本知识,接下来的文件,我们将通过一个示例具体讲解一下service指令代码生成的代码的具体含义和使用方法
CSharp使用Thrift作为RPC框架入门(一)的更多相关文章
- C#使用Thrift作为RPC框架入门(三)之三层架构
前言 这是我们讲解Thrift框架的第三篇文章,前两篇我们讲了Thrift作为RPC框架的基本用法以及架构的设计.为了我们更好的使用和理解Thrift框架,接下来,我们将来学习一下Thrift框架提供 ...
- C#使用Thrift作为RPC框架实战(四)之TSocket
前言 在前几个小节中我们讲了Thrift框架的基本概念以及重要的名称空间,接下来的几个小节,我们将站在实战的角度来深入讲解一些Thrift的重要类型.本小节我先要讲一下Thrift框架支持TCP通信的 ...
- rpc框架之 thrift 学习 1 - 安装 及 hello world
thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...
- 一个入门rpc框架的学习
一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...
- .Net RPC框架Thrift的用法
关于Thrift 下面是来自百度百科关于Thrift的介绍: thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go ...
- 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...
- dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...
- rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)
学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...
- rpc框架之 thrift连接池实现
接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...
随机推荐
- JOIN US | SphereEx 精英集结
新环境.新气象,SphereEx 欢迎志同道合的你加入! 关于 SphereEx 北京思斐软件技术有限公司(sphere-ex.com),是一家致力于构建新型分布式数据基础设施的公司,秉承开源.共享. ...
- ElasticSearch IK热词自动热更新原理与Golang实现
热更新概述 ik分词器本身可以从配置文件加载扩张词库,也可以从远程HTTP服务器加载. 从本地加载,则需要重启ES生效,影响比较大.所以,一般我们都会把词库放在远程服务器上.这里主要有2种方式: 借助 ...
- v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码
子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...
- python OptionParser的用法
from optparse import OptionParser parser = OptionParser(usage = "usage: %prog [options] arg&quo ...
- 初学Python “登录”案例 更新!!
更新内容:添加了登录次数,如果超过限制的次数,则提示账户被锁定,去某邮箱申请解锁账户! 此次仅把登录系统更新之后源代码放到这里,不在共享源文件在网盘了! 1 ''' 2 登录界面 3 ''' 4 5 ...
- 什么是Spring,SpringMVC,SpringBoot,SpringCloud?通俗易懂
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.Spring使你能够编写更干净.更可管理.并且更易于测试的代码. Spring MVC是Spring的一个模块,一个web框 ...
- Golang通脉之错误处理
在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...
- gson中TypeAdapter实现自定义序列化操作
最近在项目中遇到这么一个问题,我们后台需要向前端返回一个 json 数据,就是将一个地理位置对象以json的格式返回到前台,但是这个地理位置对象中的经纬度是Double数据类型,项目中规定,如果经纬度 ...
- 对dy和Δy的浅薄理解
一.导数定义 当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x0)或df(x0) ...
- iPhone SE切换颜色特效
Apple 网站的特效, iPhone SE 共有黑.白.红三种颜色,在卷动页面的时候会逐步替换,看起来效果非常时尚,在此供上代码学习. <!DOCTYPE html> <html& ...