Spring Cloud2022之OpenFeign使用以及部分源码分析

OpenFeign使用

Feign和OpenFeign

Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端,可以使用⽤它来发起请求,进行远程调用。Fegin是以Java接口注解的⽅式调⽤Http请求,而不是像RestTemplate那样,在Java中通过封装HTTP请求报⽂的⽅式直接调用。
Feign可帮助我们更加便捷,优雅的调⽤HTTP API:不需要我们去拼接url然后调⽤restTemplate的api,但是Fegin的缺点缺点,它不支持SpringMVC的注解。

Spring Cloud在Feign的基础上进行了封装,从而有了OpenFeign。
Feign githup主页

OpenFeign的使用

OpenFeign的使用非常简单,只需要在服务调用方创建远程调用接口,然后创建和被调用方方法一样的方法,最后在需要使用的地方导入远程调用接口,调用接口的方法即可发起请求了。

在pom文件中添加OpenFeign的依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

在调用方服务的启动类上添加@EnableFeignClients注解

@SpringBootApplication
@EnableFeignClients  //开启Feign的功能
public class Conuserservice01Application {public static void main(String[] args) {try {SpringApplication.run(Conuserservice01Application.class, args);} catch (Exception e) {System.out.println("e.getMessage() = " + e.getMessage());}}}

创建远程调用接口

@FeignClient("providerservice")  //指定要调用的服务需要和被调用的服务的application.name保持一致
public interface ProviderServiceClient {//要调用的服务中的请求,需要被调用的服务中的请求方法保持一致@GetMapping("/user/{userId}")public String getUserById(@PathVariable("userId") String userId);}

在Controller中使用远程调用接口

@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate ProviderServiceClient client;@RequestMapping("/{userId}")public String getUserById(@PathVariable String userId) {LOGGER.info("userId: " + userId);String user = client.getUserById(userId);return user;}
}

访问/consumer/1的请求,会远程调用providerservice服务实例中请求路径为/user/{userId}的请求。
在这里插入图片描述

providerservice服务中被访问的请求,这个请求的方法要和远程调用接口中的方法保持一致。

@RestController
@RequestMapping("/user")
public class UserController {private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);@GetMapping("/{userId}")public String getUserById(@PathVariable String userId) {LOGGER.info("userId: " + userId);return "user1";}
}

Feign的相关配置

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
在这里插入图片描述
一般我们只需要修改日志级别即可。

日志级别

Feign的日志级别有如下几种:

  • NONE:默认的,不显示任何⽇志,性能最好;
  • BASIC:仅记录请求⽅法、URL、响应状态码以及执⾏时间----⽣产问题追踪;
  • HEADERS:在BASIC级别的基础上,记录请求和响应的header;
  • FULL:记录请求和响应的header、body和元数据,适⽤于开发及测试环境定位问题;

覆盖Feign默认的配置有两个维度,一个是为每个FeignClient单独配置(局部配置),另一个是全局配置;下面先来看局部配置。不过要先在yml中设置SpringBoot的日志输出级别

logging:level:# Feign⽇志只会对⽇志级别为debug的做出响应,这里需要设置SpingBoot的日志级别为debug,否则不会输出feign的日志;因为springBoot日志级别默认为info,这里把ProviderServiceClient接口的日志级别设置为了debug,也可以设置指定目录的日志级别com.example.conuserservice01.client.ProviderServiceClient: debug
局部配置日志级别

在application.yml文件中配置日志级别

logging:level:# ProviderServiceClient接口的方法的日志级别为debug,其它接口的不会生效com.example.conuserservice01.client.ProviderServiceClient: debug

通过@FeignClient注解的configuration属性指定日志配置

@FeignClient(value = "providerservice", contextId = "providerservice",  configuration = FeignConfig.class)  //指定要调用的服务
public interface ProviderServiceClient {//要调用的服务中的请求,需要被调用的服务中的请求方法保持一致@GetMapping("/user/{userId}")public String getUserById(@PathVariable("userId") String userId);}

日志配置类

public class FeignConfig {@BeanLogger.Level feignLevel() {return Logger.Level.FULL;}}
全局配置日志级别

全局配置日志级别可以使用yml文件配置,也可以使用配置文件进行配置。
这里如果使用服务名称则是全局配置,如果使用contextId,则是针对指定的FeignClient接口的单独配置;

spring:cloud:openfeign:client:config:providerservice: # 如果FeignClient注解设置了contextId这里就使用contextId如,果没有设置contextId就使用服务名称loggerLevel: full

使用配置类

@Configuration
public class FeignConfig {@BeanLogger.Level feignLevel() {return Logger.Level.FULL;}}

负载均衡

Cloud 2020.0.X版本开始OpenFeign底层不再使用Ribbon了。所以在配置负载均衡的时候使用之前的方式是不行的。

这里使用的注册中心是Nacos,最后走的是NacosLoadBalancer。choose方法就是根据负载均衡算法选择一个服务实例进行访问。

我们在浏览器输入地址访问,然后调用远程接口访问,会执行到SynchronousMethodHandler的invoke方法。这里面executeAndDecode方法会选择服务实例,发起请求。continueOrPropagate方法则是请求出现问题后的重试。

在这里插入图片描述

在这里插入图片描述

选择服务实例并发送请求的执行流程如下:
在这里插入图片描述

这里会通过choose方法拿到服务实例,最后执行的是NacosLoadBalancer中的choose方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里就完成了获取服务实例的过程。

发送请求的代码在获取到服务实例的步骤后面。
在这里插入图片描述
然后会执行到LoadBalancerUtils的executeWithLoadBalancerLifecycleProcessing方法,通过feignRequest的url可以看到,这个时候已经将服务名转成了根据负载均衡算法选择到的服务实例的ip和端口号
在这里插入图片描述

在这里插入图片描述

最后可以看到是通过HttpURLConnection发送的请求。
在这里插入图片描述

请求压缩和响应压缩

OpenFeign⽀持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。可以在yml文件中配置请求压缩和响应压缩

spring:cloud:openfeign:compression:request:enabled: true #开启请求压缩min-request-size: 2048  #设置触发压缩的大小下限,此处也是默认值mime-types: text/html,application/xml,application/json #设置压缩的数据类型,此处也是默认值response:enabled: true #开启响应压缩

对熔断器的支持

性能优化

通过前面前面的分析可以看到OpenFeign底层使用的是HttpURLConnection发送的请求,但是它不支持连接池。因此主要是针对这一点进行优化。
在这里插入图片描述

OpenFeign使用Apache HttpClient客户端

加入htppClient和feign-httpclient的依赖,feign-httpclient的version要和openfeign-core的version保持一致。

        <!-- 使用Apache HttpClient替换Feign原生httpURLConnection --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId><version>12.1</version></dependency>

开启httpClient的支持,默认是开启的。

spring:cloud:openfeign:httpclient:enabled: true

注入Apache HttpClient

@Beanpublic ApacheHttpClient getApacheHttpClient() {return new ApacheHttpClient();}

到这里使用Apache HttpClient的配置就完成了。

使用Apache HttpClient的原理如下:
在这里插入图片描述

在这里插入图片描述

参考

  1. Spring Cloud OpenFeign
  2. Spring Cloud OpenFeign - - - > 日志级别配置
  3. SpringCloud OpenFeign 全功能配置详解
  4. Cloud 2020.0.X版本开始OpenFeign底层不再使用Ribbon
  5. 源码分析及实践测试OpenFeign负载均衡
  6. springcloud-Feign-HttpClient连接池(提升 Feign 的并发吞吐量)
  7. Nacos负载均衡策略
  8. 怎样配置Feign使用HttpClient

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

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

相关文章

android开发技术论文,Android中为什么需要Handler

前言 马爸爸总结了一句话&#xff1a;跳槽&#xff0c;要么是钱不到位&#xff0c;要么是受了委屈。 我给自己这次的跳槽经历做了一个分析&#xff0c;希望能对那些想换工作的朋友有所帮助。 许多朋友想换工作&#xff0c;但是对“换工作”的理解可能仅限于写简历、投简历、…

信号系统之滤波器比较

比较 1&#xff1a;模拟与数字滤波器 大多数数字信号源自模拟电子设备。**如果需要对信号进行滤波&#xff0c;是在数字化之前使用模拟滤波器&#xff0c;还是在数字化后使用数字滤波器更好&#xff1f;**将通过两个对比来回答问题。 目标是提供 1 kHz的低通滤波器。模拟端是…

华为HarmnyOS TypeScript基础语法快速入门

华为HarmnyOS TypeScript基础语法快速入门 一、JavaScript、TypeScript、ArkTS二、TypeScript基础语法1. 基础类型2. 条件语句3. 函数4. 类5. 模块6. 迭代器 一、JavaScript、TypeScript、ArkTS ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&am…

程序员必备开发工具(IDE)推荐

程序员必备开发工具&#xff08;IDE&#xff09;推荐 1.Python语言程序员必备开发工具&#xff08;IDE&#xff09;推荐1.1 **IDLE**1.2 ⭐️PyCharm1.3 **Anaconda**1.4 **Jupyter Notebook**1.5 **Sublime Text** 2.C语言程序员必备开发工具&#xff08;IDE&#xff09;推荐2…

谷歌seo推广留痕怎么做?

​要有效地进行谷歌SEO推广并留下有效的痕迹&#xff0c;首先要理解GLB外推的核心概念&#xff0c;GLB外推是一种利用高权重平台和蜘蛛池技术&#xff0c;通过在这些平台上生成查询页面并推广这些链接&#xff0c;快速促使谷歌搜索引擎抓取和收录&#xff0c;从而达到搜索结果霸…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

苍穹外卖Day03——总结3

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/articl…

【Wireshark傻瓜式安装,Wireshark使用过滤条件】

Wireshark傻瓜式安装&#xff0c;Wireshark使用过滤条件 安装使用wireshark过滤器表达式的规则1.抓包过滤器语法和实例&#xff08;1&#xff09;协议过滤&#xff08;2&#xff09;IP过滤&#xff08;3&#xff09;端口过滤&#xff08;4&#xff09;逻辑运算符&&与、…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库&#xff0c;常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步&#xff1a;确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本&#xff0c;您可…

2024031期传足14场胜负前瞻

2024031期售止时间为3月1日&#xff08;周五&#xff09;22点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率2场&#xff0c;1.5-2.0赔率3场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。 1、西布罗 VS 考文垂 西布朗近2次面对高…