==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍
首先,解释一下为什么要和thrift服务拆分出来。
- 微服务的思想,将一个系统拆分成各个独立的服务,解耦开来,但是注意调用链路不宜过长。否则会影响性能和加大问题的排查难度。
- web服务在整个前后端系统中,充当前端和后端的中间人,前端一般通过http请求到web服务,web服务再通过RPC调用thrift服务。
和从零开发一个后端服务(三)–thrift 服务骨架编写一样,先创建一个空的maven工程,再创建模块,这么做的目的是方便管理,比如日后你想加个小模块,直接在这个工程新建一个模块即可。
一、创建springboot模块
选择组件的时候,要勾选web组件,一般选spring web starter,看下面解释,也说了,可以构建一个restful web service。
创建完成后如图
咋一看,好像和之前的thrift服务没有什么不同,不要急,等我把controller实现了就能发现不同了。
二、搭建controller层
@RestController
@RequestMapping("/calculate")
public class CalculateController {
@GetMapping("/add/{num1}/{num2}")
public Object add(@PathVariable("num1") double num1, @PathVariable("num2") double num2){
return num1 + num2;
}
@GetMapping("/sub/{num1}/{num2}")
public Object sub(@PathVariable("num1") double num1, @PathVariable("num2") double num2){
return num1 - num2;
}
@GetMapping("/mul")
public Object mul(@RequestParam("num1") double num1, @RequestParam("num2") double num2){
return num1 * num2;
}
@GetMapping("/div")
public Object div(@RequestParam("num1") double num1, @RequestParam("num2") double num2){
return num1 / num2;
}
}
搭完框架后,测试一下http请求是否正常,直接启动服务。然后用postman测试
1+2, localhost:8080/calculate/add/1/2
1-2, localhost:8080/calculate/sub/1/2
1*2, localhost:8080/calculate/mul?num1=1&num2=2
1/2, localhost:8080/calculate/div?num1=1&num2=2
测试结果正常。
三、调用thrift服务
引入min-system-core包
<dependency>
<groupId>com.acme.service</groupId>
<artifactId>min-system-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
修改后的controller代码如下
@RestController
@RequestMapping("/calculate")
public class CalculateController {
@GetMapping("/add/{num1}/{num2}")
public Object add(@PathVariable("num1") double num1, @PathVariable("num2") double num2) throws TException {
return calculate(new Expression(OPERATE.ADD, num1, num2));
}
@GetMapping("/sub/{num1}/{num2}")
public Object sub(@PathVariable("num1") double num1, @PathVariable("num2") double num2) throws TException {
return calculate(new Expression(OPERATE.SUB, num1, num2));
}
@GetMapping("/mul")
public Object mul(@RequestParam("num1") double num1, @RequestParam("num2") double num2) throws TException {
return calculate(new Expression(OPERATE.MUL, num1, num2));
}
@GetMapping("/div")
public Object div(@RequestParam("num1") double num1, @RequestParam("num2") double num2) throws TException {
return calculate(new Expression(OPERATE.DIV, num1, num2));
}
private double calculate(Expression expression) throws TException {
// 创建 TTransport
TTransport transport = new TSocket("127.0.0.1", 8081, 2000);
// 创建 TProtocol
TProtocol protocol = new TBinaryProtocol(transport);
// 创建客户端.
TCalculate.Client client = new TCalculate.Client(protocol);
// 打开 TTransport
transport.open();
// 调用服务方法
ExpressionResult result = client.calculate(expression);
transport.close();
return result.getResult();
}
}
测试一下是否正常,先启动thrift服务,端口不要是8080,改成其他的,因为Tomcat的默认端口是8080,这样会占用起不来。
启动thrift服务
启动web服务
postman测试正常,就不重复发截图了。
四、总结
- web服务和thrift服务的区别,就是web服务多了web组件,springboot启动时候,会启动内置的tomcat容器。
- web服务和thrift服务通信,web通过socket和thrift服务通信,thrift服务和web服务通过http通信,但是一般不会反过来调用,这样很不规范。
- thrift服务和web服务的demo写得些许潦草,但是不着急,后续会逐步优化。
- 接下来会开始搭建linux环境,然后把服务部署上去,是不是看上去越来越有模有样了,嘿嘿。越到后面越好玩,我会将这些个大箱子拆开,看看里面究竟是咋回事。
==> CODE