当前位置: 首页 > news >正文

微服务--OpenFeign【重点】

如果哪天 我们硬编码写的接口变了,只要写过该接口的 都要改,太麻烦了,

所以 就用 OpenFeign 来解决这个麻烦

了解:

SimpleClientHttpRequestFactoryHttpComponentsClientHttpRequestFactory

都是Spring框架中用于创建ClientHttpRequest实例的工厂类

区别在于 底层使用的HTTP客户端库以及提供的特性和性能 :

1、RestTemplate 默认使用的是:

SimpleClientHttpRequestFactory工厂类(它用的是 JDK内置的 HttpURLConnection 性能比较低 ) ,

若换成HttpClient 【我们用的也是这个】 ,只需要在工厂里面 new 一个工厂类HttpComponentsClientHttpRequestFactory

package com.***.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestConfig {@Bean@LoadBalanced// RestTemplate 默认将一级目录作为主机名,// 加上@LoadBalanced 之后,就把以及目录作为服务名,通过该服务名能够抓取到该服务名下面的所有实例数据,就可以负载均衡了// @LoadBalanced 会将RestTemplate 请求的url中的一级目录作为服务名,然后去服务注册中心Nacos抓取对应的ip和端口// 替换成真正的ip和端口  http://nacos-a/api/a ==> http://192.168.21.43:8080/api/a ,然后再去调用对应的接口//http://nacos-a/api/apublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();// 使用 httpclient 作为底层的http请求 来实现HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();restTemplate.setRequestFactory(clientHttpRequestFactory);return restTemplate;}
}

Feign

Feign 可以帮助我们更快捷、优雅地调用HTTP API,目的是让编写HTTP接口的客户端变得更简洁和直接

在Spring Cloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了

OpenFeign

1、Spring Cloud Alibaba快速整合OpenFeign

① 引入依赖

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

② 编写调用接口+@FeignClient注解

name: 是服务名称,这是服务发现系统(如 Eureka 或 Nacos)中注册的服务名称

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

@EnableFeignClients: 启用 Feign 客户端的支持。

通过类路径扫描找到所有的 @FeignClient 注解接口,并将它们注册为 Bean

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

⑤ Feign 使用 @SpringQueryMap 来解决多参数传递问题

你最近遇到最棘手的问题是什么?(踩过的坑)【面试题】

之前我们很多请求 都是通过post请求的,但是我们用get请求的时候 都是单个参数 没有用对象,有一次我们在封装成对象的时候 遇到问题了。

解决:加了一个@SpringQueryMap注解 将会扫描 方法参数中的字段或属性,拼接到URL上

2、高级配置

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

(1) 日志配置

当遇到 Bug,如接口调用失败、参数没收到等问题,或看调用性能,

就需要配置 Feign 的日志,以此让 Feign 把请求信息输出来。

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节

即:对Feign接口的调用情况进行监控和输出

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

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

① 全局配置

注意:

此处配置@Configuration注解就会全局生效,(如果想指定某一个服务生效,就不能加这个注解@Configuration)

因为feign调试日志是debug级别输出, SpringBoot默认的日志级别是Info,所以feign的debug日志级别就不会输出,一定要结合 logging.level.com.beiyou = debug

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

② 局部配置

局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类

局部配置的时候 FeignConfig要去掉@Configuration注解

③ 在配置文件配置
logging.level.com.*** = debug
开启日志##配置feign 的日志级别
#-- default 全局配置
feign.client.config.default.loggerLevel=NONE
#-- nacos-a 具体服务名
feign.client.config.nacos-a.loggerLevel=FULL

(2)超时配置

若服务提供者的请求处理时间超过了请求处理的超时时间,则会报Read timed out错误,如下图所示:

① 全局配置

为了避免服务调用连接和处理时间超时,我们可以对feign的连接超时时间和请求处理超时时间进行配置。

通过 Options 可以配置连接超时时间和读取超时时间

@Configuration
public class FeignConfig {@Beanpublic Request.Options options() {return new Request.Options(10L, TimeUnit.SECONDS, 60L,TimeUnit.SECONDS,false);}
}

注:Options 的第一个参数是连接的超时时间(ms),默认值是2s;第二个参数是请求处理的超时时间(ms),默认值是5s

② 配置文件中配置
#全局配置
#这里 default 是一个特殊的客户端名称,用于表示全局配置,
#设置 connectTimeout 和 readTimeout 属性的值来定义全局的连接超时时间和读取超时时间。feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=10000#局部配置 请将 <clientName> 替换为实际的Feign客户端名称。
feign.client.config.<clientName>.connectTimeout=5000
feign.client.config.<clientName>.readTimeout=10000feign.client.config.order-service.connectTimeout=5000    #连接超时时间(ms),默认值是2s
feign.client.config.order-service.readTimeout=10000      #请求处理的超时时间(ms),默认值是5s

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

(3)自定义拦截器(重要 重要 重要.......)

通过在OpenFeign中自定义拦截器的方式,来实现服务远程调用过程中的日志输出、认证授权等应用

  • OpenFeign 中的拦截器是对服务调用者(也叫消费者)调用服务提供者的过程进行拦截。
  • Spring MVC 中的拦截器是对客户端(浏览器)请求服务端的过程进行拦截。

通过输出日志的例子来介绍OpenFeign中拦截器的使用步骤

① 自定义OpenFeign拦截器类

在服务消费者项目中创建一个名称为TraceIdFeignInterceptor 的拦截器类,并让其继承RequestInterceptor类。

@Slf4j
//@Component
public class TraceIdFeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate template) {log.debug("请求拦截了");}
}

② 配置拦截器
方式一: 全局配置 (在配置类中配置自定义的OpenFeign拦截器)
@Configuration
public class FeignConfig {@Beanpublic TraceIdFeignInterceptor feignInterceptor(){return new TraceIdFeignInterceptor ();}
}

方式二: 局部配置 (也可以在application.yaml文件中对自定义的OpenFeign拦截器进行局部配置)
# 拦截器
feign.client.config.order-service.requestInterceptors[0]=com.beiyou.TraceIdFeignInterceptor #自定义拦截器的完整类路径
feign.client.config.order-service.requestInterceptors[1]=com.beiyou.xxxxxxxxx

方式三: 常用简化版

传两个 因为这两个都是要一直链路传的,从第一个服务 一直传到尾

traceId 主要解决 链路跟踪问题

token 主要验证前端给我们的token是否合法,有一些接口需要拿token里面用户的信息 所以要一直传到下游

使用openfeign 调用另一个微服务的get方法,如果参数是 对象的话,需要添加 @SpringQueryMap 注解

了解:契约配置

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

Spring Cloud 1 早期版本就是用的原生Fegin. 随着netflix的停更替换成了Open feign

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

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

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

2)OrderService 中配置使用Feign原生的注解

@FeignClient(value = "order-service")
public interface OrderService {@RequestLine("GET /hello")public String hello();
}

3)也可以通过yml配置契约

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

相关文章:

微服务--OpenFeign【重点】

如果哪天 我们硬编码写的接口变了&#xff0c;只要写过该接口的 都要改&#xff0c;太麻烦了&#xff0c; 所以 就用 OpenFeign 来解决这个麻烦 了解&#xff1a; SimpleClientHttpRequestFactory和 HttpComponentsClientHttpRequestFactory 都是Spring框架中用于创建ClientH…...

【力扣打卡系列】滑动窗口与双指针(两数之和)

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day1 两数之和 题目描述 解题思路 采用哈希表 将nums[i] nums[j] target 转化成 nums[i] target - nums[j]去思考新建一个map来存储&#xff0c;键为值&#xff08;左边的&#xff09;&#…...

蚂蚁华东师范大学:从零开始学习定义和解决一般优化问题LLMOPT

&#x1f3af; 推荐指数&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f; &#x1f4d6; title&#xff1a;LLMOPT: Learning to Define and Solve General Optimization Problems from Scratch &#x1f525; code&#xff1a;https://github.com/caigaojiang/LLMOPT &am…...

价格游戏的终章:品牌如何在通货膨胀时代智取市场

来源&#xff1a;The era of price-led profit growth is coming to an end (marketingweek.com) 近年来&#xff0c;通货膨胀促使许多品牌通过提价来提升利润&#xff0c;而销量几乎没有受到太大影响。然而&#xff0c;随着通货膨胀放缓&#xff0c;继续提价的策略可能会吸引…...

CVTE Android面试题及参考答案

Activity 的生命周期 Activity 的生命周期分为以下几个主要状态: onCreate ():在 Activity 第一次被创建的时候调用。通常在这个方法中进行一些初始化操作,如设置布局、初始化成员变量等。这是 Activity 进入可见状态的第一步。onStart ():当 Activity 即将对用户可见的时候…...

Docker实战:从入门到进阶

Docker实战&#xff1a;从入门到进阶 引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后发布到任何支持Docker的平台上。本文将通过实战和应用举例&#xff0c;带领大家深入了解Docker的强大…...

Jupyter Notebook汉化(中文版)

原版jupyter notebook是英文的&#xff0c;想要将其改为中文 在jupyter notebook所在环境输入以下命令 pip install jupyterlab-language-pack-zh-CN打开jupyter notebook&#xff0c;在设置语言中将其设置为中文...

C#的小数位保留以及四舍五入

C#使用Math.Round("数值","保留位","保留方式")进行小数位保留以及四舍五入 //1.MidpointRounding.ToEven(四舍六入五成双) //当保留小数位后一位为0~4时&#xff0c;舍去末位 var x1 Math.Round(1.124, 2, MidpointRo…...

KNNImputer

KNNImputer实例是指在使用Python的scikit-learn库时&#xff0c;通过sklearn.impute.KNNImputer类创建的一个对象&#xff0c;该对象专门用于处理数据集中的缺失值。KNNImputer采用K-近邻&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;算法来估算并填充这些缺失值…...

RHCE例行性工作笔记

1、单一执行的例行性工作 单一执行的例行性工作&#xff1a; 仅处理执行一次就结束了 at命令的工作过程 /etc/at.allow &#xff0c;写在该文件的人可以使用 at 命令 /etc/at.deny &#xff0c;黑名单 两个文件如果都不存在&#xff0c;只有 root 能使用 #at 工作调度对应的…...

ros2 action server示例、拓展、练习

注意&#xff1a;以下代码全部由ai生成&#xff0c;没有大问题&#xff0c;运用时需根据报错逐步调试 action server示例 将 goal、result 和 feedback 作为类的成员变量的 C 示例代码&#xff1a; 示例代码 #include "rclcpp/rclcpp.hpp" #include "rclcpp…...

【Go语言】安装及使用基础教程

文章目录 1. 下载安装Go官网安装使用 Homebrew 安装 (Mac)创建工作目录 (Workspace)设置环境变量通过 VSCode 扩展商店安装 Go 插件处理权限问题 2. Hello, World 示例3. 语法基础变量声明常量数组切片&#xff08;Slice&#xff09;Map&#xff08;集合&#xff09;控制结构fo…...

【大模型】3分钟了解提示(Prompt)工程、检索增强(RAG)和微调

我们先看下面这个图&#xff1a; 简单理解大模型是通过海量训练数据训练出来的&#xff0c;它的能力非常强&#xff0c;但是有时候会给出错误的回答。那产生错误的原因可能是什么呢&#xff1f; 1.提问错误&#xff08;提示工程&#xff09; 在我们提问的方式不对的情况下&a…...

太速科技-509-基于XCVU13P的4路QSFP28光纤PCIeX16收发卡

基于XCVU13P的4路QSFP28光纤PCIeX16收发卡 一、板卡概述 基于XCVU13P的4路QSFP28光纤PCIeX16收发卡。该板卡要求符合PCIe 3.0标准&#xff0c;包含一片XCVU13P-2FLGA2014I、4组64-bit/8GB DDR4&#xff1b;4路QSFP28 4X光纤&#xff0c;每路光纤支持4X25Gbps&#…...

C#从零开始学习(基本语法概念)(2)

深入C# 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp 控制台项目结构 每个C#程序采用同样的方式组织,命名空间,类和方法 using System;namespace helloworld//命名空间 {class Program//类{static void Main(string[] args)//程序入口{Console.Writ…...

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …...

MEMC功能详解

文章目录 MEMC的工作原理&#xff1a;优点&#xff1a;缺点&#xff1a;适用场景&#xff1a;1. Deblur&#xff08;去模糊&#xff09;2. Dejudder&#xff08;去抖动&#xff09;总结两者区别&#xff1a; MEMC&#xff08;Motion Estimation and Motion Compensation&#x…...

C++ | Leetcode C++题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class BIT { private:vector<int> tree;int n;public:BIT(int _n) : n(_n), tree(_n 1) {}static constexpr int lowbit(int x) {return x & (-x);}void update(int x, int d) {while (x < n) {tree[x] d;x lowbit(x);}}in…...

Git 修改分支名

在Git中修改分支名称&#xff0c;可以使用以下步骤&#xff1a; 切换到要重命名分支之外的其他分支&#xff1a; git checkout <其他分支名>重命名本地分支&#xff1a; git branch -m <旧分支名> <新分支名>如果需要删除远程的旧分支并创建新分支&#xff1…...

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中&#xff0c;填入Name&#xff08;随便填&#xff09;&#xff0c;Repository URL&#xff0c;选择下列的源&#xff0c;一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…...

51单片机——OLED显示图片

取模软件&#xff1a;链接:https://pan.baidu.com/s/1UcrbS7nU4bsawNxsaaULfQ 提取码:gclc 1、如果图片大小和格式不合适&#xff0c;可以先用Img2Lcd软件进行调整图片大小&#xff0c;一般取模软件使用的是.bmp图片&#xff0c;可以进行输出.bmp格式。软件界面如下&#xff1…...

Gin 协程mysql客户端

一、Gin框架 mysql配置 这里选择yaml文件配置 二、配置读取 viper 读取yaml文件中对应配置 三、mysql 的协程客户端 文件位置 package databaseimport ("database/sql""fmt""github.com/spf13/viper""log""net/http"&quo…...

量子门电路开销——T门、clifford门、toffoli门、fredkin门

在量子计算中&#xff0c;T门的成本比Clifford门高出很多倍的原因与量子计算中纠错的实现、物理门操作的复杂性以及容错量子计算架构中的成本评估有关。以下是几个关键原因&#xff0c;解释了为什么 T 门的成本在量子计算中远远高于 Clifford 门&#xff1a; 1. T 门和 Cliffo…...

C++之《剑指offer》学习记录(1):类型转换关键字

笔者最近在找工作时&#xff0c;无意间读到了一本名为《剑指offer》的书&#xff0c;粗略翻阅了一下&#xff0c;感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程&#xff0c;希望能和这本书的读者朋友们一起交流学习心得…...

【Linux】平台设备驱动

在设备驱动模型中&#xff0c;引入总线的概念可以对驱动代码和设备信息进行分离。但是驱动中总线的概念是软件层面的一种抽象&#xff0c;与我们SOC中物理总线的概念并不严格相等。 物理总线&#xff1a;芯片与各个功能外设之间传送信息的公共通信干线&#xff0c;其中又包括数…...

【Linux】命令行参数环境变量

文章目录 命令行参数环境变量环境变量的概念常见环境变量查看环境变量测试PATH修改PATH HOME和环境变量相关的命令环境变量是如何被组织的通过系统调用putenv和getenv获取或设置环境变量环境变量通常是具有全局属性的普通变量与环境变量的区别 命令行参数 main函数有三种形式&…...

libaom 源码分析:twopass_encoder.c 文件

libaom libaom 是 AOMedia&#xff08;开放媒体联盟&#xff09;开发的一个开源视频编解码器库&#xff0c;它是 AV1 视频压缩格式的参考实现&#xff0c;并被广泛用于多种生产系统中。libaom 支持多种功能&#xff0c;包括可扩展视频编码&#xff08;SVC&#xff09;、实时通信…...

ruoyi同时支持mysql+sqlserver+oracle+postgresql

需求背景 最近需要一个小demo,项目中需要同时连接sqlserver和mysql数据库。 操作教程 1、pom.xml -- 修改common/pom.xml<!-- 动态数据源 --> <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-star…...

微信小程序绘制轨迹

1、map | uni-app官网 根据官网描述&#xff1a;通过从数据库获取POI数据&#xff0c;并通过 uni-id-common 内的路线规划API&#xff0c;计算路线、距离、时间。 2、 <map style"width:100%;height:96%;" id"myMap" :scale"scale" :longi…...

UNION 联合查询

1.UNION ALL联合查询 同样为了演示方便&#xff0c;先向 teacher 表插入多条测试数据&#xff1a; INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…...