YuXuan
发布于 2020-07-18 / 33 阅读
0

RestTemplate的使用

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 接⼝)在微服务分布式集群环境下会存在什么问题呢?怎么解决?
存在的问题:

  1. 在服务消费者中,我们把url地址硬编码到代码中,不⽅便后期维护。
  2. 服务提供者只有⼀个服务,即便服务提供者形成集群,服务消费者还需要⾃⼰实现负载均衡。
  3. 在服务消费者中,不清楚服务提供者的状态(比如是否宕机)。
  4. 服务消费者调⽤服务提供者时候,如果出现故障能否及时发现,并且不向⽤户抛出异常⻚⾯,即返回一个比较友好的结果。
  5. RestTemplate这种请求调⽤⽅式是否还有优化空间(不拼接url)?能不能类似于Dubbo那样做?(Dubbo消费者拿了提供者的接口放在了自己的模块中,像调用本地方法一样调用了远程接口)
  6. 这么多的微服务,统⼀认证如何实现?
  7. 配置⽂件每次都修改好多个很麻烦。
    ……

上述分析出的问题,其实就是微服务架构中必然⾯临的⼀些问题:

  1. 服务管理:⾃动注册与发现、状态监管
  2. 服务负载均衡
  3. 熔断
  4. 远程过程调⽤
  5. ⽹关拦截、路由转发
  6. 统⼀认证
  7. 集中式配置管理,配置信息实时⾃动更新

这些问题,Spring Cloud体系都有解决⽅案。