首页 > 其他分享 >Thrift跨语言RPC框架

Thrift跨语言RPC框架

时间:2023-05-04 20:26:19浏览次数:46  
标签:Java 语言 框架 IDL C++ RPC string Thrift

最近入职需要用到Thrift框架(准确来说其实是MTThrift),记录一下学习进度。

RPC?

RPC(Remote Procedure Call,远程过程调用)可以让我们像调用本地一样发起远程调用,为我们屏蔽一些底层细节,例如序列化,编解码,网络传输等。

Thrift

Thrift是一个轻量级、跨语言的远程服务调用框架,最初由Facebook开发,后面进入Apache开源项目。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。
Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby等,Thrift更多介绍可以参考Apache官网
Thrift的主要特点有:

  • 基于二进制的高性能的编解码框架
  • 基于NIO的底层通信
  • 相对简单的服务调用模型
  • 使用IDL支持跨平台调用

IDL

Thirft是一个典型的CS架构,客户端和服务端可以使用不同的语言开发。可以使用一种中间语言关联客户端和服务端的语言,将这种语言称为IDL(Interface Definition Language)。
Thrift采用IDL定义通用的服务接口,然后通过Thrift提供的编译器,将服务接口编译成为不同语言的代码,实现跨语言的功能。IDL详细介绍可以参考apache,IDL文件通常以.thrift结尾。

IDL语法

基本类型
  • bool (布尔值(true,false)
  • byte (8位有符号整型
  • i16 (16位有符号整型
  • i32 (32位有符号整型
  • i64 (64位有符号整型
  • double (64位浮点数
  • string (字符串,采用UTF-8编码
特殊类型
struct

struct格式定义如下:

struct <结构体名称> {
	<序号> : [字段性质]<字段类型><字段名称> [ = <默认值>] [; or , or ]
}

例如

//required表示该字段在传输过程一定要有,optional表示可以不传该字段,若不传该字段则也不会对该字段进行序列化。
struct User {
    1 : required string name;//该字段必须要有
    2 : optional i32 age = 0;//该字段可以没有,有默认值0
    3 : bool gender,//默认字段类型为optional,末尾可以以逗号结尾,可以以分号结尾,也可以啥也没有
}

注意

  1. struct不能继承,但是允许嵌套,但不允许自己嵌套自己
  2. 成员都是有明确类型
  3. 成员被正整数编号,编好不能重复,为了在传输过程中编码使用
  4. optional不填充则不会序列化,required必须填充也必须序列化
枚举(enum)

Thrift不支持枚举类嵌套,枚举常量必须是32位的正整数。例如

enum HttpStatus {
    OK = 200;
   NOTFOUND = 404;
}
容器

IDL中的容器只有三种,分别是list(即C++ STL的vector,Java中的ArrayList),map(C++ STL中的map,Java中的HashMap),set(C++中的set, Java中的HashSet)。使用容器类型时必须指定范性,集合中的元素可以是除了service中的任何类型,包括exception。

Exception

异常在语法和功能上类似结构体,区别是异常使用关键字exception,而且异常是继承每种语言的异常基础类。例如

exception MyException {
    1 : i32 errorcode;
    2 : string meg;
}
service ExampleService {
    string GetName() throw (1 : MyService e)
}
Service

服务的定义方法等同于面向对象的接口,例如

service HelloService {
    i32 sayInt(1 :  i32 param);
    string sayString(1 : string param);
    bool sayBool(1 : bool param);
}

命名空间(namespace)

Thrift的命名空间类似于C++中的namespace和Java中的package,他们提供了一个组织(隔离)代码的简便方式,命名空间也可以解决类型定义中的命名冲突。

namespace java com.example.test //生成Java代码
namespace cpp com.example.test //生成cpp代码

编译

编译器安装

参考官方文档

编译命令

# 生成Java代码
thrift -gen java user.thrift
# 生成C++代码
thrift -gen cpp user.thrift

生成其他语言的命令可以自行去如前所述apache官网查看~

标签:Java,语言,框架,IDL,C++,RPC,string,Thrift
From: https://www.cnblogs.com/real010/p/17367362.html

相关文章

  • Java练手项目(尚硅谷的),不涉及框架,数据库等。
    软件:idea我是先建立了一个空白的项目,自己创建的src包和其下面的包。问题一:建立包之后发现格式为src.com.tjp.bean没办法建立其他与bean同级的servicetestutilsview等。只允许继续建立bean的子包。解决:这是因为idea自动会折叠空白包。(不同版本的idea可能和我的位置不太一......
  • SpringBoot定义优雅全局统一Restful API 响应框架三
    我们目前已经设计出了,包含全局响应,异常错误响应进行了统一返回。但是错误内容我们设计的比较模糊统一,还可以进行细化这样更有利于定位错误当我们需要调用Http接口时,无论是在Web端还是移动端,都有可能遇到各种错误,例如参数缺失、类型错误、系统错误等。为了规范错误信息的返回,我们......
  • 【OpenAI】私有框架代码生成实践
    作者:京东零售牛晓光根据现有调研和实践,由OpenAI提供的ChatGPT/GPT-4模型和CodeX模型能够很好的理解和生成业界大多数编程语言的逻辑和代码,其中尤其擅长Python、JavaScript、TypeScript、Ruby、Go、C#和C++等语言。然而在实际应用中,我们经常会在编码时使用到一些私有框架、包......
  • 12 11 | 反应式编程框架设计:如何使方法调用无阻塞等待?
    你好,我是李智慧。反应式编程本质上是一种异步编程方案,在多线程(协程)、异步方法调用、异步I/O访问等技术基础之上,提供了一整套与异步调用相匹配的编程模型,从而实现程序调用非阻塞、即时响应等特性,即开发出一个反应式的系统,以应对编程领域越来越高的并发处理需求。反应式系统应该具......
  • simulink模块汇总梳理 , 智能座舱域在AUTOSAR 框架中应用层的开发依赖于simulink建模,
    simulink模块汇总梳理,智能座舱域在AUTOSAR框架中应用层的开发依赖于simulink建模,通过simulink模型设计加上C代码生成来完成繁杂的应用层开发。因此simulink计算组件的充分了解必不可少。本商品梳理了近乎全部的simulink模块,帮助您短时间对未知模块进行检索及了解,倘若您需要模......
  • 自动驾驶,AutoWareAuto框架全框架梳理思维导图及代码注释。
    自动驾驶,AutoWareAuto框架全框架梳理思维导图及代码注释。授人以鱼不如授人以渔,涵盖:融合感知模块,定位模块,决策规划模块,控制模块,预测模块等较为详细的注释(并非每行都有注释)及框架梳理。阅读Auto版本的代码时结合思维导图可以事半功倍,大厂自动驾驶技术团队多位领域技术牛人耗时两......
  • MATLAB程序:基于两阶段控制框架的多能源互联系统协同自主优化。
    MATLAB程序:基于两阶段控制框架的多能源互联系统协同自主优化。关键词:多能源微网多时间尺度滚动优化微网双层模型调度参考文档:《CollaborativeAutonomousOptimizationofInterconnectedMulti-EnergySystemswithTwo-StageTransactiveControlFramework》完全复现仿真......
  • 面向万物智联的应用框架的思考和探索(上)
     原文:https://mp.weixin.qq.com/s/G6o6xSAWroz0fJK7oShYLA,点击链接查看更多技术内容。 应用框架,是操作系统连接开发者生态,实现用户体验的关键基础设施。其中,开发效率和运行体验是永恒的诉求,业界也在持续不断的发展和演进。本文重点围绕移动应用框架,梳理其关键发展脉络,并分......
  • 假期做了一项调研:大厂为啥都自研RPC?结果合乎情理!
    大家好,我是冰河~~五一假期过的可真快,今天开始,又要搬砖了。在五一假期当中,冰河做了一项调研,感觉结果还是挺合乎情理的。翻看招聘信息先来看我在某招聘网站上随便搜索了下Java招聘的岗位,看到的招聘信息。可以看到,很多岗位都要求有分布式、微服务相关的开发经验,并且清一色都需......
  • SpringBoot定义优雅全局统一Restful API 响应框架二
    这里解决之前留下来的问题,当程序没有正常返回时候就是程序由于运行时异常导致的结果,有些异常我们可,能无法提前预知,不能正常走到我们return的R对象返回。这个时候该如何处理在SpringBoot中,可以使用@ControllerAdvice注解来启用全局异常处理。通过使用@ControllerAdvice注解,可以捕......