一、单体服务演示
两个服务:order-service 和uesr-service
- 数据库表结构
此处模拟出两个不同的模块使用不同的数据库的情况。
- 项目工程
-
order服务
@Service public class OrderService { @Resource private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.返回 return order; } }
-
OrderMapper
public interface OrderMapper { @Select("select * from tb_order where id = #{id}") Order findById(Long id); }
-
user服务
@Service public class UserService { @Resource private UserMapper userMapper; public User queryById(Long id) { return userMapper.findById(id); } }
-
UserMapper
public interface UserMapper { @Select("select * from tb_user where id = #{id}") User findById(@Param("id") Long id); }
-
pojo
-
user
@Data public class User { private Long id; private String username; private String address; }
-
order
@Data public class Order { private Long id; private Long price; private String name; private Integer num; private Long userId; private User user; }
-
-
Order中包含User的信息,Order服务的数据库表中只存储了userId字段,如果这个时候我们分别启动两个服务,来看看效果。
3. 分别启动效果
可以看到8080端口的order并未返回user的详细信息。如果要获取user的详细信息则需要实现两个服务之间的通信。
二、实现远程调用
(一)实现服务间通信(RestTemplate)
- 注入RestTemplate
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 使用RestTemplate进行通信
@Service
public class OrderService {
@Resource
private OrderMapper orderMapper;
@Resource
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用restTemplate发起http请求
String url = "http://localhost:8081/user/"+order.getUserId();
ResponseEntity<User> user = restTemplate.getForEntity(url, User.class);
order.setUser(user.getBody());
// 3.返回
return order;
}
}
(二)查看效果
重新启动服务查看效果
可以看到user已经有了详细信息。