SpringBoot远程过程调用RPC(WebClient、HTTP Interface客户端)

目录

  • 1. 远程过程调用介绍
  • 2. WebClient
    • 2.1 pom.xml添加依赖
    • 2.2 发送请求的内容
    • 2.3 WebClient.builder()
    • 2.4 使用示例
  • 3. HTTP Interface
    • 3.1 pom.xml添加依赖
    • 3.2 使用示例

1. 远程过程调用介绍

远程过程调用

以前有sdk(Software Development Kit)工具包,导入jar包,直接调用功能即可。而远程过程调用由服务提供者提供API(接口: Application Programming Interface)服务,服务消费者通过连接对方服务器进行请求\响应交互,来实现调用效果

有两种应用场景:

  • 如果是内部微服务,可以通过依赖springcloud、注册中心、openfeign等进行调用。或使用第三方框架Dubbo、gRPC
  • 如果是外部暴露的,可以发送http请求、或遵循外部协议进行调用。SpringBoot提供了轻量级客户端方式:
    • RestTemplate: 普通开发
    • WebClient: 非阻塞、响应式编程开发
    • Http Interface: 声明式编程

2. WebClient

2.1 pom.xml添加依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><scope>test</scope></dependency>

2.2 发送请求的内容

  • 请求方式: GET\POST\DELETE\xxxx
  • 请求路径: /xxx
  • 请求参数:key1=value1&key2=value2
  • 请求头: header1=value1,header2=value2
  • 请求体:json、文件、流

2.3 WebClient.builder()

可以使用WebClient.builder()配置更多参数项:

  • uriBuilderFactory: 自定义UriBuilderFactory ,定义baseurl
  • defaultUriVariables: 默认uri变量
  • defaultHeader: 每个请求默认头
  • defaultCookie: 每个请求默认cookie
  • defaultRequest: Consumer自定义每个请求
  • filter: 过滤 client发送的每个请求
  • exchangeStrategies: HTTP消息reader/writer自定义
  • clientConnector: HTTP client库设置

2.4 使用示例

也可以请求github提供的免费地址: https://api.github.com/search/users?q=username。注意不要请求太频繁

package com.hh.springboot3test.service;import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.Map;@Service
public class IpService {public Mono<String> queryIp(String ip) {// 创建WebClient// WebClient.create(String baseUrl)WebClient client = WebClient.create();// 准备数据Map<String, String> params = new HashMap<>();params.put("ip", ip);// 定义发请求行为, 类似CompletableFuture的异步发送Mono<String> mono = client.get().uri("http://whois.pconline.com.cn/ipJson.jsp?ip={ip}}", params).accept(MediaType.APPLICATION_JSON)    // 定义响应的内容类型.retrieve().bodyToMono(String.class);// 直接返回给RestContoller,返回给前端,可以正常显示return mono;}}
  • 可以通过toEntity(User.class)获取响应完整信息,返回Mono<ResponseEntity<User>>类型的数据
  • 可以通过bodyToFlux(User.class)获取stream数据,返回Flux<User>类型的数据
  • 可以通过onStatus(HttpStatus::is4xxClientError, response -> {......})定义错误处理

3. HTTP Interface

SpringBoot允许我们通过定义接口的方式,给任意位置发送http请求,实现远程调用

3.1 pom.xml添加依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><scope>test</scope></dependency>

3.2 使用示例

IpInterface.java: 定义一个接口,里面说明请求的子url、接收类型、请求参数

package com.hh.springboot3test.service;import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.service.annotation.GetExchange;
import reactor.core.publisher.Mono;public interface IpInterface {@GetExchange(url = "/ipJson.jsp", accept = "application/json")// 方法接收ip,然后通过@RequestParam将ip传递给url的ip参数// 也可以通过@RequestHeader("header1")将值传递给请求的header1Mono<String> queryIp(@RequestParam("ip") String ip);
}

IpService.java: 主要提供了baseUrl,然后就可以发送ip参数,获取结果了

package com.hh.springboot3test.service;import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.support.WebClientAdapter;
import org.springframework.web.service.invoker.HttpServiceProxyFactory;
import reactor.core.publisher.Mono;@Service
public class IpService {public Mono<String> queryIp(String ip) {// 创建客户端WebClient client = WebClient.builder().baseUrl("http://whois.pconline.com.cn").codecs(clientCodecConfigurer -> {clientCodecConfigurer.defaultCodecs().maxInMemorySize(256 * 1024 * 1024);// 响应数据量太大有可能会超出BufferSize,所以这里设置的大一点}).build();// 创建工厂HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();// 获取代理对象IpInterface ipApi = factory.createClient(IpInterface.class);return ipApi.queryIp(ip);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/421450.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

填空题如何去掉答案?教你3个去除小妙招

填空题如何去掉答案&#xff1f;在日常学习过程中&#xff0c;将写过的试卷填空题去掉答案&#xff0c;是一种非常有效的学习方法&#xff0c;可以帮助学生们更好地巩固和扩充知识点。首先&#xff0c;去掉答案可以让学生们重新审视题目&#xff0c;加深对知识点的理解。其次&a…

如何使用CRM实现销售流程自动化?CRM如何提高销售效率?

科技在当今时代扮演着重要的角色。在商业领域&#xff0c;我们用很多不同的软件来完成业务、提高效率。销售被认为是一个企业的灵魂。没有销售&#xff0c;企业很难生存。为了使销售更加有效&#xff0c;自动化是每个企业都应该采用的一个重要战略。实现销售过程自动化最简单的…

springboot+mysql马拉松赛事志愿者管理系统-计算机毕业设计源码93439

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对马拉松赛事志愿者管理等问题&#xff0c;对…

Python进阶-Anaconda使用总结

本文是 Anaconda 的使用总结&#xff0c;旨在帮助用户快速搭建 Python 环境、进行数据科学和机器学习工作。首先&#xff0c;介绍了在 Windows 系统上安装 Anaconda 的步骤&#xff0c;包括下载安装程序、配置环境变量以及验证安装。随后&#xff0c;详细列举了 Anaconda 的常用…

【C++干货基地】namespace超越C语言的独特魅力(文末送书)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

【Coding】寒假每日一题Day.5.三国游戏

题目来源 题目来自于AcWing平台&#xff1a;https://www.acwing.com/problem/content/description/4968/。 以blog的形式记录程序设计算法学习的过程&#xff0c;仅做学习记录之用。 题目描述 输入输出格式与数据范围 样例 思路 思路参考自题解&#xff1a;https://www.acwi…

高效构建Java应用:Maven的使用总结

一、Maven简介和快速入门 1.1 Maven介绍 Maven-Introduction Maven 是一款为 Java 项目构建管理、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 总结&#xff1a;Maven…

C++入门之基础语法

目录 一.关键字 二.命名空间 2.1命名空间域 2.2展开命名空间域 using namespace bit 使用using将命名空间中的某个成员引入 2.3 头文件#include 2.3.1 头文件的展开和命名空间的展开区别 2.4 C的标准的库命名空间std 2.5 命名空间的套娃 三. C输入输出 3.1 流插入co…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…

MSVS C# Matlab的混合编程系列2 - 构建一个复杂(含多个M文件)的动态库:

前言: 本节我们尝试将一个有很多函数和文件的Matlab算法文件集成到C#的项目里面。 本文缩语: MT = Matlab 问题提出: 1 我们有一个比较复杂的Matlab文件: 这个MATLAB的算法,写了很多的算法函数在其他的M文件里面,这样,前面博客的方法就不够用了。会报错: 解决办法如下…

CC工具箱使用指南:【复制字段】

一、简介 这个工具的目的将一个图层的多个字段批量复制到另一个图层中。 假定这样一个场景&#xff0c;手头有一个要素1&#xff0c;要素里有10个字段&#xff0c;另一个要素2&#xff0c;除了shape_area等图形字段外&#xff0c;没有其它字段。 现在的需求是&#xff0c;想…

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装&#xff1a; git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时&#xff0c;可以在原命令基础上加上地址&#xff1a; https://mirror.ghproxy.com git clon…