OpenFeign服务接口调用

news2024/10/5 16:19:18

✨ OpenFeign服务接口调用

  • OpenFeign & Feign
    • Feign基本介绍
    • OpenFeign基本介绍
    • 二者对比
  • OpenFeign的使用
    • 新建Module:cloud-consumer-feign-order80
    • pom依赖
    • application.yml全局配置文件
    • 主启动类
    • Service
        • 1. 业务逻辑接口+@FeignClient配置调用provider服务
        • 2. 新建PaymentOpenFeignService接口并新增注解@FeignClient
    • Controller
    • 测试
  • OpenFeign的超时控制
    • 演示超时出错的情况
    • YML中需要开启OpenFeign客户端超时控制
      • yml
      • 超时控制详细介绍
      • 代码 & 测试
  • OpenFeign日志打印功能
    • 基本介绍
    • 日志级别
    • application.yml全局配置文件
    • 配置类
    • 测试

📃个人主页:不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥个人专栏:微服务专栏

OpenFeign & Feign

Feign基本介绍

  • Netflix Feign 是 Netflix 公司发布的一种 实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如** Eureka、Ribbon 以及 Hystrix** 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix Feign。
  • Feign 对 Ribbon 进行了集成,利用 Ribbon 维护了一份可用的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
  • Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。
  • 通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。
  • Feign 支持多种注解,例如 Feign 自带的注解以及 JAX-RS 注解等,但遗憾的是 Feign 本身并不支持 Spring MVC 注解,这无疑会给广大 Spring 用户带来不便。
  • 2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。

OpenFeign基本介绍

  • OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。
  • OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。
  • 我们在使用的时候,只需要创建一个接口,并且在接口上添加注解就可以了。
  • OpenFeign 常用注解——使用 OpenFegin 进行远程服务调用时,常用注解如下表。
  • 在这里插入图片描述

二者对比

  • Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式:使用Feign的注解定义接口,调用这个接口就可用调用服务注册中心的服务了。
  • OpenFeign是Spring Cloud在Feign的基础上支持了Spring MVC注解,比如@RequestMapping等,OpenFeign的@FeignClient可用解析Spring MVC的@RequestMapping注解下面的接口,并且通过动态代理的方式产生实现类,实现类中做负载均衡并且调用其他服务。

OpenFeign的使用

在这里插入图片描述

新建Module:cloud-consumer-feign-order80

在这里插入图片描述

pom依赖

注意:OpenFeign是自带Ribbon的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2022</artifactId>
        <groupId>com.zyh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-feign-order80</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!--添加的依赖 -->
    <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    <!-- 这个模块是之前抽取公共代码的时候,提取出来的模块 -->
        <dependency>
            <groupId>com.zyh.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

application.yml全局配置文件

server:
  port: 80
spring:
  application:
    name: cloud-consumer-feign-order80
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

主启动类

在这里插入图片描述

Service

1. 业务逻辑接口+@FeignClient配置调用provider服务

2. 新建PaymentOpenFeignService接口并新增注解@FeignClient

package com.zyh.springcloud.service;

import com.zyh.springcloud.entities.CommonResult;
import com.zyh.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * 远程调用接口
 *
 * @author zengyihong
 * @create 2022--10--14 13:46
 */
//声明bean对象,创建代理对象,进行远程调用
@Service
//指定调用微服务名称
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentOpenFeignService {
    @GetMapping(value = "/payment/get/{id}")
    /**
     * 接口方法声明要求:需要和被调用的服务的controller方法声明保持一致
     */
    CommonResult getPaymentById(@PathVariable("id") Long id);

    @PostMapping(value = "/payment/create")
    CommonResult<Payment> create(@RequestBody Payment payment);
}

在这里插入图片描述

Controller

package com.zyh.springcloud.controller;

import com.zyh.springcloud.entities.CommonResult;
import com.zyh.springcloud.entities.Payment;
import com.zyh.springcloud.service.PaymentOpenFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author zengyihong
 * @create 2022--10--14 13:49
 */
@RestController
public class OrderOpenFeignController {
    @Autowired
    private PaymentOpenFeignService paymentOpenFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return paymentOpenFeignService.getPaymentById(id);
    }
}

测试

  1. 先启动Eureka7001
  2. 再启动3个微服务8001/8002/8003
  3. 启动OpenFeign微服务:cloud-consumer-feign-order80
  4. http://localhost:7001/

在这里插入图片描述

  1. http://localhost:80/consumer/payment/get/1
  2. Feign自带负载均衡配置项(默认使用轮询)

在这里插入图片描述

OpenFeign的超时控制

演示超时出错的情况

OpenFeign 客户端的默认超时时间为 1 秒钟,如果服务端处理请求的时间超过 1 秒就会报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,也就是Ribbon的超时时间,因为Feign集成了Ribbon进行负载均衡。
在这里插入图片描述

开启payment8001,还有cloud-consumer-feign-order80,重新进行测试
在这里插入图片描述

在这里插入图片描述

YML中需要开启OpenFeign客户端超时控制

yml

#设置Feign客户端超时时间(openfeign默认支持ribbon)
ribbon:
  ReadTimeout:  3000
  ConnectTimeout: 3000
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  OkToRetryOnAllOperations: false  #是否所有操作都重试
#注意:
#默认情况下,GET 请求方式不管是连接异常还是读取异常,都会进行重试
#非GET请求方式,只有在连接异常的时候, 才会进行重试

#hystrix的超时时间
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 9000

超时控制详细介绍

一般情况下都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)
因为ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,源码如下
在这里插入图片描述

要开启Feign的重试机制如下:(Feign默认重试五次 源码中有)

@Bean
Retryer feignRetryer() {
        return  new Retryer.Default();
}

根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用
如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义
hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)*3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次
注意:
默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
非GET方式请求,只有连接异常时,才会进行重试

代码 & 测试

在这里插入图片描述

在这里插入图片描述

然后我们需要把payment8001/8002/8003这三个模块都启动起来
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

OpenFeign日志打印功能

基本介绍

  • OpenFeign 提供了日志打印功能,我们可以通过配置调整日志级别,来了解Feign中Http请求的细节。
  • Feign 为每一个 FeignClient 都提供了一个 feign.Logger 实例,通过它可以对 OpenFeign 服务绑定接口的调用情况进行监控。

日志级别

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

application.yml全局配置文件

logging:
  level:
    com.zyh.springcloud.service.PaymentOpenFeignService: debug

com.zyh.springcloud.service.PaymentOpenFeignService是开启 @FeignClient 注解的接口(即服务绑定接口)的完整类名。也可以只配置部分路径,表示监控该路径下的所有服务绑定接口

配置类

在这里插入图片描述

测试

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

第三十九讲:神州无线AC基础管理配置

瘦AP零配置上线&#xff0c;对AP的管理和配置都在AC上进行。AC的基础管理包括AC的无线地址指定及无线功能开启、AP的注册、AP用户数管理、自动信道调整等。 一、配置AC无线IP地址 设置静态的无线IP地址查看AC选取的无线IP地址3.开启无线功能 二、AP注册 1&#xff0e;二层模式…

【网络结构设计】11、E-LAN | 通过梯度传输路径来设计网络结构

文章目录一、背景二、方法2.1 网络设计策略2.2 Partial Residual Networks2.3 Cross Stage Partial Networks2.4 Efficient Layer Aggregation Network三、效果论文&#xff1a;Designing Network Design Strategies Through Gradient Path Analysis 代码&#xff1a;暂无 出…

微服务应用视角解读如何选择 K8s 的弹性策略

头&#xff1a;潘俊峰 前言 微服务架构的出现&#xff0c;拆分了庞大的单体应用&#xff0c;让业务之间的开发与协作变得更加灵活。当面临业务流量增加的场景时&#xff0c;往往需要对一些应用组件进行扩容。K8s 在应用层面提供了 HPA&#xff0c;围绕 HPA 开源社区延伸出了 …

SAP-FI模块 处理自动生成会计凭证增强

FICO-模块一. 相关问题概览1. 固定资产业务过渡科目摘要增强功能-F-022. 固定资产业务过渡科目摘要增强功能-MIGO3. 主营业务收入等科目自动反记账功能二. 问题图片描述1. 固定资产业务过渡科目摘要增强功能-F-022. 固定资产业务过渡科目摘要增强功能-MIGO3. 主营业务收入等科目…

JavaScript 作用域-作用域概述,变量作用域,作用域链

JavaScript 作用域-作用域概述&#xff0c;变量作用域&#xff0c;作用域链 目录JavaScript 作用域-作用域概述&#xff0c;变量作用域&#xff0c;作用域链1. 作用域1.1 作用域概述1.2 全局作用域1.3 局部作用域 (函数作用域)1.4 JS 没有块级作用域2. 变量的作用域2.1 变量作用…

校验和之概念、计算原理、检验原理、实例计算、代码编程,力荐力荐力荐

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。不用担心你关注我而我却不关注你&#xff0c;因为我是个诚信互关的人&#xff01;&…

如何用LightningChart创建Android图表数据可视化应用程序?(下)

LightningChart JS 是一款高性能的 JavaScript 图表工具&#xff0c;专注于性能密集型、实时可视化图表解决方案。 LightningChart .JS | 下载试用&#xff08;qun&#xff1a;740060302&#xff09;https://www.evget.com/product/4189/download 在上一篇&#xff0c;我们介…

CDN是什么?用了CDN就一定比不用更快吗?

对于开发同学来说&#xff0c;CDN这个词&#xff0c;既熟悉又陌生。 平时搞开发的时候很少需要碰这个&#xff0c;但却总能听到别人提起。 我们都听说过它能加速&#xff0c;也大概知道个原因&#xff0c;但是往深了问。 用了CDN就一定比不用更快吗&#xff1f; 就感觉有些…

Node.js操作Dom ,轻松hold住简单爬虫

前言 前段时间&#xff0c;我发现一个开源题库&#xff0c;题目非常有意思。我想把它整成一个JSON文件做为数据储备&#xff0c;方便整活。 一共有一百五十多道题目&#xff0c;手动CV我肯定是不想干的。于是写了个脚本&#xff0c;在写脚本的过程中&#xff0c;我发现一个能…

Opencv(C++)笔记--利用分水岭算法实现图像分割

1--分水岭算法的原理详细原理讲解可参考&#xff1a;博客1和视频1&#xff1b;原理简述&#xff1a;分水岭算法的基本思想是把图像视为拓扑地貌&#xff0c;图像中每一点像素的灰度值表示该点的海拔高度&#xff0c;每一个局部极小值及其影响区域称为集水盆&#xff0c;而两个集…

csrf漏洞原理及防御

攻击原理 从上图可以看出&#xff0c;要完成一次CSRF攻击&#xff0c;受害者必须依次完成两个步骤 1.登录受信任网站A&#xff0c;并在本地生成Cookie 2.在不登出A的情况下&#xff0c;访问危险网站B 防御原理 csrf能防御的本质是&#xff0c;黑客虽然携带了合法的cookie&a…

振弦采集模块的辅助功能寄存器

振弦采集模块辅助功能寄存器 1.频率值模拟量输出 VMXXX&#xff08;仅 VM501、 VM511&#xff09; 模块支持将当前实时频率值以模拟量形式从管脚输出&#xff0c;模拟量有电流和电压两种输出形式。为了使用此功能&#xff0c;需要将辅助功能寄存器 AUX.[0]设置为 1&#xff0…

<Linux开发> ubuntu开发工具-EasyConnect使用记录

&#xff1c;Linux开发&#xff1e; ubuntu开发工具-EasyConnect使用记录 1、安装EasyConnect 打开EasyConnect官网EasyConnect 根据当前电脑系统选择对应版本下载 作者这里是ubuntu 22.04版本 右击&#xff0c;选择 “软件安装” 即可安装完成&#xff1b;windows版本类似…

数据可视化:揭开“智慧校园”新篇章,助力新时代教育信息化

随着移动互联网、物联网等新一代信息技术的快速发展&#xff0c;建设智慧校园已经具备了成熟的技术条件。自从教育部启动教育信息化2.0计划后&#xff0c;建设智慧校园已成为我国教育信息化发展目标&#xff0c;无论是国家教育事业发展的十三五规划&#xff0c;还是十四五规划&…

Hadoop高手之路7-Hadoop的新特性

文章目录Hadoop高手之路7-Hadoop的新特性一、Hadoop2.0以上新特性二、Yarn资源管理框架1. yarn体系结构2. yarn的工作流程三、HDFS的高可用HA1. HDFS的高可用&#xff08;HA&#xff09;架构2. 搭建Hadoop高可用HA集群1) 规划集群节点2) 环境准备3) 配置HA集群(1) 修改core-sit…

【ROS】—— ROS通信机制——实践与练习(六)

文章目录前言1. 话题发布1.1 C方式实现1.2 python实现2. 话题订阅2.1 C实现2.2 python实现3. 服务调用3.1 C3.2 python4. 参数设置4.1 C4.2 python4.3 运行4.4 其他方式4.4.1 修改小乌龟节点的背景色(命令行实现)4.4.2 启动节点时&#xff0c;直接设置参数4.4.3 通过launch文件…

Java测试框架——JUnit详解(45)

文章目录前言何为JUnit&#xff1f;官方资料JUnit4常用注解和断言代码测试搭建一个JUnit测试环境生命周期忽略测试断言测试异常测试测试时间套件测试JUnit5JUnit5对比JUnit4的好处导包的改变注解的改变扩展JUnit新功能&#xff1a;参考文章JUnit是Java编程语言的单元测试框架&a…

list的介绍及模拟实现

&#x1f308;感谢阅读East-sunrise学习分享——list的介绍及模拟实现 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f499;我们一起进步 今天想分享介绍一下STL的容器之一lis…

openharmony GPIO 驱动开发

openharmony GPIO 驱动开发GPIO 基础知识GPIO 基础知识——概念GPIO 基础知识——IO 复用GPIO 基础知识——GPIO 分组和编号GPIO 基础知识——用户态测试HDF 框架下 GPIO 驱动HDF 框架下的 GPIO 驱动——案例描述(以 HI3516DV300 平台为例&#xff0c;提供代码)HDF 框架下的 GP…

为什么jvm需要有栈协程?

旧有的servlet生态的线程模型 首先我们先要聊一聊现在我们用的最多的servlet的执行模型是什么&#xff1a; 这个dispatch其实就是一个EventLoop或者说是一个selector来检测注册到其上的链接状态发生的变化 以Tomcat为例子&#xff0c;当这个selector发现存在一个链接可读时&…