爱学it学无止境

一般情况下,我们在进行HTTP请求时常会借助各种工具类。我相信大家之前可能经常自行封装httputils等类,或者使用其他官方提供的工具。比如,今天我们来讲解一下RestTemplate工具类。它其实就是一个用来发送HTTP请求的工具,只不过它在此基础上多做了一些额外的工作。接下来我们先看一下它的基本用法。

RestTemplate

RestTemplate 是由 Spring 框架提供的一个功能强大的类,专门用于进行同步客户端的 HTTP 访问。它的设计旨在简化使用 HTTP 客户端进行 REST 调用的复杂流程,并提供了丰富的方法和功能来处理各种 HTTP 请求和响应。

创建 RestTemplate 实例

首先,你需要创建一个 RestTemplate 的实例。这可以通过直接实例化或使用Spring的自动装配来完成。

import org.springframework.web.client.RestTemplate;

RestTemplate restTemplate = new RestTemplate();

发送请求

使用 RestTemplate 发送一个GET请求并获取响应体。

String url = "http://example.com/api/resource";
String result = restTemplate.getForObject(url, String.class);
System.out.println(result);

发送一个POST请求,通常包含请求体。

String url = "http://example.com/api/resource";
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("key1", "value1");
requestMap.put("key2", "value2");

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestMap, headers);
String response = restTemplate.postForObject(url, entity, String.class);
System.out.println(response);

看到这里,你可能会想到,这与微服务间的通信有什么关系呢?难道不只是简单的 HTTP 调用吗?让我们继续深入探讨。

LoadBalanced注解

微服务架构中通常会涉及到注册中心。今天我们专注讨论微服务间的通信,而不深入讲解注册中心,例如 Nacos 是如何管理所有微服务的注册以及如何使一个服务节点发现其他服务节点的。假设我们已经获得了其他服务节点的 IP 地址,你可能会想直接将上述示例中的域名替换为 IP 地址,但是在面对保证高可用的多节点微服务时,直接在代码中写死 IP 地址将会带来灾难性的后果。所有的 IP 地址应当由一个统一组件进行管理和选择。

因此,Ribbon应运而生。一般情况下,如果在项目的pom文件中集成了Nacos依赖,通常会默认包含Ribbon组件,因此不需要单独配置pom文件来引入Ribbon依赖。

基本用法

如前所述,一种方法是直接实例化对象,另一种则是通过Spring容器进行管理和注入。

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

这样一来,当需要使用时,就可以轻松地进行服务调用操作。

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/findOrderByUserId/{id}")
    public R findOrderByUserId(@PathVariable("id") Integer id) {
        String url = "http://mall-order/order/findOrderByUserId/"+id;
        R result = restTemplate.getForObject(url,R.class);
        return result;
    }
}

注意,mall-order可不是我们说的网站域名,而是我们配置在nacos等注册中心的服务名。

添加了LoadBalanced注解后,RestTemplate会自动注入所需的依赖项,具体的实现可以通过查看源代码来了解。

源码分析

关于Spring的自动配置,我之前在讲解Spring时提到过很多次,这里就不再详细展开了。我们可以看到它实现了SmartInitializingSingleton接口,因此,想要使用负载均衡功能,必须等到所有的bean都加载完毕才能进行。