【从零搭建后端基础设施系列(三)】--thrift 服务骨架编写

==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍


因为第一部分只是将最小系统骨架搭建出来,能部署,接口调通就行。
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
原创文章 257 获赞 277 访问量 69万+

猜你喜欢

转载自blog.csdn.net/qq_18297675/article/details/96912359