【微服务技术03】服务拆分–远程调用RestTemplate
案例代码:https://gitee.com/pikachu2333/spring-cloud-hexuan
拆分原则
1.单一职责:不同微服务,不要重复开发相同业务
562.数据独立:不要访问其它微服务的数据库
3.面向服务:将自己的业务暴露为接口,供其它微服务调用
案例:远程调用–用户微服务+订单微服务
要求:
- 订单微服务和用户微服务都必须有各自的数据库,相互独立
- 订单服务和用户服务都对外暴露Restful的接口
- 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
接口准备
order-service服务接口
@Autowired
private OrderService orderService;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
// 根据id查询订单并返回
return orderService.queryOrderById(orderId);
}
user-service服务接口
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
RestTemplate远程调用
注册RestTemplate
在order-service的入口OrderApplication中注册RestTemplate
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
在order查询到订单后利用RestTemplate发起http请求,查询用户信息
@Autowired
private RestTemplate restTemplate;
@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId) {
Order order = orderService.queryOrderById(orderId);
String url = "http://localhost:8081/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
return order;
}
总结
基于RestTemplate发起的http请求实现远程调用
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。