服务调用
首先想一想,在用户下单时需要调用商品微服务获取商品数据,那应该怎么做呢?总人皆知商品微服务提供了供人调用的HTTP接口。所以可以再下定单的时候使用http请求的相关工具类完成,如常见的HttpClient,OkHttp,当然也可以使用Spring提供的RestTemplate。
1.RestTemplate介绍
Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。类有关。RestTemplate类的设计原则与许多其他Spring 模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。
2.RestTemplate的使用
1.首先注册一个RestTemplate的实例到Spring容器,在服务提供者的启动类中注册一个Bean
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
2.接下来我们就可以使用这个restTemplate去进行远程调用另一个服务
在需要调用的实现类里自动装配进来
@Autowired
private RestTemplate restTemplate;
使用restTemplate进行调用
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.利用RestTemplate发起http请求,查询用户
// 2.1.url路径
String url = "http://127.0.0.1:8081/user/" + order.getUserId();
// 2.2.发送http请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
那么现在我们就使用了restTemplate进行了远程调用
3.提供者和消费者
在服务调用的关系中,会产生提供者和消费者这两个不同的角色,
1.服务提供者:就是提供接口给其它微服务
2.服务消费者:是调用其他微服务所提供的接口
那如果有A,B,C三个服务,那么A调用B而B又调用了C,对于A调用B来说,A是服务消费者,B就是服务提供者,对于B调用了C,那么B是服务消费者,C是服务提供者。