微服务--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原生注解契约配置

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

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

相关文章

sentinel原理源码分析系列(六)-统计指标

调用链和统计节点构建完成&#xff0c;进入统计指标插槽&#xff0c;统计指标在最后执行的&#xff0c;等后面的插槽执行完&#xff0c;资源调用完成了&#xff0c;根据资源调用情况累计。指标统计是最重要的插槽&#xff0c;所有的功能都依靠指标数据&#xff0c;指标的正确与…

尤雨溪都点赞的表单校验解决方案,到底多么强

尤雨溪都点赞的表单校验解决方案&#xff0c;到底多么强 如果你是 Vue 开发者&#xff0c;那么 Vorms 绝对是你不能错过的表单验证利器。本文将带你快速了解 Vorms 的基本功能、特点和如何简单使用它提升你的开发体验。 软件简介 Vorms 是一个基于 Vue 3 组合式 API 的表单验证…

STL——string类

前言 从本篇博客开始&#xff0c;就正式来介绍STL的正式内容&#xff0c;STL在C中的学习中非常重要&#xff0c;具有举足轻重的地位&#xff0c;这块儿内容会给我们提供很多现成的接口&#xff0c;可以大大简化我们的代码&#xff0c;我们之前用C语言写的代码将会被极大地简化…

【数据分享】全国能源-电力平衡表(2000-2020年)

数据介绍 一级标题指标名称单位能源电力可供量亿千瓦小时能源电力生产量亿千瓦小时能源水电生产电力量亿千瓦小时能源火电生产电力量亿千瓦小时能源核电生产电力量亿千瓦小时能源风电生产电力量亿千瓦小时能源电力进口量亿千瓦小时能源电力出口量亿千瓦小时能源电力能源消费总量…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题&#xff0c;找中间节点和逆置链表&#xff08;翻转链表&#xff09;之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

设计模式03-装饰模式(Java)

4.4 装饰模式 1.模式定义 不改变现有对象结构的情况下&#xff0c;动态地给该对象增加一些职责&#xff08;即增加其额外功能&#xff09;的模式。 2.模式结构 抽象构件角色 &#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。客户端可以方便调用装饰类和被装饰类…

基于STM32的电动汽车遥控器设计

引言 本项目设计了一个基于STM32的电动汽车遥控器&#xff0c;能够通过无线通信&#xff08;如蓝牙或射频模块&#xff09;控制电动汽车的前进、后退、左右转向等动作。该遥控器采用按键或摇杆操作&#xff0c;并通过无线模块将控制指令发送给汽车控制端&#xff0c;实现远程操…

吴恩达深度学习笔记(8)

计算机视觉 包括&#xff1a;图像分类也叫做图像识别、目标检测等 一个小的图像可能1M&#xff0c;但是他的像素是一个超级大向量&#xff0c;如果直接深度学习那么运算量会很大&#xff0c;因此需要运用卷积运算。 卷积运算是卷积神经网络的基础单元之一。下面用边缘检测理…

FastGPT本地开发 之 通过Navicat管理MongoDB、PostgreSQL数据库

1. 背景 前期已经完成FastGPT的本地化部署工作&#xff0c;通过Docker启动FastGPT的相关容器即可运行。&#xff08;共6个容器&#xff09; 2.本地化开发 2.1 前置依赖 2.2 源码拉取 git clone gitgithub.com:labring/FastGPT.git2.3 数据库管理 本地化运行的FastGPT使用…

leetcode73矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

【含开题报告+文档+PPT+源码】基于SpringBoot和Vue的编程学习系统

开题报告 随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;编程技能已经成为现代社会中不可或缺的一项基本能力。无论是软件开发、数据分析还是人工智能等领域&#xff0c;编程都扮演着至关重要的角色。因此&#xff0c;培养和提高编程技能对于个人职业发展和社会创…

eNSP静态路由

1、实现全网通&#xff0c;考虑环形拓扑的优势。 R12: [Huawei]interface GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 192.168.1.1 24[Huawei]interface GigabitEthernet 0/0/1 [Huawei-GigabitEthernet0/0/1]ip address 192.168.2.1 24[Huawei]interfa…

软件设计模式------工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;&#xff0c;又称工厂模式&#xff0c;也叫虚拟构造器模式&#xff08;Virtual Constructor Pattern&#xff09;或多态工厂模式&#xff08;Polymorphic Pactory Pattern&#xff09;,属于类创建型模式。 我们知道…

Spring数据源对象管理:基于XML配置文件的第三方bean管理

前言 第三方资源配置管理 ioc容器和依赖管理&#xff0c;我们大多数管理的是自己创建的bean&#xff0c;如果是第三方提供的bean是如何管理&#xff0c;我们以数据源对象的ioc管理为例子进行说明。 步骤 第一步&#xff1a; 需要导入相应的依赖包&#xff08;导入坐标&#xf…

解构OpenAI swarm:利用Cursor进行框架分析与示例运行

解构OpenAI SWARM:利用Cursor进行框架分析与示例运行 1. 引言 在AI技术日新月异的今天,OpenAI再次为我们带来了惊喜。SWARM框架作为其最新研究成果,正在开创多智能体协作的新纪元。本文将带您深入探索这一框架,通过Cursor工具进行代码分析,并手把手教您安装运行SWARM。无论您…

Data+AI下的数据湖和湖仓一体发展史

DataAI下的数据湖和湖仓一体发展史 前言数据湖的“前世今生”AI时代的救星&#xff1a;湖仓一体湖仓一体实践演进未来趋势&#xff1a;智能化、实时化结语 前言 数据湖&#xff1f;湖仓一体&#xff1f;这是什么高科技新名词&#xff1f; 别急&#xff0c;我们慢慢聊。想象一…

机器学习:opencv--风格迁移

目录 前言 一、代码及步骤解释 1.图片与处理 2.加载模型 3.输出图像 前言 风格迁移&#xff08;Style Transfer&#xff09;是一种计算机视觉技术&#xff0c;旨在将一种图像的艺术风格应用到另一种图像上&#xff0c;同时保持其内容。 一、代码及步骤解释 1.图片与处理 …

从Apple Intelligence到远程机器人手术:更快、更安全的网络成企业业务关键

过去&#xff0c;企业的业务模式和网络架构相对简单&#xff0c;数据传输量不大&#xff0c;远程访问需求也不多。企业对网络的要求主要集中在确保基本的连通性和可用性。如今&#xff0c;企业通过将产品与各项高新技术深度融合&#xff0c;赋予传统产品活力和竞争力。以苹果公…

web3D越来越普及来,在站显示效果上没说的

Web3D 技术为网站带来了全新的视觉体验。它能够以逼真的三维形式展示产品、场景或数据&#xff0c;让用户仿佛身临其境。 无论是展示复杂的机械结构、精美的艺术品&#xff0c;还是模拟真实的自然环境&#xff0c;Web3D 都能以其出色的表现力吸引用户的注意力。 在显示效果上…