==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
因为第一部分只是将最小系统骨架搭建出来,能部署,接口调通就行。
PS:目前我也没想到有什么有难度,又有趣的项目,所以在写第一部分的时候,就先搭个骨架,第二部分再想想写个什么好,总得给自己找点乐趣,哈哈。
一、编写thrift文件,生成java文件
1.创建一个maven工程
什么都不选,一路next
2.创建完后,将src目录删掉
创建之后
删掉src之后
3.接着右键单击thriftservice文件夹,选择新建一个module,也是选择maven工程
创建完成后如下所示
4.工程建好之后,接下来开始编写thrift文件了,首先先把thrift生成插件引入,以及thrift静态库引入
<dependencies>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.11.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.acme.plugins</groupId>
<artifactId>gen-thrift</artifactId>
<version>1.0.0-SNAPSHOT</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
开始编写thrift文件
Dto.thrift
namespace java com.acme.service.Dto
include 'Enums.thrift'
struct Expression {
1:required Enums.OPERATE op;
2:double num1;
3:double num2;
}
struct ExpressionResult {
1:double result;
}
Enums.thrift
namespace java com.acme.service.Enums
enum OPERATE {
ADD,
SUB,
MUL,
DIV,
}
Exception.thrift
namespace java com.acme.service.Exception
exception MinSystemException {
1:i32 code;
2:string message;
}
Service.thrift
namespace java com.acme.service.service
include 'Dto.thrift'
include 'Exception.thrift'
service TCalculate {
Dto.ExpressionResult calculate(1:Dto.Expression exp) throws (1:Exception.MinSystemException ex);
}
注意:如果不加上namespace包名,那么打成jar包的时候,别的项目也只能在java包下的类能引用到。
编写完,结构如图所示
接下来运行插件,生成java文件
运行完如下图所示(嘿嘿,还挺好用,就是第一次run的时候,gen-java目录老是乱入,需要再run一次,以后改进一下)
5.最后将thrift-api打成jar包
记得设置版本号和打包方式
然后用maven插件打包即可
二、编写thrift服务
其实就是实现thrift定义的接口
1.创建springboot工程
新建一个module
因为是thrift服务,所以不需要web组件,就选一个lombok就行了,这个后续再介绍,这个只是写一些domain的时候,更简洁。
创建完成的结构如图
2.实现thrift接口
min-system-service引入min-system-core的包
<dependency>
<groupId>com.acme.service</groupId>
<artifactId>min-system-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
编写TCalculateImpl类,实现TCalculate.Iface同步接口
package com.acme.service.minsystemservice.thriftservice;
import com.acme.service.Dto.Expression;
import com.acme.service.Dto.ExpressionResult;
import com.acme.service.Exception.MinSystemException;
import com.acme.service.service.TCalculate;
import org.apache.thrift.TException;
import org.springframework.stereotype.Service;
/**
* @author acme
* @date 2019/7/24 11:41 PM
*/
@Service
public class TCalculateImpl implements TCalculate.Iface {
@Override
public ExpressionResult calculate(Expression exp) throws MinSystemException, TException {
switch (exp.getOp()){
case ADD: return new ExpressionResult(exp.getNum1() + exp.getNum2());
case SUB: return new ExpressionResult(exp.getNum1() - exp.getNum2());
case MUL: return new ExpressionResult(exp.getNum1() * exp.getNum2());
case DIV: {
if(exp.getNum2() == 0){
throw new MinSystemException(1000, "除数不能为0");
}
return new ExpressionResult(exp.getNum1() / exp.getNum2());
}
}
return null;
}
}
3.编写thrift服务端启动代码
@SpringBootApplication
public class MinSystemServiceApplication {
public static void main(String[] args) throws TTransportException {
SpringApplication.run(MinSystemServiceApplication.class, args);
start();
}
public static void start() throws TTransportException {
//创建一个处理器,看代码最后new TCalculateImpl()就知道,thrift需要知道,是哪个类来处理接口的请求。
TProcessor tProcessor = new TCalculate.Processor<TCalculate.Iface>(new TCalculateImpl());
//创建一个服务端socket,最简单的,只需要指定绑定的端口
TServerSocket serverTransport = new TServerSocket(8080);
//暂且理解为使用thrift的默认传输协议,我也没具体研究
TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
//将参数设置进去
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tProcessor);
tArgs.protocolFactory(protocolFactory);
// 创建 TServer
TServer server = new TSimpleServer(tArgs);
// 启动 thrift.Server
System.out.println("[info] min system bootup successful on ip:");
server.serve();
}
}
4.编写thrift客户端测试代码
@Test
public void testConnect() throws TException {
// 创建 TTransport
TTransport transport = new TSocket("127.0.0.1", 8080, 2000);
// 创建 TProtocol
TProtocol protocol = new TBinaryProtocol(transport);
// 创建客户端.
TCalculate.Client client = new TCalculate.Client(protocol);
// 打开 TTransport
transport.open();
// 调用服务方法
ExpressionResult result = client.calculate(new Expression(OPERATE.ADD, 1, 2));
System.out.println(result.getResult());
transport.close();
}
5.测试接口
先启动服务端,然后启动测试代码调用接口
启动成功,接着启动测试代码
测试1+2
测试1/0
总结搭建thrift后端服务步骤:
- 编写thrift文件,生成java文件
- 将生成的java文件打成jar包
- 创建springboot模块,引入上面的core包
- 实现接口
- 编写服务端启动代码
- 编写客户端测试代码
- 测试接口
==> CODE