RestTemplate案例代码
在使用Spring Cloud开发之前,可以先做一个小案例来感受一下远程调用会出现哪些问题。
在Spring Boot和Restful开发的几个微服务之间进行远程调用会有很多组件和方法可供选择,其中比较方便的就有Spring的RestTemplate,它一般在消费端使用,用来调用其他服务端的远程方法。
在消费端的Spring Boot启动类中:
/**
* 注⼊RestTemplate
* @return
*/
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
在消费端的Controller中:
import org.springframework.web.client.RestTemplate;
……
@Autowired
private RestTemplate restTemplate;
……
/**
*handler方法中:以get示例,也可以调用post、put、delete等不同的http方法,当然restTemplate有很多返回值类型,根据需要进行选择使用
*第一个参数是要调用的远程url地址,第二个参数是调用结果的返回值类型
* @return
*/
Integer forObject = restTemplate.getForObject("http://localhost:8080/shop/order/" + orderId,Integer.class);
如此,消费端便拿到所调用的微服务返回的结果forObject,很方便。
案例代码问题分析
我们在案例代码中使⽤RestTemplate调⽤服务端微服务的简历状态接⼝时(Restful API 接⼝)在微服务分布式集群环境下会存在什么问题呢?怎么解决?
存在的问题:
- 在服务消费者中,我们把url地址硬编码到代码中,不⽅便后期维护。
- 服务提供者只有⼀个服务,即便服务提供者形成集群,服务消费者还需要⾃⼰实现负载均衡。
- 在服务消费者中,不清楚服务提供者的状态(比如是否宕机)。
- 服务消费者调⽤服务提供者时候,如果出现故障能否及时发现,并且不向⽤户抛出异常⻚⾯,即返回一个比较友好的结果。
- RestTemplate这种请求调⽤⽅式是否还有优化空间(不拼接url)?能不能类似于Dubbo那样做?(Dubbo消费者拿了提供者的接口放在了自己的模块中,像调用本地方法一样调用了远程接口)
- 这么多的微服务,统⼀认证如何实现?
- 配置⽂件每次都修改好多个很麻烦。
……
上述分析出的问题,其实就是微服务架构中必然⾯临的⼀些问题:
- 服务管理:⾃动注册与发现、状态监管
- 服务负载均衡
- 熔断
- 远程过程调⽤
- ⽹关拦截、路由转发
- 统⼀认证
- 集中式配置管理,配置信息实时⾃动更新
这些问题,Spring Cloud体系都有解决⽅案。