【spring Cloud Netflix】OpenFeign组件

news2025/4/7 23:01:49

1.概述

Feign旨在使编写Java Http客户端变得更容易。前面在使用Ribbon+RestTemplate进行服务的远程调用 时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由 于对服务的依赖调用可不止一处,往往一个服务接口可能会被多次调用,所以通常会针对每一个微服务自 行封装一些客户端来包装这些依赖服务的调用。所以feign在此基础上做了进一步的封装,由它来帮助我们 定义和实现依赖服务接口的定义。在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置 它,即可完成对服务提供方的接口绑定,简化了是RestTemplate进行服务调用的方式。

此外OpenFeign也集成了Ribbon组件,默认的情况下也可以按照轮询的机制来对服务提供方进行服务的远 程调用。而我们今天讲的OpenFeign其实是对Feign组件进行了增强。相对于Feign来说,OpenFeign支持 在接口上使用SpringMVC的注解。

OpenFeign的前身是NetFlix公司的Feign。SpringCloud在Feign的基 础上扩展了SpringMVC的注解。OpenFeign的FeignClient注解可 以解析SpringMVC的RequestMapping注解下面的接口,并通过动 态代理的方式产生实现类,实现类中做负载均衡,并调用其他服务。

2.OpenFeign的使用

2.1新建一个OpenFeign客户端

首先引入相关依赖

<dependencies>
<!-- Open Feign--> 
<dependency>
 <groupId>org.springframework.cloud </groupId>
 <artifactId>spring-cloud-starter-openfeign </artifactId>
 <dependency>
 <dependency>
 <groupId>com.xq.common </groupId>
 <artifactId>springcloud-netflix-service-common </artifactId>
 <version>1.0-SNAPSHOT </version>
 <dependency>
 <dependencies>

然后定义相关的feign接口

在Feign里面定义接口,接口所在的包必须是和消费方启动类所在的目录同名,或者在其子目录下面。接 口的方法定义规则就是将服务提供方里面的方法拷贝过来,并去掉方法体,一定要带上SpringMVC的注解。

 @FeignClient(value = "service-provider") //标识当前接口是一个Feign客户端 name/value:服务提供方的名称
publicinterfacePaymentClient {
  //如果feign客户端
  @RequestMapping("provider/findById")
 publicResult<Payment> findById(@RequestParam("id") Longid);
 }

2.2服务消费方改造

首先在消费方启动类上添加Feign扫描的注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启对OpenFeign客户端的扫描(扫描的规则是当前启动类所在的包及其子包下面)
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

然后改造控制器方法

在服务消费方的控制器方法中注入Feign客户端,实现服务的远程调用。

// 表明这是一个 RESTful 风格的控制器,会将方法的返回值直接作为 HTTP 响应体返回
@RestController
// 为该控制器下的所有请求映射添加统一的前缀 "/consumer"
@RequestMapping("consumer")
// 使用 Lombok 提供的注解,为类自动生成 SLF4J 的日志记录器
@Slf4j
// 抑制代码中所有的警告信息
@SuppressWarnings("all")
public class PaymentController {


    // 自动注入 PaymentClient 实例,PaymentClient 是使用 OpenFeign 定义的客户端接口,用于调用远程服务
    @Autowired
    PaymentClient paymentClient;

    /**
     * 根据支付记录的 ID 查询支付信息
     *
     * @param id 支付记录的 ID,通过路径变量从 URL 中获取
     * @return 返回一个包含 Payment 对象的 Result 结果对象
     */
    @RequestMapping("findById/{id}")
    public Result<Payment> findById(@PathVariable("id") Long id) {
        // 调用 PaymentClient 接口中的 findById 方法,根据 ID 查询支付信息
        // 该方法会通过 OpenFeign 自动调用远程服务并返回结果
        Result<Payment> result = paymentClient.findById(id);
        // 将查询结果返回给客户端
        return result;
    }
}

2.3Feign的超时控制

现在我们改造提供方的代码,如果我们通过Thread.sleep()方法对服务提供方控制器代码进行改造:

 @RequestMapping("findById")
 publicResult<Payment> findById(@RequestParam("id") Longid){
   try {
        Thread.sleep(3000);
        Paymentpayment = paymentService.findById(id);
        returnnewResult(200,"数据查询成功,端口号是:" + port,payment);
    } catch (Exceptione) {
         e.printStackTrace();
         returnnewResult(500,"查询失败",null);
    }
 }

此时就会报错,会出现超时,因为在默认的情况下,使用Feign进行服务提供方的远程调用,默认的超时时间是1秒钟,,如果1s钟还没有响应,那么就会抛出服务调用超时异常。所以我们需要在服务消费方的配 置文件里面修改Feign的超时时间。

 # 使用ribbon进行超时控制
ribbon:
 ReadTimeout: 5000 #指的是建立连接所需要的的时间
ConnectTimeout: 5000 #指的是建立连接之后,服务器读取资源需要的时间

2.4OpenFeign日志打印

Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http的请求细节。说白了 就是对Feign接口的调用情况进行监控和输出。

日志的级别有以下:

NONE: 默认的,不显示任何日志。
BASIC:仅记录请求方法、URL、响应状态码及执行时间。
HEADERS:除了BASIC定义的信息之外,还有请求和响应的头信息。
FULL:除了HEADERS定义的信息之外,还有请求和响应的正文及元数据信息。

接下来写一个示例来演示

首先,编写配置类

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

编写yml配置文件

#日志配置
logging:
 level:
   com.xq.client.PaymentClient: debug

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

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

相关文章

Oracle数据库数据编程SQL<8 文本编辑器Notepad++和UltraEdit(UE)对比>

首先&#xff0c;用户界面方面。Notepad是开源的&#xff0c;界面看起来比较简洁&#xff0c;可能更适合喜欢轻量级工具的用户。而UltraEdit作为商业软件&#xff0c;界面可能更现代化&#xff0c;功能布局更复杂一些。不过&#xff0c;UltraEdit支持更多的主题和自定义选项&am…

Linux驱动开发练习案例

1 开发目标 1.1 架构图 操作系统&#xff1a;基于Linux5.10.10源码和STM32MP157开发板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驱动层&#xff1a;为每个外设配置DTS并且单独封装外设驱动模块。其中电压ADC测试&#xff0c;采用linux内核…

Apache httpclient okhttp(1)

学习链接 Apache httpclient & okhttp&#xff08;1&#xff09; Apache httpclient & okhttp&#xff08;2&#xff09; httpcomponents-client github apache httpclient文档 apache httpclient文档详细使用 log4j日志官方文档 【Java基础】- HttpURLConnection…

微信小程序—路由

关于 app.json 中的配置 app.json 主要是对整个小程序进行一个全局的配置。 pages&#xff1a;在这个配置项目中&#xff0c;就可以配置小程序里面的页面&#xff0c;小程序默认显示 pages 数组中的第一个页面windows&#xff1a;主要配置和导航栏相关的 当然&#xff0c;在…

人工智能驱动的数据仓库优化:现状、挑战与未来趋势

1. 引言&#xff1a;数据仓库的演进与人工智能驱动优化的兴起 现代数据仓库的复杂性和规模正以前所未有的速度增长&#xff0c;这主要是由于数据量、种类和产生速度的急剧增加所致。传统的数据仓库技术在应对这些现代数据需求方面显得力不从心&#xff0c;这催生了对更先进解决…

LVS高可用负载均衡

一、项目图 二、主机规划 主机系统安装应用网络IPclientredhat 9.5无NAT192.168.72.115/24lvs-masterredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.116/24 VIP 192.168.72.100/32lvs-backupredhat 9.5ipvsadm&#xff0c;keepalivedNAT192.168.72.117/24 VIP 192.168…

脑影像分析软件推荐 | JuSpace

目录 1. 软件界面 2.工具包功能简介 3.软件安装注意事项 参考文献&#xff1a; Dukart J, Holiga S, Rullmann M, Lanzenberger R, Hawkins PCT, Mehta MA, Hesse S, Barthel H, Sabri O, Jech R, Eickhoff SB. JuSpace: A tool for spatial correlation analyses of magne…

逛好公园的好处

逛公园和软件开发看似是两个不同的活动&#xff0c;但它们之间存在一些有趣的关联和相互促进的关系&#xff1a; 激发创造力&#xff1a;公园中的自然景观、多样的人群以及各种活动能为开发者带来新的灵感和创意。软件开发过程中&#xff0c;从公园中获得的创意可以帮助开发者设…

【网络安全】 防火墙技术

防火墙是网络安全防御的重要组成部分&#xff0c;它的主要任务是阻止或限制不安全的网络通信。在这篇文章中&#xff0c;我们将详细介绍防火墙的工作原理&#xff0c;类型以及如何配置和使用防火墙。我们将尽可能使用简单的语言和实例&#xff0c;以便于初学者理解。 一、什么…

文档的预解析

1. 预解析的核心目标 浏览器在正式解析&#xff08;Parsing&#xff09;HTML 前&#xff0c;会启动一个轻量级的 预解析器&#xff08;Pre-Parser&#xff09;&#xff0c;快速扫描文档内容&#xff0c;实现&#xff1a; 提前发现并加载关键资源&#xff08;如 CSS、JavaScrip…

记一次表格数据排序优化(一)--排序30000条数据有多卡

目录 需求 第一次尝试 运行环境 思路 存储 排序 触发排序操作 如何实现高效的排序 关键1 关键2 关键3 磨刀不误砍柴工 关键4 代码 效果 卡顿原因分析 原因1 原因2 第二次尝试 需求 1 我的qt程序通过表格显示30000条数据。数据来自udp&#xff0c;udp每隔10秒…

图形渲染中的定点数和浮点数

三种API的NDC区别 NDC全称&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的区别如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐标系右手左手右手z值范围[-1,1][0,1][0,1]xy视口范围[-1,1][-1,1][-1,1] GPU渲染的定点数和浮点数 定点数类型&a…

【深度学习】CNN简述

文章目录 一、卷积神经网络&#xff08;CNN&#xff09;二、CNN结构特性1. CNN 典型结构2. 局部连接3. 权重共享4.空间或时间上的次采样 三、理解层面 一、卷积神经网络&#xff08;CNN&#xff09; 卷积神经网络(Convolutional Neural Network&#xff0c;CNN)是一种用于处理…

强化学习课程:stanford_cs234 学习笔记(3)introduction to RL

文章目录 前言7 markov 实践7.1 markov 过程再叙7.2 markov 奖励过程 MRP&#xff08;markov reward process&#xff09;7.3 markov 价值函数与贝尔曼方程7.4 markov 决策过程MDP&#xff08;markov decision process&#xff09;的 状态价值函数7.4.1 状态价值函数7.4.2 状态…

紫檀博物馆一游与软件开发

今天去逛了中国紫檀博物馆&#xff0c;里边很多层展品&#xff0c;也有一些清代的古物&#xff0c;檀木&#xff0c;黄花梨木家具和各种摆件&#xff0c;馆主陈丽华女士也是发心复原、保留和弘扬中国的传统文化&#xff0c;和西游记唐僧扮演者迟成瑞先生一家。 每一件展品都精…

RocketMQ初认识

ProducerCustomerNameServer: Broker的注册服务发现中心BrokerServer:主要负责消息的存储、投递和查询以及服务高可用保证 RocketMQ的集群部署&#xff1a; 单个master的分支多个Master 模式&#xff1a;集群中有多个 Master 节点&#xff0c;彼此之间相互独立。生产者可以将消…

Chrome开发者工具实战:调试三剑客

在前端开发的世界里&#xff0c;Chrome开发者工具就是我们的瑞士军刀&#xff0c;它集成了各种强大的功能&#xff0c;帮助我们快速定位和解决代码中的问题。今天&#xff0c;就让我们一起来看看如何使用Chrome开发者工具中的“调试三剑客”&#xff1a;断点调试、调用栈跟踪和…

C++/Qt 模拟sensornetwork的工作

C/Qt 可视化模拟sensornetwork的工作 C/Qt 模拟sensornetwork的工作 C/Qt 可视化模拟sensornetwork的工作内容简介&#xff08;一&#xff09; 需求和规格说明&#xff08;1&#xff09;问题描述&#xff08;2&#xff09;设计目的&#xff08;3&#xff09;基本要求&#xff0…

ffmpeg音频分析

对一个16k 单声道音频&#xff0c;生成频谱图 ./ffmpeg -i input.wav -lavfi "showspectrumpics800x400:modecombined:scalelin:gain1.5" spectrum.png

【多线程】CAS机制

目录 一. CAS的概念 二. CAS的原理 三.标准库中的CAS 四. CAS的应用 &#xff08;1&#xff09;原子类的使用 &#xff08;2&#xff09; 自旋锁的实现 五. CAS的ABA问题 一. CAS的概念 CAS&#xff08;Compare And Swap&#xff09;机制是一种无锁的并发控制技术&#…