服务拆分和远程调用
1.服务拆分原则
这里我总结了微服务拆分时的几个原则:
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
2.服务拆分示例
cloud-demo:父工程,管理依赖
- order-service:订单微服务,负责订单相关业务
- user-service:用户微服务,负责用户相关业务
要求:
- 订单微服务和用户微服务都必须有各自的数据库,相互独立
- 订单服务和用户服务都对外暴露Restful的接口
- 订单服务如果需要查询用户信息,只能调用用户服务的Restful接口,不能查询用户数据库
俩服务对应的数据库如下:
order-service
user-service
启动项目:
3.实现远程调用
在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查询用户的接口:
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; /** * 路径: /user/110 * * @param id 用户id * @return 用户 */ @GetMapping("/{id}") public User queryById(@PathVariable("id") Long id) { return userService.queryById(id); }
}
查询的结果如图:
案例需求:
修改order-service中的根据id查询订单业务,要求在查询订单的同时,根据订单中包含的userId查询出用户信息,一起返回。
(1).注册RestTemplate
首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } //注册RestTemplate @Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
}
(2).实现远程调用
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法
@Service public class OrderService { @Autowired private OrderMapper orderMapper; @Resource private RestTemplate restTemplate; //注入RestTemplate public Order queryOrderById(Long orderId) { // 1.查询订单 Order order = orderMapper.findById(orderId); // 2.远程查询User // 2.1.url地址(根据order表中的userId查询) String url = "http://localhost:8081/user/" + order.getUserId(); // 2.2.发起调用 User user = restTemplate.getForObject(url, User.class); // 3.存入order order.setUser(user); // 4.返回 return order; }
}
这样就实现了远程调用,查询order时远程查询user:
评论区