小白的学习笔记——服务拆分和远程调用
很久没写随笔了,这些东西早就该写了。
一、服务拆分和远程调用
(一)服务拆分
任何分布式架构都离不开服务的拆分,微服务也是一样。
微服务拆分时有这样几个原则:
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
比如现在有一个Demo工程,它结构下有两个子工程:
- Order-Service:订单微服务,负责订单相关业务
- User-Service:用户微服务,负责用户相关业务
那么它们两个应该满足以下要求:
- 订单微服务和用户微服务都必须有各自的数据库,相互独立
- 订单服务和用户服务都对外暴露Restful的接口
- 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能直接查询用户数据库
通过例子,我觉得服务拆分的概念与SpringBoot中分层解耦的三层架构的概念有一定相似度。微服务架构将应用程序拆分为多个独立的服务,每个服务都是一个独立的模块,具有自己的功能和数据。同样,Spring Boot的三层架构也将应用程序的不同部分划分为独立的层次,每个层次负责不同的任务,具有相对独立性。(欢迎讨论)
二、远程调用
在Order-Service服务中,有一个根据id查询订单的接口:
点击查看代码
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
}
根据id查询订单,返回值是Order对象,如图:
其中的user为null
在User-Service中有一个根据id查询用户的接口:
查询结果:
我们需要修改Order-Service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。
我们需要在Order-Service中 向User-Service发起一个http的请求,调用http://localhost:8081/user/{userId}这个接口
首先,注册RestTemplate
我们在order-service服务中创建配置类,注册RestTemplate实例:
点击查看代码
@Configuration
public class RestTemplateConfig {
/*
* 创建RestTemplate对象并注入到SpringIOC容器中
* */
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
然后,实现远程调用
修改order-service服务中的OrderService类中的queryOrderById方法:
点击查看代码
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
//url路径
String url = "http://localhost/8081/user/" + order.getUserId();
//发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class); //反序列化
// 3.封装user信息
order.setUser(user);
// 4.返回
return order;
}
}
实际上,这种方法的局限性很大,而且代码非常繁琐,我们一般会基于Fegin来进行远程调用,在之后的学习中会提到。