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

【spring Cloud Netflix】OpenFeign组件

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.dtcms.com/a/113523.html

相关文章:

  • 第二十九章:Python-mahotas库:图像处理的高效工具
  • 使用 pytest-xdist 进行高效并行自化测试
  • PHP的垃圾回收机制
  • 我的创作历程:从不情愿到主动分享的成长
  • 用北太天元脚本解决了关于双曲线的求离心率对应的参数、等腰三角形条件下的点坐标和向量点积条件下的参数范围
  • 如何判断栈生长的方向
  • SDL显示YUV视频
  • 快速从零部署一个DeepSeek-R1服务
  • NAS原理与技术详解:从基础概念到实践应用
  • 基础知识补充篇:关于数据不可修改
  • 功能测试和性能测试的区别有哪些?
  • 使用Geotools中的原始方法来操作PostGIS空间数据库
  • java高并发------守护线程Daemon Thread
  • Redis数据结构之ZSet
  • P3654 First Step (ファーストステップ)
  • Linux:(五种IO模型)
  • 基于SSM的高校宿舍水电管理系统
  • 0201线性回归-机器学习-人工智能
  • 开篇 - 配置Unlua+VsCode的智能提示、调试以及学习方法
  • 【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
  • 《UNIX网络编程卷1:套接字联网API》第7章:套接字选项深度解析
  • 如何理解分类(Category)?Kotlin 扩展是何方神圣?C/C++编译器的C/C++扩展
  • 关于 Spring自定义缓存管理器 的详细说明,包含两种实现方式的对比和代码示例,并附表格总结
  • 复古未来主义屏幕辉光像素化显示器反乌托邦效果PS(PSD)设计模板样机 Analog Retro-Futuristic Monitor Effect
  • 多线程代码案例 - 2
  • 高速电路 PCB 设计要点二
  • 【代码模板】如何用FILE操作符打开文件?fopen、fclose
  • KUKA机器人软件WorkVisual更改语言方法
  • Springboot定时任务开发
  • Java 大视界 -- Java 大数据在智能医疗远程护理与患者健康管理中的应用与前景(175)