【微服务笔记(九)】之Feign,Feign的负载均衡与熔断

2023-11-10

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一. Feign

(一) 概述

       之前使用Ribbon的负载均衡功能,简化了远程调用时的代码,但是每次调用都需要写基本相同的代码,代码重复性高。Feign可以把Rest的请求进行隐藏,伪装成类似Controller一样,我们不需要拼接url,这些工作都可以让Feign来完成。

(二) Feign实例

1. 在服务消费方添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. 开启Feign功能

       在服务消费方的引导类上添加注解@EnableFeignClients,用于开启Feign功能。

3. 创建Feign客户端

       创建一个Feign客户端接口,在该接口上添加注解@FeignClient(“user-service”),该注解声明了当前的类是一个Feign客户端,并且指定了访问的服务名是user-service。Feign客户端就是为了拼接URL,接口内的每个方法都是一个请求方法,在每个方法上添加注解访问的URL,如@GetMapping(“/user/{id}”),动态代理会自动生成该接口的实现类,将该接口的服务名和请求方法的URL拼接起来,组成最终访问提供服务的URL.。

package com.springboot.client;

import com.springboot.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("user-service")
public interface ConsumerFeignClient {

    @GetMapping("/user/{id}")
    User queryById(@PathVariable Long id);
}

4. 创建处理器,注入Feign客户端

       创建一个处理器Controller,注入Feign客户端,使用该客户端接口的方法queryById,动态代理会自动创建该接口的实现类。那么该方法实现的就是访问客户端拼接成的服务地址,返回服务数据。

@RestController
@RequestMapping("feign")
public class ConsumerFeignController {

    @Autowired
    private ConsumerFeignClient feignClient;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id){
        return feignClient.queryById(id);
    }
}

5. 测试

       启动服务提供方,Eureka Server,服务消费方,通过Feign的Controller设定的地址访问其中的方法,就可以获取相应的服务数据。


二. Feign的负载均衡和熔断

(一) Feign配置Ribbon

       Feign中已经集成了Ribbon依赖和自动配置,因此不需要额外引入依赖,也不需要再注册RestTemplate对象。Feign内置的Ribbon默认设置了请求超时时长,默认是1000,我们可以通过手动配置来修改:

ribbon:
	ReadTimeout: 2000 #读取超时时长
	ConnectionTimeout: 1000 #建立连接的超时时长

       Ribbon内部有重试机制,超时后会自动重新发起请求,如果想修改,如下所示:

ribbon:
	ConnectionTimeout: 1000 #连接超时时长
	ReadTimeout: 2000 #数据通信超时时长
	MaxAutoRetries: 0 #当前服务器的最大重试次数
	MaxAutoRetriesNextServer: 0 
	OkToRetryOnAllOperations: false #是否对所有的请求方式都重试

(二) Feign配置Hystrix

1. 开启Hystrix

       同样的,Feign中已经内置了Hystrix,直接通过配置来开启Hystrix,如下所示:

feign:
	hsytrix:
		enabled: true

2. 创建服务降级的类

       创建一个在服务降级时调用的类,该类中的每个方法都与Feign客户端接口中的方法对应,因此直接实现Feign客户端接口,重写每个方法,编写访问服务失败时的操作。注意,要在该类之上添加注解@Component,让Spring知道这是一个组件。

@Component
public class FeignClientFallback implements ConsumerFeignClient {
    @Override
    public User queryById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("error");
        return user;
    }
}

3. 修改Feign客户端的@FeignClient注解

       修改Feign客户端的@FeignClient注解,添加fallback参数,绑定服务降级类到Feign客户端中。

@FeignClient(value="user-service", fallback = FeignClientFallback.class)

4. 测试

       设定Hystrix的超时时间为2秒,同时在Feign的Controller中设置休眠两秒,制造异常,发现服务降级成功。

(三) Feign配置压缩

       Spring Cloud Feign能够对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。直接通过配置feign中的参数即可开启压缩功能,如下所示:

feign:
	compression:
		request:
			enabled: true #请求压缩
			mime-types: text/html,application/xml,application.json #压缩的数据类型
			mim-request-size: 2048 #设置触发压缩的大小下限
		response:
			enabled: true #响应压缩

(四) Feign配置日志级别

       一般的包的日志级别可以通过在配置文件中设置 logging.level.xx=debug,就可以为xx这个包设定日志级别为debug。然而对于被@FeignClient注解修改过的Feign客户端接口来说,当它被代理时,会创建一个新的Feign.Logger实例,我们需要额外指定这个日志的级别。需要创建一个Feign的配置类,用于创建新的Logger实例。


1. 修改包的日志级别
logging:
		level:
			com.springboot: debug

2. 添加Feign的配置类

       添加Feign的配置类,定义日志级别。注意,要在该配置类上添加@Configuration表示这是一个配置类。

package com.springboot.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

Feign支持的日志级别有4种:
       (1) NONE: 不记录任何日志信息,默认

       (2) BASIC: 只记录请求的方法,URL以及响应状态码和执行时间

       (3) HEADERS:在BASIC的基础上,添加了请求和响应的头信息

       (4) FULL:记录所有请求和响应的明细,包括头信息,请求体,元数据

3. 在Feign的客户端中指定配置类

       这个日志的配置类是为Feign客户端接口配置的,因此需要在Feign的客户端接口中通过注解@FeignClient指定该配置类。

@FeignClient(value="user-service", fallback = FeignClientFallback.class, configuration = FeignConfig.class)

4. 测试

       开启服务消费方,正常访问后,日志就会打印在控制台中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【微服务笔记(九)】之Feign,Feign的负载均衡与熔断 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 微信小程序实现滑动/点击切换Tab

    背景 swiper scroll view实现滑动 点击切换Tab 以及scroll left的使用 文末分享源代码 记得点赞 关注 收藏 1 实现效果 2 实现步骤 2 1 scroll view实现tab列表 scroll view 可
  • react+antd 修改主题色

    项目使用的时 react 框架 和 ant design ui组件库 antd 官网中对定制主体是这样说的 详见 https ant design docs react customize theme cn 官网说的是 antd 的样式使用
  • Python中的几大产生随机数的函数range,randint以及xrange函数

    文章目录 1 xrange 函数 2 range 函数 3 randint 函数 示例代码 1 xrange 函数 现在python的版本大多都已经采用python3 x版本 python2 x版本已经逐渐不被人们所使用 xrange 函数
  • linux图形界面切换到字符界面

    redhat linux图形界面切换到字符界面 1 X Window图形界面和字符界面自由切换 一 图形界面切换到字符界面 在X Window图形操作界面中按 Alt Ctrl Fn n 1 6 就可以进入Console字符操作界面 这就意
  • C++强制类型转换运算符-dynamic_cast、const_cast、static_cast、reinterpret_cast、dynamic_pointer_cast、const_pointer

    C 强制类型转换 dynamic cast 回答的问题 是否能将某个对象的地址安全地赋值给一个特定类型的指针 同时也回答了强制类型转换是否安全的问题 dynamic cast用于类继承层次间的指针或引用转换 主要还是用于执行安全的向下转型
  • AddBinary[LeetCode]

    掌握了刚才的方法 这类问题都解决了 class Solution public string addBinary string a string b int m a size 1 int n b size 1 int carry 0 str
  • kaggle数据分析实践项目练习——人力资源分析

    学习完 利用python进行数据分析 之后 学习了Numpy pandas matplotlib几个包的使用 于是着手准备在kaggle上找数据集进行练习 在kaggle中找到了人力资源分析项目 看到不少人拿这个项目练手 本文将会分析为何公
  • 【Hadoop系列】linux下 root用户免密码登录远程主机 ssh

    SSH原理 Hadoop系列 linux SSH原理解析 操作环境 CentOS 6 5 操作对象 用户A主机和远程主机B 正文部分 斜体加粗代表linux指令 linux下 非root用户免密码登录远程主机 ssh请转至此链接 XXXXX
  • Linux CentOS7命令及命令行

    Linux CentOS7中命令及命令行是非常重要的概念 对大多数初学者来说是既熟悉又了解甚少 本文初步讨论这方面的内容 与同行者交流 一 命令 命令又称为指令 英语命令 command 可用简写cmd表示 在终端命令行中执行的一段字符 一
  • QT5.14.2+VS2017环境安装

    1 下载Qt5 14 2以及qt vs插件 1 Qt官网下载地址 操作系统是win10企业版 在目录qt下找到程序qt opensource windows x86 5 14 2 exe 在目录vsaddin下找到程序qt vsaddin
  • 时间基础概念及Linux中的时间函数

    时间基础概念及Linux中的时间函数 时间相关概念 GMT 时间 UTC 时间 时区 Time Zone 夏令时 DST 本地时间 localtime Linux 系统中的时间 时钟基础概念 系统节拍数 jiffies Linux系统查看时
  • 生产者与消费者问题?

    生产者消费者模式是并发 多线程编程中经典的设计模式 简单来看 就是一个类负责生产 一个类负责消费 举例来说 一个变量 生产者不断增加这个变量 消费者不断减少这个变量 在互联网应用中 抢票机制就是应用了该模式 比如大麦网演唱会门票抢票 123
  • linux作业后台管理

    参考 http blog itpub net 26736162 viewspace 2142674 常用命令 参考http blog chinaunix net uid 26785297 id 3375270 html fg bg jobs
  • 一文搞清到底什么是 .NET?

    现在各种 NET 满天飞 别说新手了 连我这样的老手都差点被绕进去 到底什么是 NET 呢 通俗易懂 什么是 NET 什么是 NET Framework 什么是 NET Core 这篇文章好长呀 不知道你看完了没有 其实最关键的是核心的几个
  • 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。(C语言)基础版

    输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出两个输入序列的交集序列 数字间用空格分开 结尾不能有多余空格 若新链表为空 输出NULL in
  • session机制详解以及session的相关应用

    session是web开发里一个重要的概念 在大多数web应用里session都是被当做现成的东西 拿来就直接用 但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求 当碰到这样的情况时候我们需要更加深入的理解sessi
  • layui 前端下载文件方法

    文件下载 function downLoadFile ids name 获取token var tableName layui data setter tableName 创建下载请求 var oReq new XMLHttpRequest
  • 学计算机的的用87键键盘可以吗,键盘87和108键区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 键盘87和108键区别是 1 87键的键盘有87个按键 108键的键盘有108个按键 2 108键的键盘在87键键盘的基础上增加了17个数字辅助按键和4个功能键 键盘 Ke
  • 【环境配置篇】保姆级教学之Ubuntu20.04上编译OpenCV+CUDA

    保姆级教学之Ubuntu20 04上编译OpenCV CUDA 自从发了上一期在Ubuntu20 04上配置深度学习环境的视频之后 我收到了很多小伙伴的反馈 其中有不少同学私信我表示 能不能教我怎么编译OpenCV呢 但其实在Ubuntu上
  • 【微服务笔记(九)】之Feign,Feign的负载均衡与熔断

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 Feign 一 概述 之前使用Ribbon的负载均衡功能 简化了远程调用时的代码 但是每次调用都需要写基本相同的代码 代码重复性高 Feign可以把Rest的请求进行隐藏 伪装成