RestTemplate、WebClient与HttpInterface

RestTemplate、WebClient与HttpInterface

SpringBoot中集成了很多轻量级的Http客户端
  • RestTemplate:普通开发
  • WebClient:响应式编程开发
  • HttpInterface:声明式编程
响应式编程介绍

响应式编程(Reactive Programming)是一种编程范式,用于处理异步数据流事件流。它基于观察者模式函数式编程的概念,通过使用流(Stream)或者事件(Event)来处理数据的变化和交互。

在响应式编程中,数据流被看作是一个连续的时间序列,程序可以订阅这个数据流,并对数据的变化做出相应的处理。当数据发生变化时,程序会自动更新相关的操作,而无需手动干预。

响应式编程具有以下特点:

  • 响应式:能够对数据流中的变化做出及时响应,而无需手动触发。

  • 异步:能够处理异步操作,如网络请求或用户交互。

  • 延迟执行:只有在真正需要结果时才会执行相关操作

  • 可组合性:能够将多个操作组合在一起,形成复杂的数据流处理逻辑。

  • 错误处理:能够处理异常和错误,并提供相应的处理机制。

响应式编程在很多场景下都具有优势,例如用户界面的响应性、数据流的处理和分析等。

RestTemplate与WebClient区别

RestTemplate采用同步阻塞的方式运行,WebClient采用异步非阻塞的方式运行,只用需要WebClient返会的结果时对应的方法才会执行

使用WebClient

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>

构建业务

@Service
public class CityServiceImpl implements CityService {@Overridepublic Mono<String> query(String city) {WebClient webClient = WebClient.create();Map<String, String> param = new HashMap<>();param.put("city", "西安");return webClient.get().uri("https://wttr.in/{city}?lang=zh", param).accept(MediaType.ALL).retrieve().bodyToMono(String.class);}
}
package com.vmware.controller;import com.vmware.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@RequestMapping("/city")
@RestController
public class CityController {@Autowiredprivate CityService cityService;@GetMapping("/{city}")public Mono<String> city(@PathVariable String city) throws InterruptedException {Mono<String> mono = cityService.query(city);return query;}
}
  • 注意:mono对象被返回之前实际上接口处于未调用状态,当返回后延时调用
HttpInterface

介绍:HttpInterfaces是由spring6.0引入的新的http调用方式,通过声明接口的方式对http请求进行调用,与传统硬编码的方法有所不同,依赖于spring-boot-starter-webflux

基本使用

package com.vmware.service;import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.service.annotation.GetExchange;
import reactor.core.publisher.Mono;public interface CityWebClientService {@GetExchange(url = "https://wttr.in/{city}?lang=zh")Mono<String> getWeather(@PathVariable String city);
}
@Overridepublic Mono<String> queryByWebClient(String city) {WebClient client = WebClient.builder().baseUrl("https://wttr.in").codecs(clientCodecConfigurer -> {clientCodecConfigurer.defaultCodecs().maxInMemorySize(256 * 1024 * 1024);//修改默认的buffer大小}).build();//创建工厂HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();//创建代理对象CityWebClientService service = factory.createClient(CityWebClientService.class);return service.getWeather(city);}

工程化使用

  • WebClientHttpServiceProxyFactory使用配置类注入到容器中
  • 将对应的WebClient请求接口代理后注入到容器中
  • 在对应的业务中进行注入WebClient请求接口
package com.vmware.config;import com.vmware.service.CityWebClientService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.support.WebClientAdapter;
import org.springframework.web.service.invoker.HttpServiceProxyFactory;@Configuration
public class WebClientConfig {/*** @apiNote 配置WebClient* @return*/@Beanpublic WebClient httpServiceProxyFactory() {return WebClient.builder().codecs(clientCodecConfigurer -> {clientCodecConfigurer.defaultCodecs().maxInMemorySize(256 * 1024 * 1024);//修改默认的buffer大小}).build();}/*** @apiNote 构建 HttpServiceProxyFactory* @param client* @return*/@Beanpublic HttpServiceProxyFactory factory(WebClient client) {//创建工厂return HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();}/*** @apiNote 代理HttpClient接口* @param factory* @return*/@Beanpublic CityWebClientService cityWebClientService(HttpServiceProxyFactory factory) {return factory.createClient(CityWebClientService.class);}
}
package com.vmware.service.impl;import com.vmware.service.CityService;
import com.vmware.service.CityWebClientService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
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;import java.util.HashMap;
import java.util.Map;@Service
public class CityServiceImpl implements CityService {@Autowiredprivate CityWebClientService cityWebClientService;@Overridepublic Mono<String> queryByWebClient2(String city) {return cityWebClientService.getWeather(city);}
}

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

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

相关文章

如何在免费版 pycharm 中使用 github copilot (chatGPT)?

起因 在 vscode 中使用了 github copilot 以后&#xff0c;感觉这个人工智能还不错。 但 vscode 对于 python 项目调试并不是特别方便&#xff0c;所以想在 Pycharm 中也能使用同一个 github 账号&#xff0c;用上 copilot 的功能。 不需要等待&#xff0c;安装即用&#xff…

【Web 表单】与用户数据打交道-1(mdn笔记)

0. Web 表单指南 我们将介绍 Web 表单的各个方面&#xff1a;HTML 结构、样式、验证表单数据&#xff0c;以及提交数据到服务器。 基本指南 你的第一个表单 第一次创建 HTML 表单的经验&#xff0c;包括设计一个简单表单、使用正确的 HTML 元素实现它、通过 CSS 添加一些非常简…

从vue3速学react

单位老项目vue2,新项目vue3,业务已经熟练使用vue了&#xff0c;空余时间自学下react&#xff0c;写个博客记录下 react没有双向绑定&#xff0c;用的是jsx语法&#xff0c;useState后面是初始化值&#xff0c;需要改变data的时候&#xff0c;需要用定义的setXXX来改变XXX值&am…

【Spring Cloud一】微服务基本知识

系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念&#xff1a; 四、共识算法 前言 在实际项目开发过程中&#xff0c;目前负责开发…

Ruff代码分析

Ruff是一个用 Rust 语言编写的高性能的 Python 静态代码分析工具&#xff0c;比其它分析工具快几个数量级&#xff08;10-100 倍&#xff09;&#xff0c;而且功能也很全面。 即 Linter&#xff0c;用于检查代码中的语法错误、编码规范问题、潜在的逻辑问题和代码质量问题等&a…

Golang 中实现实时聊天通讯

客户端代码 package mainimport ("fmt""log""net/url""os""os/signal""time""github.com/gorilla/websocket" )func main() {interrupt : make(chan os.Signal, 1)signal.Notify(interrupt, os.Interr…

webpack5 学习之路

1.视频 01-课程介绍_哔哩哔哩_bilibili 2.配套资料 依赖环境 | 尚硅谷 Web 前端之 Webpack5 教程 3.webpack 官方文档 入口起点(entry points) | webpack 中文文档 4.vue cli 官方文档 介绍 | Vue CLI 挖矿&#xff1a;Coding Tree

lombok

lombok lombok是一个简化java代码编写的工具类&#xff0c;可以简化javabean的编写&#xff0c;可以通过注解的方式消除代码中的构造方法&#xff0c;getter/setter等代码&#xff0c;简化类的编写。 Lombok原理分析 Lombok核心在于对注解的解析上。JDK5引入了注解的同时&…

ES派生类的prototype方法中,不能访问super的解决方案

1 下面的B.prototype.compile方法中&#xff0c;无法访问super class A {compile() {console.log(A)} }class B extends A {compile() {super.compile()console.log(B)} }B.prototype.compile function() {super.compile() // 报错&#xff0c;不可以在此处使用superconsole.…

Spring?Boot项目如何优雅实现Excel导入与导出功能

目录 背景EasyExcel 问题分析与解决Spring Boot Excel 导入与导出 依赖引入Excel 导入 基本导入功能进阶导入功能Excel 导出 Excel 导入参数校验 开启校验 校验规则定义 Bean Validation 定义校验规则ExcelValidator 接口定义校验规则校验结果接收 异常捕获接收校验结果contro…

小研究 - 主动式微服务细粒度弹性缩放算法研究(三)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

SDWAN组网案例——跨国游戏公司

XYZ Game Studios是一家国际知名的游戏开发公司&#xff0c;其游戏产品广受欢迎&#xff0c;拥有全球范围的玩家基础。由于游戏的在线特性和全球用户分布&#xff0c;XYZ Game Studios面临着跨国游戏服务器之间的网络连接和稳定性问题。他们希望提供更稳定、高效的游戏体验&…

使用 Go 语言实现二叉搜索树

原文链接&#xff1a; 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构&#xff0c;在很多项目中都能看到二叉树的身影。 它有很多变种&#xff0c;比如红黑树&#xff0c;常被用作 std::map 和 std::set 的底层实现&#xff1b;B 树和 B 树&#xff0c;…

Total Variation loss

Total Variation loss 适合任务 图像复原、去噪等 处理的问题 图像上的一点点噪声可能就会对复原的结果产生非常大的影响&#xff0c;很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性&#xff0c;图片中相邻像素值的差异可以通过…

使用 Webpack 优化前端开发流程

在现代前端开发中&#xff0c;构建工具的选择和优化流程的设计至关重要。Webpack 是一个功能强大的前端构建工具&#xff0c;能够优化我们的开发流程&#xff0c;提高开发效率和项目性能。本文将介绍如何使用 Webpack 来优化前端开发流程。 代码优化和资源管理也是前端项目中不…

传统计算机视觉

传统计算机视觉 计算机视觉难点图像分割基于主动轮廓的图像分割基于水平集的图像分割交互式图像分割基于模型的运动分割 目标跟踪基于光流的点目标跟踪基于均值漂移的块目标跟踪基于粒子滤波的目标跟踪基于核相关滤波的目标跟踪 目标检测一般目标检测识别之特征一般目标检测识别…

18.Netty源码之ByteBuf 详解

highlight: arduino-light ByteBuf 是 Netty 的数据容器&#xff0c;所有网络通信中字节流的传输都是通过 ByteBuf 完成的。 然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类&#xff0c;为什么 Netty 还要去重复造轮子呢&#xff1f;本节课我会详细地讲解 ByteBuf。 JDK NIO…

Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持

目录 十五、面向切面编程AOP 15.1 AOP介绍 总结 15.2 AOP的七大术语 15.3 切点表达式 15.4 使用Spring的AOP 15.4.1 准备工作 15.4.1.1Spring AOP 基于注解之实现步骤 15.4.1.2-Spring AOP 基于注解之切点表达式 代码 运行结果&#xff1a; 代码 运行结果 通知类…

Python高阶技巧 递归

递归的定义 函数作为一种代码封装&#xff0c;可以被其他程序调用&#xff0c;当然&#xff0c;也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。 递归的思想 把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时&#…

SpringBoot集成Thymeleaf

Spring Boot 集成 Thymeleaf 模板引擎 1、Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板&#xff0c;既可以在浏览器中正确显示的 HTML&#xff0c;也可以用作静态原型&#xf…