SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用?
1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。
2)Okhttp
一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代 HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。
3)HttpURLConnection
HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送 GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。
4)RestTemplate WebClient
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。

上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便,它就是 Feign。

一 Feign介绍

Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。

Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。

Spring Cloud Openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便。

优势
Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。

二 Spring Cloud Alibaba快速整合OpenFeign

引入依赖

<!‐‐ openfeign 远程调用 ‐‐>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>

编写调用接口+@FeignClient注解

@FeignClient(value = "mall‐order",path = "/order")public interface OrderFeignService {@RequestMapping("/findOrderByUserId/{userId}")public R findOrderByUserId(@PathVariable("userId") Integer userId);}/*
* 添加feign接口和方法
* name 指定调用rest接口所对应的服务名
* path 指定调用rest接口所在的StockController指定的@RequestMapping
* */
@FeignClient(name="stock-service",path ="/stock",configuration = FeignConfig.class)
public interface StockFeignService {// 声明需要调用的rest接口对应的方法,没有实现类:动态代理@RequestMapping("/reduct")String reduct();
}

调用端在启动类上添加@EnableFeignClients注解

@EnableFeignClients

发起调用,像调用本地方式一样调用远程服务

@RestController@RequestMapping("/user")public class UserController {@AutowiredOrderFeignService orderFeignService;@RequestMapping(value = "/findOrderByUserId/{id}")public R findOrderByUserId(@PathVariable("id") Integer id) {//feign调用R result = orderFeignService.findOrderByUserId(id);return result;}}

三 Spring Cloud Feign的自定义配置及使用

Feign 提供了很多的扩展机制,让用户可以更加灵活的使用

3.1 日志配置

有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置 Feign 的日志了,以此让 Feign 把请求信息输出来

第一种:全局配置,定义一个配置类,指定日志级别,全局生效

import feign.Contract;
import feign.Logger;
import feign.Request;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//服务调用方进行配置
// 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置(也就是相当于局部配置了)
@Configurationpublic class FeignConfig {/*** 日志级别** @return*/@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}}

注意使用的包:
在这里插入图片描述

通过源码可以看到日志等级有 4 种,分别是:

  • NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
  • BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
  • HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
  • FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。

第二种:局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类
局部配置有两种:配置类和配置文件

使用局部配置-配置类的话,还是要先新建上边的配置类,只不过上边的配置类不能加@Configuration注解了。

注意下边,一定要使用@PathVariable("userId")指定参数,否则报错
在这里插入图片描述

在yml配置文件中执行 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径=debug"

logging:level:com.maltose.mall.feigndemo.feign: debug

测试:BASIC级别日志
在这里插入图片描述

补充:局部配置可以在yml中配置
对应属性配置类:
org.springframework.cloud.openfeign.FeignClientProperties.FeignClientConfiguration

# feign日志局部配置
feign:client:config:product-service: #服务名loggerLevel: BASICcontract: feign.Contract.Default #设置为默认的契约  (还原成原生注解)# 连接超时时间,默认2sconnectTimeout: 5000# 请求处理超时时间,默认5sreadTimeout: 10000requestInterceptors[0]:com.tulingxueyuan.order.intercptor.feign.CustomFeignInterceptor

3.2 契约配置

Spring Cloud 在 Feign 的基础上做了扩展,使用 Spring MVC 的注解来完成Feign的功能。原生的 Feign 是不支持 Spring MVC 注解的,如果你想在 Spring Cloud 中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring Cloud 中默认的是SpringMvcContract

Spring Cloud 早期版本就是用的原生Fegin. 随着netflix的停更,替换成了Open feign。即旧Spring Cloud项目升级的话,就得了解契约配置了。

修改契约配置,支持Feign原生的注解

在上边的FeignConfig.java类里添加:

/*** 修改契约配置,支持Feign原生的注解* @return*/@Beanpublic Contract feignContract() {return new Contract.Default();}

注意:修改契约配置后,OrderFeignService 不再支持springmvc的注解,需要使用Feign原生的注解

OrderFeignService 中配置使用Feign原生的注解

@FeignClient(value = "mall‐order",path = "/order")public interface OrderFeignService {//必须指定请求方式@RequestLine("GET /findOrderByUserId/{userId}")//对应之前springmvc里的RequestMapping注解public R findOrderByUserId(@Param("userId") Integer userId);//Param对应PathVariable注解       }

补充,也可以通过yml配置契约

feign:client:config:mall‐order: #对应微服务loggerLevel: FULLcontract: feign.Contract.Default #指定Feign原生注解契约配置

在这里插入图片描述

3.3 自定义拦截器实现认证逻辑

public class FeignAuthRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {// 业务逻辑  如:记录日志String access_token = UUID.randomUUID().toString();template.header("Authorization",access_token);}
}@Configuration // 全局配置public class FeignConfig {@Beanpublic Logger.Level feignLoggerLevel() {return Logger.Level.FULL;}/*** 自定义拦截器* @return*/@Beanpublic FeignAuthRequestInterceptor feignAuthRequestInterceptor(){return new FeignAuthRequestInterceptor();}
}

测试
在这里插入图片描述
补充:可以在yml中配置

feign:client:config:mall‐order: #对应微服务requestInterceptors[0]: #配置拦截器com.tuling.mall.feigndemo.interceptor.FeignAuthRequestInterceptor

mall-order端可以通过@RequestHeader获取请求参数
建议在filter,interceptor中处理

3.4 超时时间配置

通过 Options 可以配置连接超时时间和读取超时时间,Options 的第一个参数是连接的超时时间(ms),默认值是 2s;第二个是请求处理的超时时间(ms),默认值是 5s。

全局配置

@Configurationpublic class FeignConfig {@Beanpublic Request.Options options() {return new Request.Options(5000, 10000);}}

yml中配置

 feign:client:config:mall‐order: #对应微服务# 连接超时时间,默认2sconnectTimeout: 5000# 请求处理超时时间,默认5sreadTimeout: 10000

补充说明: Feign的底层用的是Ribbon,但超时时间以Feign配置为准

3.5 客户端组件配置

Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient,OkHttp

Feign发起调用真正执行逻辑:feign.Client#execute (扩展点)
在这里插入图片描述

3.5.1 配置Apache HttpClient

引入依赖

<!‐‐ Apache HttpClient ‐‐>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.7</version>
</dependency>
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign‐httpclient</artifactId><version>10.1.0</version>
</dependency>

然后修改yml配置,将 Feign 的 Apache HttpClient启用 :

feign:#feign 使用 Apache HttpClient 可以忽略,默认开启httpclient:enabled: true

关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration
在这里插入图片描述
测试:调用会进入feign.httpclient.ApacheHttpClient#execute

3.5.2 配置 OkHttp

引入依赖

<dependency><groupId>io.github.openfeign</groupId><artifactId>feign‐okhttp</artifactId>
</dependency>

然后修改yml配置,将 Feign 的 HttpClient 禁用,启用 OkHttp,配置如下

feign:#feign 使用 okhttphttpclient:enabled: falseokhttp:enabled: true

关于配置可参考源码: org.springframework.cloud.openfeign.FeignAutoConfiguration
在这里插入图片描述
测试:调用会进入feign.okhttp.OkHttpClient#execute

3.6 GZIP 压缩配置

开启压缩可以有效节约网络资源,提升接口性能,我们可以配置 GZIP 来压缩数据

feign:# 配置 GZIP 来压缩数据compression:request:enabled: true# 配置压缩的类型mime‐types: text/xml,application/xml,application/json# 最小压缩值min‐request‐size: 2048response:enabled: true

注意:只有当 Feign 的 Http Client 不是 okhttp3 的时候,压缩才会生效,配置源码在FeignAcceptGzipEncodingAutoConfiguration
在这里插入图片描述
核心代码就是 @ConditionalOnMissingBean(type="okhttp3.OkHttpClient"),表示 Spring BeanFactory 中不包含指定的 bean 时条件匹配,也就是没有启用 okhttp3 时才会进行压缩配置。

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

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

相关文章

COB显示屏厂家为您详细解析COB显示屏的制造流程

倒装COB显示屏所采用的工艺与传统SMD LED显示屏完全不同&#xff0c;其是直接把LED发光芯片封装于PCB基板之上&#xff0c;因此其能够提供更小的像素间距&#xff0c;并且产品表面覆盖有高分子材料涂层&#xff0c;能够增强产品的防磕碰能力以及防水能力&#xff0c;在之前的文…

STM32开发方式的演变与未来展望

一、STM32开发方式的演变 自2007年STM32微控制器首次亮相以来&#xff0c;其开发方式经历了从寄存器到标准库&#xff0c;再到HAL&#xff08;硬件抽象层&#xff09;的演变。 1.寄存器开发&#xff08;2007年-2010年代初&#xff09; 最初&#xff0c;由于初期缺乏足够的软…

使用AI的100种方法#翻译神器N3

Text "100 ways to" and "use AI" in the poster center .A cozy desk setup with an open notebook featuring notes and drawings, a cup of coffee, a white pen, and dried flowers. Warm, earthy tones create a calming, aesthetic vibe. 第 3 种可能…

【每日一练】python运算符

1. 算术运算符 编写一个Python程序&#xff0c;要求用户输入两个数&#xff0c;并执行以下运算&#xff1a;加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数&#xff1a;") b input("请输入第二个数&…

15秒下雨短视频:成都柏煜文化传媒有限公司

15秒下雨短视频&#xff1a;瞬间的诗意与情感共鸣 在数字时代的浪潮中&#xff0c;短视频以其独特的魅力&#xff0c;成为了人们生活中不可或缺的一部分。其中&#xff0c;一段仅15秒的下雨短视频&#xff0c;成都柏煜文化传媒有限公司 或许在时间长河中只是一瞬间&#xff0c…

集群分布式储存

硬件&#xff1a; 存储柜 软件 &#xff1a; software define storage 分布式存储 是一种独特的系统架构由一组能够通过网络连通&#xff0c;为了完成共同任务而协调任务的计算机节点组成分布式是为了使用廉价的普通的计算机完成复杂的计算和存储任务目的就是利用更多的机…

【详细】CNN中的卷积计算是什么-实例讲解

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、 CNN的基础卷积计算1.1.一个例子了解CNN的卷积计算是什么1.2.卷积层的生物意义 二、卷积的拓展&#xff1a;多输入通道与多输出通道2.1.多输入通道卷积2.2.多输出通道卷积 三、卷积的实现3.1.pytorch实现卷积…

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存&#xff0c;提前响应&#xff0c;降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

搭建Renesas R7FA8D1BHECBD-BTB的开发调试环境(DAP-LINK: N32G45XVL-STB)

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL产生测试项目 2.1 FSP生成项目 2.2 Keil中配置 3 硬件连接框图 4 一个测试案例 4.1 功能介绍 4.2 定时器函数 5 测试 搭建Renesas R7FA8D1BHECBD-BTB的开发调试环境&#xff08…

MySQL【触发器、存储过程、函数、范式】

day53 MySQL 触发器 创建触发器&#xff1a;&#xff08;before &#xff1a; 前置触发器、after &#xff1a;后置触发器&#xff09; 语法&#xff1a; delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…

重磅!UOSDN焕新,开启创新之旅!

亲爱的开发者们 经过精心打磨和优化 全新改版的UOSDN&#xff08;统信开发者支持网络&#xff09; 已经正式上线啦&#xff01; 我们致力于为您打造一个更加便捷、高效、富有创意和互动性的开发平台&#xff0c;详情&#x1f449;https://uosdn.uniontech.com/ 以UOSDN作为载…

数字信号处理实验四(FIR数字滤波器设计)

FIR数字滤波器设计&#xff08;2学时&#xff09; 要求&#xff1a; 设计一个最小阶次的低通FIR数字滤波器&#xff0c;性能指标为&#xff1a;通带0Hz~1500Hz&#xff0c;阻带截止频率2000Hz&#xff0c;通带波动不大于1%&#xff0c;阻带波动不大于1%&#xff0c;采样频率为8…

常见的反爬手段和解决思路(爬虫与反爬虫)

常见的反爬手段和解决思路&#xff08;爬虫与反爬虫&#xff09; 学习目标1 服务器反爬的原因2 服务器长反什么样的爬虫&#xff08;1&#xff09;十分低级的应届毕业生&#xff08;2&#xff09;十分低级的创业小公司&#xff08;3&#xff09;不小心写错了没人去停止的失控小…

安装Docker运行TensorFlow容器-《MCU嵌入式AI开发笔记》(第9集)搜索柔贝特三哥视频同步更新

安装Docker运行 TensorFlow 容器-《MCU嵌入式AI开发笔记》&#xff08;第9集&#xff09;。目标&#xff1a;在国产MCU上运行AI深度学习算法&#xff0c;实现识别、判断等功能。搜索柔贝特三哥&#xff0c;《MCU嵌入式AI开发笔记》视频同步更新。 安装Docker运行 TensorFlow 容…

[推荐]有安全一点的网贷大数据信用查询网站吗?

在互联网金融日益发展的今天&#xff0c;网贷大数据查询网站成为了许多人申贷前的必备工具。随着使用这些网站的人群越来越多&#xff0c;安全问题也逐渐浮出水面。最近&#xff0c;就有许多用户反馈自己的个人信息在网贷大数据查询网站上被泄露。为了解决这一问题&#xff0c;…

reactjs18 中使用路由技巧

react18 版本中&#xff0c;路由的用法发生了变化&#xff0c;react18 版本中&#xff0c;路由由 react-router-dom 包提供。与 react-router 包不同的是&#xff0c;react-router-dom 包提供了 createBrowserRouter 方法&#xff0c;该方法可以创建路由对象。总之&#xff0c;…

原码、反码、补码、移码的计算转换

文章目录 正数负数原码 & 反码反码 -> 补码原码 <-> 补码移码 <- Other 方法总结练习 正数 原码 和 反码 和 补码 都是一样的不会发生变化 因此&#xff0c;计算的时候先看第一位 符号位 &#xff0c;只要能发现是正数&#xff0c;三者都不变 移码 在补码基础…

飞凌嵌入式技术创新日(北京站)圆满落幕,共创嵌入式技术的美好未来

2024年6月25日下午&#xff0c;飞凌嵌入式技术创新日&#xff08;北京站&#xff09;在北京中关村皇冠假日酒店盛大举行。此次活动汇聚了近300位嵌入式技术领域的专家和企业代表&#xff0c;共享嵌入式技术的盛宴&#xff0c;共创嵌入式技术的美好未来&#xff01; 进入活动现场…

美国抗攻击服务器有哪些可靠的解决方案

美国抗攻击服务器在面对日益严重的网络安全威胁时&#xff0c;需要采取一系列可靠的解决方案来确保服务器的稳定运行和数据安全。以下是一些科普性质的抗攻击服务器解决方案&#xff1a; 一、流量清洗与过滤 流量清洗是美国抗攻击服务器应对DDoS攻击的重要措施。当检测到异常流…

DC-DC变换电路的研究与设计

通过使用MATLAB进行电路仿真以及通过制作实物进行验证&#xff0c;通过BUCK电路设计DC-DC来达到我们预期的效果&#xff0c;资料获取到咸&#x1f41f;&#xff1a;xy591215295250 \\\或者联系wechat 号&#xff1a;comprehensivable 设计要求&#xff1a;设计一个DC-DC 电源&a…