服务拆分注意事项:
- 不同微服务,不要重复开发相同业务
- 微服务数据独立,不要访问其他微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其他微服务调用
微服务远程调用
远程调用方式分析:
订单模块不能直接调用用户模块的数据库。如果订单模块能够向浏览器一样对用户模块发起请求调用接口,就可以查到用户信息。
问题:如何在java代码中发起http请求?
实现:在order模块中远程调用user
步骤一:注入RestTemplate Bean对象
注册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);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
步骤二:service中调用 restTemplate调用什么类型的接口就 .get/post类型的方法
第一个参数是url,第二个参数是返回的类型
服务远程调用RestTemplate
修改order-service中的OrderService的queryOrderById方法:
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId){
// 1. 查询订单
Order order = orderMapper.findById(orderId);
// 2. 查询用户
String url = "http://localhost:8081/user/*"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
// 3. 封装user信息
order.setUser(user);
// 4. 返回
return order;
}
}
总结
微服务调用方式:
基于RestTemplate发起的http请求实现远程调用。
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。
远程调用
提供者和消费者
服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他服务)
服务消费者:一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)
思考:服务A调用服务B,服务B调用服务C,那么服务B是什么角色?
提供者和消费者角色其实是相对的。
一个服务既可以是消费者,也可以是提供者。