假设我们需要根据订单id查询订单的同时,把订单所属的用户信息一起返回。
在之前我们可能会在先查询订单信息,然后将根据用户订单中id查询用户,之后将查出来的用户封装到一个订单信息的resultMap中后进行返回订单信息。
而微服务的远程调用则不用那么繁琐,他可以通过一个请求路径url进行直接查询用户信息,这就代表我们在查询订单信息的时候,只需要访问一个user请求的url就可以查出来对应的用户信息,然后直接对订单信息中的用户信息进行赋值。
而这种调用的实现就需要依靠RestTemplate
Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。
就是这个样子的实现方式:
public Order queryOrderById(Long orderId) {
Order order = orderMapper.findById(orderId);
String url = "http://127.0.0.1:8080/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
return order;
}
思考:
虽然这种方法实现了一个远程的调用,但是对于微服务来说,提供者和消费者可能有多种,对应的地址也有很多,那么我们怎么能实现一个动态修改url呢
- 服务消费者该如何获取服务提供者的地址信息?
- 如果有多个服务提供者,消费者该如何选择?
- 消费者如何得知服务提供者的健康状态?
在之前写过一个dubbo架构的博客,其中介绍了注册中心,去实现一个远程调用。
同样springcloud也引入了一个注册中心去实现一个远程调用,常用的有eureka和nacos,在下一篇博客会讲到。