RPC远程调用

36 阅读2分钟

RPC远程调用

RPC(远程过程调用):像调用本地方法一样去调用远端的接口。

角色接口名称职责
提供者 (Provider)接口 A被动方。等着别人传 token过来,它只负责“读”和“回”。
调用者 (Consumer)接口 B主动方。构造请求,把 token塞进 Header,发给 A,再看 A 回传的是不是对的。

pom.xml引入Hutool依赖

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.all.version}</version>
</dependency>

Hutool 发送请求

针对最为常用的GET和POST请求,HttpUtil封装了两个方法,

  • HttpUtil.get
  • HttpUtil.post

这两个方法用于请求普通页面,然后返回页面内容的字符串,同时提供一些重载方法用于指定请求参数(指定参数支持File对象,可实现文件上传,当然仅仅针对POST请求)。

GET请求:

// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");

// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);

//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");

String result3= HttpUtil.get("https://www.baidu.com", paramMap);

POST请求:

HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");

String result= HttpUtil.post("https://www.baidu.com", paramMap);

携带自定义请求头(Header)

这是实现 token 校验的关键。当需要设置 Header 时,必须使用 HttpRequest 类:

String result = HttpRequest.post(url)
    .header("token", "your_token_value") // 设置请求头
    .form(paramMap)                      // 设置表单参数
    .execute()
    .body();                             // 获取响应内容

实现基础通信

① 编写接口 A (服务端)

这个接口通过 @RequestHeader 注解直接获取。

@GetMapping("/interfaceA")
public String interfaceA(@RequestHeader("token") String token) {
    // 逻辑:从 Header 中获取 token 并原样返回
    System.out.println("接口A收到Token: " + token);
    return token; 
}

② 编写接口 B (调用端)

接口 B 会用到 Hutool 去访问上面的接口 A。

@GetMapping("/interfaceB")
public String interfaceB(String testToken) {
    // 1. 定义请求的目标地址(接口A的URL)
    String url = "http://localhost:8080/interfaceA";

    // 2. 使用 Hutool 发起带 Header 的请求
    String resultToken = HttpRequest.get(url)
            .header("token", testToken) // 设置变化的 token
            .execute()
            .body();

    // 3. 检查并返回结果
    if (testToken.equals(resultToken)) {
        return "验证成功,返回的Token是: " + resultToken;
    } else {
        return "验证失败!";
    }
}