服务拆分和远程调用
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:
评论区