1 基本语法

1.1 数据类型

基本类型:
bool 布尔类型,true或者false
byte 字节类型,长度为8位,有符号
i16 16位有符号整形,java中的short
i32 32位有符号整形,java中的int
i64 64位有符号整形,java中的long
double 64位浮点数
string 一串编码未知的文本或二进制串 需要注意的是,没有无符号整形。这是兼容多种语言所要求的(utf-8编码的字符串)。

特殊类型:
binary:未经过编码的字节流,java中的ByteBuffer。

容器类型:
Thrift支持三种容器:

  • list 列表容器,会被直接转化为STL的vector, JAVA的ArrayList和其他脚本语言的内置数组.
  • set 元素无序唯一的集合容器,会被转化为STL set,JAVA HashSet, Python set或内置PHP/Ruby的内置字典.
  • map<type1, type2> 一个key唯一的key-value映射map,会被转化为STL map, Java HashMap, PHP 关联数组, 或Python/Ruby的字典.
    容器的类型可以是任何有效的Thrift类型,包括其他容器和结构体.

结构体:
一个Thrift struct定义了一个用于多语言的通用对象,基本上相当于面向对象语言中的一个类。一个结构体的例子如下:

struct Example {1:i32 number=10,2:i64 bigNumber,3:double decimals,4:string name="thrifty"
}

异常:
异常的语法和结构体基本相同,除了异常使用的关键字是exception而不是struct. 生成的对象会继承目标语言的异常基类,以便和任何指定语言的异常处理机制更好的整合.

枚举:
可以像C/C++那样定义枚举类型,如:

enum TweetType {TWEET,RETWEET = 2,DM = 0xa,REPLY
}struct Tweet {1: required i32 userId;2: required string userName;3: required string text;4: optional Location loc;5: optional TweetType tweetType = TweetType.TWEET6: optional string language = "english"
}

说明:
编译器默认从0开始赋值
可以赋予某个常量某个整数
允许常量是十六进制整数
末尾没有逗号
给常量赋缺省值时,使用常量的全称。

服务
服务是基于Thrift类型定义的. 服务的定义在语义上大概相当于面向对象语言中定义一个接口或一个纯虚抽象类. Thrift编译器会生成实现该接口的全功能客户端和服务端桩代码. 服务定义类似如下:

service <name> {<returntype> <name>(<arguments>)[throws (<exceptions>)]...
}

实例如下:

service StringCache {void set(1:i32 key, 2:string value),string get(1:i32 key) throws (1:KeyNotFound knf),void delete(1:i32 key)
}

注释:
Thrift支持Shell注释风格,也支持C/C++的单行和多行注释风格.

# shell风格注释./** 多行注释* 类似C/C++/Java*/// C++/Java 当行注释

名空间:
Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了一种组织(隔离)代码的方式。因为每种语言均有自己的命名空间定义方式(如python中有module),thrift允许开发者针对特定语言定义namespace:

namespace cpp com.example.project  // a
namespace java com.example.project // b 说明: a.  转化成namespace com { namespace example { namespace project { b.  转换成package com.example.project

文件包含
Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象,如:

#include "tweet.thrift"
...
struct TweetSearchResult {1: list<tweet.Tweet> tweets;

} * 注意包含时的tweet前缀
常量
Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。

const i32 INT_CONST = 1234;    // 分号是可选的
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"} // 复杂结构可以使用JSON表示

Union:
Union:类似于C++的union,成员默认全部是optional类型,语法

union 名称标识 {
数字标识: (required|optional)? 类型 名称标识 (= 值)?
}
//示例
union SomeUnion {2: string string_thing,3: i32 i32_thing
}

2 springBoot+thrift

thrift接口生成工具下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/thrift/

生成代码的命令:

thrift --gen <language> <Thrift filename>

如果有thrift文件中有包含其他thrift,可以使用递归生成命令:

thrift -r --gen <language> <Thrift filename>

2.1 创建一个HelloService.thrift文件

namespace java com.example.thrift.service
service HelloService {string sayHello(1:string message);
}

2.2 在thrift文件所在的目录下执行命令

thrift --gen java HelloService

执行之后,会在HelloService.thrift目录下生成一个gen-java目录,里面有个生成的HelloService.java文件,这个就是用来实现远程调用的接口,然后,复制到我们项目对应的位置。 【提示:执行命令的时候可以直接在idea的控制台执行】

2.3 springBoot引入thrift依赖

<dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>选择版本</version>
</dependency>

2.4 实现接口

实现上面生成的HelloService接口

package com.example.thrift.service;import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.TException;@Slf4j
public class HelloServiceImpl implements HelloService.Iface {@Overridepublic String sayHello(String message) throws TException {log.info("<<<收到消息:{}", message);return "Hi, I'm Server!";}
}

2.5 实现服务端

下一个thrift server

package com.example.thrift.server;import com.example.thrift.service.TestService;
import com.example.thrift.service.TestServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;@Slf4j
public class ThriftServer {public void start() {try {log.info(">>>Thrift服务端开启");TServerSocket serverSocket = new TServerSocket(1998); //服务端口1998TProcessor tProcessor = new TestService.Processor<TestService.Iface>(new TestServiceImpl());//BIO单线程版//TSimpleServer.Args sArgs = new  TSimpleServer.Args(serverSocket);//sArgs.processor(tProcessor);  //注册服务//TServer server = new TSimpleServer(sArgs);//BIO多线程版TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(serverSocket);tArgs.processor(tProcessor); //注册服务tArgs.minWorkerThreads(2); //设置线程池核心线程数量tArgs.maxWorkerThreads(10); //设置线程池最大线程数量TServer server = new TThreadPoolServer(tArgs);server.serve();} catch (Exception e) {log.error("Thrift服务发生错误:", e);}}
}

Thrift提供了两种线程版本,一个是单线程的一个是多线程的。另外一点要注意的是服务端server是会阻塞主线程的,所以在server开启之后不要有任务其他操作,否则是运行不到的。在SpringBoot初始化的过程中也不要启动服务,因为SpringBoot默认是以类名称排序去扫描包下面的配置或者组件等等,如果Thrift服务类名称在其他配置前面,刚好你在初始化Thrift的时候顺便也启动了服务的话,那么其他的Spring配置就会不能初始化了,所以可以在SpringBoot完全初始化之后再启动Thrift,或者干脆起一个线程跑Thrift服务。

2.6 编写客户端

package com.example.thrift.client;import com.example.thrift.service.HelloService;
import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;@Slf4j
public class ThriftClient {public static void main(String[] args) {TTransport transport = null;try {//TSocket 参数分别是:服务器地址,端口,连接超时时间(毫秒)transport = new TSocket("localhost", 1998, 30000);TProtocol protocol = new TBinaryProtocol(transport);HelloService.Client client = new HelloService.Client(protocol);transport.open();//这里得到返回数据是同步的String reply = client.sayHello("Hello, I'm Client");log.info(">>>收到回复消息:{}", reply);//如果需要异步,不要返回数据可以使用send_***方法//client.send_sayHello("Hello, I'm Client ~ ");//注意recv_***方法是同步的,会阻塞到收完数据//String reply = client.recv_sayHello();//log.info(">>>收到回复消息:{}", reply);} catch (Exception e) {log.error("Thrift客户端发生错误", e);} finally {if (transport != null) {transport.close();}}}
}

以上为用BIO的方式创建的服务端和客户端,提高效率可以修改为用NIO的方式实现,自己动手尝试一下吧

thrift+springBoot相关推荐

  1. SpringBoot整合Apache Thrift

    文章目录 引言 目标 代码仓库 & Demo 从Spring Starter项目结构说起 项目结构 连接池 连接池整体配置 连接池工厂 创建连接池 Client整合 注解定义 工作原理 项目启 ...

  2. SpringBoot整合RPC框架---Thrift

    文章目录 什么是Thrift 架构 支持的通讯协议 支持的传输协议 支持的服务模型 Thrift的优点 SpringBoot整合Thrift 为什么会出现RPC框架 常见的RPC框架集成套路 开撸 官 ...

  3. springboot整合Thrift

    什么是Thrift Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务.它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为"大规模跨语言服务开发 ...

  4. SpringBoot整合Grpc实现跨语言RPC通讯

    什么是gRPC gRPC是谷歌开源的基于go语言的一个现代的开源高性能RPC框架,可以在任何环境中运行.它可以有效地连接数据中心内和跨数据中心的服务,并提供可插拔的支持,以实现负载平衡,跟踪,健康检查 ...

  5. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  6. SpringBoot优雅编码之:Lombok加持

    概述 Lombok 通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码.典型的是对于 POJO对象的简化(如自动帮我们生成Setter和Getter等),有了Lombok ...

  7. 基于thrift的微服务框架

    前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...

  8. server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...

    Thrift 是什么研究分布式调用链工具pinpoint的时候,在源码里看到了Thrift相关的代码,所以来了兴趣,想研究研究这个框架.Thrift 目前是 Apache 的一个项目,但是它是由fac ...

  9. SpringBoot热部署加持

    概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件.或者一些诸如xml的配置文件.以及一些静态文件生效,这样耗时又低效.所谓的热部署指的是 ...

  10. Springboot 整合 Netty 实战(附源码)

    作者:pjmike_pj juejin.im/post/5bd584bc518825292865395d 前言 这一篇文章主要介绍如何用Springboot 整合 Netty,由于本人尚处于学习Net ...

最新文章

  1. Ubuntu 10.10系统安装手记
  2. java运行在用户态_理解Linux用户态和内核态
  3. 读写分离原来这么简单,一个小注解就够了
  4. 机器学习如何帮助企业高效地管理数据?
  5. 给部署在openshift上的WordPress添加wptouch插件
  6. python-list列表排序问题 sort 与 sorted
  7. PHP调用WebService接口
  8. 机试指南第二章-经典入门-查找例题自解
  9. web自动化原理揭秘
  10. 查看eclipse中项目部署位置
  11. 如何用EasyRecovery找回已经删除的图片?
  12. 【软件工具使用】高效使用 Visio 绘图
  13. python ip地址处理_Python学习笔记-IP地址处理模块Ipy
  14. CTF实验吧-登陆一下好吗??【false SQL注入】
  15. [解题报告]【第16题】给定 n,打印一个直角边为 n 的等边直角三角形
  16. PP报工确认bapi:BAPI_PRODORDCONF_CREATE_TT
  17. BeagleBone Black Industrial系统更新设置一贴通
  18. 数据库——postgresql数据库中standard_conforming_strings对‘\\’的影响
  19. 台式计算机如何升级,老电脑如何升级 老电脑升级方法【详细介绍】
  20. Android微信浏览器标题,微信浏览器设置网页标题

热门文章

  1. vue4 跳转外部链接_vue项目跳转到外部链接
  2. linux各个版本简介 (未完待续)
  3. php表格 单元格,实例演示PhpSpreadsheet的单元格设置教程
  4. 理解与应用css中的display属性
  5. 2021-08-18-ideal配置github时报:insufficient scopes granted to the token
  6. matlab的containers.Map类型介绍
  7. 前期总结+开学展望(WYL)
  8. autojs遍历当前页面所有控件_移动端控件(一)-弹窗(Alert/Dialog)
  9. 【长难句分析精讲】状语从句
  10. ITIL 服务台:ITSM帮助员工创建实践