C#使用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指令代码生成的代码的具体含义和使用方法

到此这篇关于C#使用Thrift作为RPC框架入门(一)的文章就介绍到这了,更多相关c# Thrift RPC框架内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-11-24

利用thrift实现js与C#通讯的实例代码

1.为什么要用thrift js C#? 1.1 首先,js 通过 thrift 访问C#,实际上是一种c/s模式.thrift是通信工具,js是客户端,C#是服务端. 1.2 使用js直接与thrift server通信.让web开发变得更简单.如果使用Web Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发效率.而thrift则会自动生成两端的操作类,你只需要处理方法内部的逻辑即可. 1.3 js直接与thrift server通信,可以提高性

c# 用ICSharpCode组件压缩文件

一.单文件压缩 场景,文件可能比较大,需要压缩传输,比如上传和下载 /// <summary> /// 单文件压缩 /// </summary> /// <param name="sourceFile">源文件</param> /// <param name="zipedFile">zip压缩文件</param> /// <param name="blockSize"&

c# RPC框架的使用简介

写在前面: RPC,听过很有段时间了,但是一直都不太清楚是干嘛的,今天我们来捋一捋. 解释: [Remote Procedure Call Protocol]远程过程调用(就是说,A程序要调用一个b方法,然而这个b方法的实现在B程序内部,B程序还可能和A不在一个电脑上面,怎么调用?http可以调用/rpc也可以,让他像调用本地方法一样调用) 使用初探: 用了一下市面上的,rpc框架,步骤如下: 1.写一个基本的代码,告诉有哪些方法. 2.然后服务端集成, 3.客户端集成, 4.OK调用生效了.

Java实现简单的RPC框架的示例代码

一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. rpc框架做的最重要的一件事情就是封装,调用者和被调用者的通讯细节,客户端代理负责向调用方法的方法名参数返回值包等信息根据通信协议组织成报文发送给服务端,服务端解析报文,根据客户端传递的信息执行对应的方法,然后将返回值安装协

Java如何实现简单的RPC框架

一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. RPC示意图 如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回.但从后续调用可以看出Computer1调用的是Computer2

php实现的一个简单json rpc框架实例

json rpc 是一种以json为消息格式的远程调用服务,它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现.这种远程过程调用可以使用http作为传输协议,也可以使用其它传输协议,传输的内容是json消息体. 下面我们code一套基于php的rpc框架,此框架中包含rpc的服务端server,和应用端client: (一)PHP服务端RPCserver jsonRPCServer.php 复制代码 代码如下: class jsonRPCServe

Go实现简易RPC框架的方法步骤

本文旨在讲述 RPC 框架设计中的几个核心问题及其解决方法,并基于 Golang 反射技术,构建了一个简易的 RPC 框架. 项目地址:Tiny-RPC RPC RPC(Remote Procedure Call),即远程过程调用,可以理解成,服务 A 想调用不在同一内存空间的服务 B 的函数,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据. 服务端 RPC 服务端需要解决 2 个问题: 由于客户端传送的是 RPC 函数名,服务端如何维护 函数名 与 函数实体

分析JAVA中几种常用的RPC框架

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 对于RPC有一个逻辑关系图,以RMI为例: 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper). 客户端和服务端可以运行在不同的JVM中,Client只

python使用rpc框架gRPC的方法

概述 gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2). rpc: remote procedure call, 翻译过来就是是远程程序调用.具体来说,就是客户端c1需要调用服务器s1上的某个方法(函数),得到相应的返回值并传递给c1. gRPC协议 要说gRPC协议需要先了解HTTP2, 虽然HTTP1.X 协议至今仍是主流协议,但是随着我们对性能要求越来越高,和web规模的不断扩大,HTTP2就应运而生. 在这里,我们

Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解

本文实例讲述了Laravel框架Eloquent ORM简介.模型建立及查询数据操作.分享给大家供大家参考,具体如下: 注:以下知识点可能有不全面之处,望见谅 NO.1Eloquent ORM简介 Laravel所自带的Eloquent ORM是一个优美.简洁的ActiveRecord实现,用来实现数据库操作 每个数据表都有与之相对应的"模型(Model)"用于和数据交互 NO.2模型的建立 最基础的模型代码如下: namespace App; use Illuminate\Datab

Java RPC框架过滤器机制原理解析

过滤器 字面义上理解的过滤器类似下图,从一堆物品中筛选出符合条件的留下,不符合的丢弃. GOF 职责链 GOF中有一种设计模式叫职责链,或者叫责任链,常规的UML图如下: 正统的职责链是将一个请求发给第一个接收者,接收者判断是否属于自己能处理的,如果能处理则执行操作并中止请求下发,流程到此为止.如果不能处理则将请求下发给下一个接收者一直到最后一个接收者. 变体职责链 上面提到正统的职责链有一个特点:当找到符合条件的执行者后流程中止并不会将请求继续下发给后续的执行者.这类场景比较适合比如审核操作,

Laravel框架Blade模板简介及模板继承用法分析

本文实例讲述了Laravel框架Blade模板及模板继承用法.分享给大家供大家参考,具体如下: 本章知识点主要如下: Blade模板简介 Blade模板继承使用 NO.1Blade模板简介 问: 什么是Blade模板? 答: Blade模板是Laravel提供一个既简单又强大的模板引擎: 和其他流行的PHP模板引擎不一样,他并不限制你在视图里使用原生PHP代码: 所有Blade视图页面都将被编译成原生的PHP代码并缓存起来,除非你的模板文件被修改,否则不会重新编译. 而这些都意味着Blade不会

thinkPHP5.0框架开发规范简介

本文实例讲述了thinkPHP5.0框架开发规范.分享给大家供大家参考,具体如下: 命名规范 ThinkPHP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 目录和文件 目录不强制规范,驼峰及小写+下划线模式均支持: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致: 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写): 函数和类.属性命名 类的命名采用驼峰法,并且首字母大写,例如 User.UserType,