Go语言 thrift 入门指南--thrift IDL介绍

简介: Thrift 是一个轻量级、跨语言的 RPC 框架,由 facebook 开发,2007年正式开源,2008 纳入 Apache 软件基金会开源项目。

Thrift 是一个轻量级、跨语言的 RPC 框架,由 facebook 开发,2007年正式开源,2008 纳入 Apache 软件基金会开源项目。

Thrift 支持多种编程语言,包括 C++, Java, Python, PHP, Ruby, Erlang, Perl, Go, C#, JavaScript, Node.js 等。

安装

安装 thrift 编译器,它用来生成所需语言的代码文件,例如生成 go 语言代码:

thrift -r --gen go tutorial.thrift
复制代码
  1. mac

建议直接使用brew安装:

brew install thrift
复制代码

也可以下载源码安装,参考:http://thrift.apache.org/docs/install/os_x

  1. CentOS

需下载源码安装,参考:http://thrift.apache.org/docs/install/centos

  1. Debian/Ubuntu

需下载源码安装,先安装依赖:http://thrift.apache.org/docs/install/debian%EF%BC%8C%E7%84%B6%E5%90%8E%E5%AE%89%E8%A3%85thrift%EF%BC%9Ahttp://thrift.apache.org/docs/BuildingFromSource

  1. windows

本文以 windows 环境为例,从官方下载 exe 文件,下载地址:http://archive.apache.org/dist/thrift/%EF%BC%8C%E4%B8%8B%E8%BD%BD%E6%9C%80%E6%96%B0%E7%89%88%EF%BC%8C%E5%A6%82%E4%B8%8B%E5%9B%BE


image.png

将下载的 exe 文件改名为 thrift.exe,然后可以放到任意PATH路径下面,例如放在$GOROOT/bin下:

image.png

打开 cmd,验证是否成功:

image.png

看到如上版本号,就说明thrift安装成功了。

Thrift 类型

Thrift 中的类型包括基础类型、结构、容器、异常、服务等几个部分。(官网介绍:https://thrift.apache.org/docs/types

  1. 基本类型
  • bool :布尔型,1个字节
  • byte :有符号整数,1个字节
  • i16 :有符号16位整型
  • i32 :有符号32位整型
  • i64 :有符号64位整型
  • double :64位浮点数值
  • string :字符串类型,使用UTF-8编码
  1. 特殊类型
  • binary :二进制数据类型(字节数组)
  1. 结构

Thrift 结构定义了一个公共对象,它们本质上等同于OOP语言中的类,但没有继承。结构有一组强类型字段,每个字段都具有唯一的名称标识符。字段可能有各种注释(数字字段ID、可选默认值等)。thrift IDL(Interface Definition Language)规范详见官网介绍:thrift.apache.org/docs/idl

示例:

struct SharedStruct {
  1: i32 key = 0,
  2: string value,
}
复制代码
  1. 结构体中每一个域都有一个正整数标识符,这个标识符并不要求连续,但一旦定义,不建议再进行修改。
  2. 每个域前都会有requiredoptional
  • required:必填域,如果设置了 required,在实际构造结构体时就必须给这个域赋值,否则 thrift 会认为这是一个异常。
  • optional:可选域,如果设置了 optional,在实际构造结构体时没有给这个域赋值,则在使用这个结构体时,就会忽略掉这个 optional 域。
  • 域是可以设置默认值的,如上key = 0
  1. 容器

有三种容器类型:

  • list<t1> :单类型有序列表,允许有重复元素,会被转换成C++中的vector,Java中的 ArrayLis等
  • set<t1> :单类型无需集合,不允许有重复元素,会转换成C++中的set,Java中的HashSet、Python中的Set等
  • map<t1,t2> :Map型(key:value),会被转换成C++中的map,Java中的HashMap,PHP中的关联数组等

容器元素可以是任何有效的Thrift 类型,注意:map 的key类型需要是基础类型,很多开发语言并不支持 map 的 key 类型为复杂数据类型。

  1. 异常

异常在语法上和结构的用法是完全一致的,不过 exception 是在远程调用发生异常时用来抛出异常用的。

  1. 服务

服务是由 Thrift 类型定义的。服务的定义在语义上等同于面向对象中定义接口(或纯虚拟抽象类)。Thrift 编译工具会根据定义的服务来生成对应的方法和函数。

thrift 文件解析

注释

thrift 文件注释有三种形式:

#
/**/
//
复制代码

示例解析

/**
 * .thrift文件可以引用其他.thrift文件,这样可以方便地把一些公共结构和服务引入进来。
 * 在引用其他.thrift文件时,既可以直接引用当前文件夹下的文件,也可以引用其他路径下的文件,但后者需要在thrift编译工具编译时加上 -I 选项来设定路径。
 * 如果希望访问被包含的.thrift文件中的内容,则需要使用.thrift文件的文件名作为前缀,比如 shared.SharedObject。
 * 本例中引用了文件 shared.thrift
*/
include "shared.thrift"
/**
 * thrift支持针对不同的语言设置不同的 namespace,thrift会在生成不同语言代码时,进行相应的设置。
*/
namespace java tutorial
namespace go tutorial
// 使用 typedef 定义别名
typedef i32 MyInteger
/**
 * 定义常量. 复杂的类型和结构体使用JSON表示法. 
 */
const i32 INT32CONSTANT = 9853
const map<string,string> MAPCONSTANT = {'hello':'world', 'goodnight':'moon'}
/**
 * 枚举是32位整型数字, 如果没有显式指定值,默认从1开始编号并递增.
 */
enum Operation {
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}
/**
 * 结构体由一组成员来组成, 一个成员包括数字标识符, 类型, 符号名, 及一个可选的默认值.
 * 每个域都可以设置为optional或required来表示是否为必填域,
 * 以便thrift决定是否在数据传输时要包含这个域。
 * 不指定时,默认为required。
 */
struct Work {
  1: i32 num1 = 0,
  2: i32 num2,
  3: Operation op,
  4: optional string comment,
}
// 结构体也可以作为异常,在语法上,异常的定义方式和结构体是完全一样的
exception InvalidOperation {
  1: i32 whatOp,
  2: string why
}
/**
 * 定义服务需要一个服务名, 加上一个可选的继承, 使用extends关键字 
 */
service Calculator extends shared.SharedService {
  /**
   * 服务中方法的定义非常类似于C语言的语法。包括一个返回值,
   * 一个参数列表以及一个可以抛出的异常列表(可选)
   * 定义参数列表的方法、定义异常列表的方法,和定义结构体的方法
   * 都是相似的,可以从下面的例子中看出。
   * 注意,除了最后一个方法,其他的方法最后都要有一个逗号。
   */
   void ping(),
   i32 add(1:i32 num1, 2:i32 num2),
   /**
   * 在异常列表前,需要加throws关键字。
   */
   i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
   /**
   * 这个方法有 oneway 修饰符, 表示客户段发送一个请求后会立即返回,
   * 不会等待回应(oneway在英语里就是“单向”的意思)。
   * oneway 方法的返回值必须是 void
   */
   oneway void zip()
}


相关文章
|
6天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
5天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
13 2
|
5天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
16 2
|
9天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
85 58
|
8天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
5天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
13 4
|
5天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
18 1
|
9天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
9天前
|
Go 数据处理 调度
探索Go语言的并发模型:Goroutines与Channels的协同工作
在现代编程语言中,Go语言以其独特的并发模型脱颖而出。本文将深入探讨Go语言中的Goroutines和Channels,这两种机制如何协同工作以实现高效的并发处理。我们将通过实际代码示例,展示如何在Go程序中创建和管理Goroutines,以及如何使用Channels进行Goroutines之间的通信。此外,本文还将讨论在使用这些并发工具时可能遇到的常见问题及其解决方案,旨在为Go语言开发者提供一个全面的并发编程指南。
|
6天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。