目录
服务拆分
服务拆分注意事项
服务间调用
步骤一:注册RestTemplate
步骤二:修改业务层代码
总结:
提供者和消费者
思考
服务调用关系
服务拆分
服务拆分注意事项
单一职责:不同微服务,不要重复开发相同业务
数据独立:不要访问其他微服务的数据库
面向服务:将自己的服务暴露为接口,供其他服务调用
注意:不同的微服务应该有自己的数据库
服务间调用
步骤一:注册RestTemplate
在你的微服务的主启动类中
将resttemplate对象交给springboot管控,加入到IOC容器中,使用的时候可以直接自动装配。
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.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();
}
}
步骤二:修改业务层代码
其中比以前多了一个自动装配的对象,就是restTemplate。
然后我们可以调用它的方法就可以远程调用其他微服务的接口获得它的返回值对象,我们只需要提供访问路径和返回值的字节码就可以,当然还有很多的构造方法,你可以看源码去了解,并不局限于着一种方法。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 4.返回
String url="http://localhost:8081/user/"+order.getUserId();
User user = restTemplate.getForObject(url, User.class);
order.setUser(user);
return order;
}
}
其中红色的部分就是调用另一个微服务接口获得的数据。
总结:
基于RestTemplate发起的http请求实现远程调用;
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数就可以。
提供者和消费者
服务提供者:一次业务中,被其他微服务调用的服务。(提供接口给其他微服务)。
服务消费者: 一次业务中,调用其他微服务的服务。(调用其他微服务提供的接口)。
思考
服务A调用服务B,服务B调用服务C,那么服务B是什么角色?
服务调用关系
提供者和消费者角色其实是相对的
一个服务可以同时是服务提供者和服务消费者。