前言

本文将介绍由 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框架入门(一)的更多相关文章

  1. C#使用Thrift作为RPC框架入门(三)之三层架构

    前言 这是我们讲解Thrift框架的第三篇文章,前两篇我们讲了Thrift作为RPC框架的基本用法以及架构的设计.为了我们更好的使用和理解Thrift框架,接下来,我们将来学习一下Thrift框架提供 ...

  2. C#使用Thrift作为RPC框架实战(四)之TSocket

    前言 在前几个小节中我们讲了Thrift框架的基本概念以及重要的名称空间,接下来的几个小节,我们将站在实战的角度来深入讲解一些Thrift的重要类型.本小节我先要讲一下Thrift框架支持TCP通信的 ...

  3. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

  4. 一个入门rpc框架的学习

    一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...

  5. .Net RPC框架Thrift的用法

      关于Thrift 下面是来自百度百科关于Thrift的介绍: thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go ...

  6. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...

  7. dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...

  8. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  9. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

随机推荐

  1. 3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项

    3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项 The diagram below shows the essential ...

  2. javascriptRemke之类的继承

    前言:es6之前在js中要实现继承,就必须要我们程序员在原型链上手动继承多对象的操作,但是结果往往存在漏洞,为解决这些问题,社区中出现了盗用构造函数.组合继承.原型式继承.寄生式继承等一系列继承方式, ...

  3. [no code][scrum meeting] Alpha 11

    项目 内容 会议时间 2020-04-17 会议主题 OCR紧急技术风险分析 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ) ...

  4. VUE调用子窗口弹窗或组件弹窗,关闭弹窗刷新父级页面主页面,通过this.$emit来实现

    this.$emit是父级向自己传值 第一步在父级页面创建自己页面的引用 <template> <div> <edit ref="edit" @ref ...

  5. BZOJ4919[Lydsy1706月赛]大根堆-------------线段树进阶

    是不是每做道线段树进阶都要写个题解..根本不会写 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  6. allegro查看线宽的方法

  7. 微服务(五)nacos配置管理

    1 统一配置管理 1.1 nacos中添加配置文件 注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要.基本不会变更的一些配置还是保存在微服务本地比较好. 1.2 从微服务拉取配置 微 ...

  8. Python Numpy matplotlib Histograms 直方图

    import numpy as np import matplotlib.pyplot as plt mu,sigma = 2,0.5 v = np.random.normal(mu,sigma,10 ...

  9. Luogu P2467 [SDOI2010]地精部落 | 神奇的dp

    题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...

  10. js 在浏览器中的event loop事件队列

    目录 前言 认识一个栈两个队列 执行过程 异步任务怎么分配 简单例子 难一点的例子 前言 以下内容是js在浏览器中的事件队列执行,与在nodejs中有所区别,请注意. 都说js是单线程的,不过它本身其 ...