Spring Cloud 之五:Feign使用Hystrix

news2025/1/13 20:01:17

  系列目录(持续更新。。。)

Spring Cloud之一:注册与发现-Eureka工程的创建

Spring Cloud之二:服务提供者注册到Eureka Server

Spring Cloud之三:Eureka Server添加认证

Spring Cloud之四:使用Feign实现微服务间的交互


目录

Hystrix干什么用的?

Feign中使用Hystrix的降级

 1、在IUserFeignClient增加代码

2、在IUserFeignClient增加fallbackFactory参数

3、IUserFeignClient完整代码

4、pom增加阿里云hystrix依赖

5、yml配置文件开启hystrix

 6、测试


注意:该篇的实现是基于本系列使用的spring cloud版本,由于spring cloud版本众多,一些yml配置和pom包的引用可能会有所差异。

Hystrix干什么用的?

首先,总结下我们前面构建的项目:

项目端口
eureka-pass
7200服务发现与注册中心
user7101微服务:用户模块
order7102微服务:订单模块

基于上面的项目,上篇中我们在订单模块(order)里面使用Feign调用了用户模块(user)里面的接口。

但是,如果用户模块(user)因为某种原因响应慢或者模块服务挂了,导致无法及时响应订单模块(order)的请求,这时候订单模块(order)就会一直等待用户模块(user)的响应(一定时间后可能最终失败),这样就导致程序缓慢。这种情况是致命的,严重的情况可能会造成系统的崩溃。

举个例子:我们要向A模块请求一个接口,A模块请求B模块,B模块请求C模块,如下:

        A->B->C

这时候如果C模块无法正常响应B模块,B模块也就无法正常响应A模块,这样也就导致了系统的级联故障。

Hystrix就是为了解决上述问题的一个工具类库,它是一个容错库,用于防止级联故障,从而提升系统的可用性。

Hystrix具备如下功能:

1、防止单个接口异常导致整个微服务故障。
2、快速失败,如果服务出现故障,服务的请求快速失败,线程不会等待。
3、服务降级(FallBack),降级简单说就是“退而求其次”,访问不了,就自己设定一个返回方案,下面主要通过阐述这个功能来带大家入门。
4、熔断机制,防止故障的扩散,导致整个服务瘫痪。
5、服务监控,提供了Hystrix Bashboard仪表盘,实时监控熔断器状态

Feign中使用Hystrix的降级

那么,我们如何整合Hystrix呢?其实,上篇我们使用的Feign本身就已经集成了Hystrix功能。

在上一篇文章中,我们在订单模块(order)集成了Feign,项目机构如下:

通过Feign接口调用异常或超时需要触发降级,有两种方式来实现降级

1、通过 @FeignClient(fallback=…)来指定托底类

2、通过@FeignClient(fallbackFactory=…)来指定托底类

这两种方式的区别在于第1种没办法打印出异常日志的,而第二种是可以打印出异常日志的。推荐使用第2种方式,下面将演示第2种方式的实现(第一种方式在最后的完整代码里,我也会体现)。

 1、在IUserFeignClient增加代码

class UserFallbackFactory implements FallbackFactory<IUserFeignClient> {
    private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);

    @Override
    public IUserFeignClient create(Throwable cause){
        return new IUserFeignClient() {
            @Override
            public String getInfo() {
                                
                //记录日记
                UserFallbackFactory.LOGGER.error("调用异常:"+cause);
                
                return "我已经挂了";
            }

        };
    }


}

2、在IUserFeignClient增加fallbackFactory参数

3、IUserFeignClient完整代码

下面的代码是第1、2步骤后,IUserFeignClient文件的最终代码

package cn.laocheng.user.feignClient;

import cn.laocheng.user.model.TestModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

fallback方式
//@FeignClient(name="user",fallback = UserFallback.class)
//fallbackFactory方式
@FeignClient(name="user",fallbackFactory = UserFallbackFactory.class)
public interface IUserFeignClient {

    /**
     * feign调用无参数的Get请求
     * @return
     */
    @RequestMapping(value = "/getInfo",method = RequestMethod.GET)
    public String getInfo();

}

//@Component
//class UserFallback implements IUserFeignClient{
//    public String getInfo() {
//
//        return "我已经挂了";
//    }
//}


@Component
class UserFallbackFactory implements FallbackFactory<IUserFeignClient> {
    private static final Logger LOGGER= LoggerFactory.getLogger(UserFallbackFactory.class);

    @Override
    public IUserFeignClient create(Throwable cause){
        return new IUserFeignClient() {
            @Override
            public String getInfo() {

                //记录日记
                UserFallbackFactory.LOGGER.error("调用异常:"+cause);

                return "我已经挂了";
            }

        };
    }


}

4、pom增加阿里云hystrix依赖

我们这里使用的是阿里云hystrix,所以要增加下面的依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>

5、yml配置文件开启hystrix

feign:
  circuitbreaker:
    enabled: true

 6、测试

依次启动下列三个项目

项目端口
eureka-pass
7200服务发现与注册中心
user7101微服务:用户模块
order7102微服务:订单模块

访问:http://localhost:7101/getInfo

浏览器显示:

 这个其实在上篇已经演示过。

停止user模块

重新访问:http://localhost:7101/getInfo

浏览器显示

 

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

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

相关文章

camunda如何监控流程执行

在 Camunda 中&#xff0c;可以使用 Camunda 提供的用户界面和 API 来监控流程的执行情况。以下是几种常用的监控流程执行的方式&#xff1a; 1、使用 Camunda Cockpit&#xff1a;Camunda Cockpit 是 Camunda 官方提供的流程监控和管理工具&#xff0c;可以在浏览器中访问 Co…

【百面成神】消息中间件基础7问,你能撑到第几问

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;纯手打总结面试题&#xff0c;自用备用 &#x1f330; 文章简介&#xff1a;消息中间件最基础、重要的9道面试题 文章…

Android中的MVVM架构:使用Jetpack组件实现现代化的应用架构

Android中的MVVM架构&#xff1a;使用Jetpack组件实现现代化的应用架构 Jetpack组件是构建现代Android应用的绝佳利器&#xff0c;组件化设计让构建App如此简单。 引言 随着移动应用的日益复杂和功能的不断增加&#xff0c;构建稳健、可扩展和易维护的Android应用变得越来越重…

[考研数据结构] 第3章之队列的基本知识与操作

文章目录 队列的基本概念 队列的顺序存储 顺序队列 存储类型 基本操作 循序队列 存储类型 基本操作 循环队列判空与判满的三种解决方案 方法一&#xff1a;牺牲一个存储单元 方法二&#xff1a;类型增设记录型变量size 方法三&#xff1a;类型增设标志型变量tag 队…

嵌入式【协议篇】CAN协议原理

一、CAN协议介绍 1、简介 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。 其实可以简单把CAN通信理解成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定规则来决定谁先讲话谁后讲…

【音视频】 zlm的几个代理接口解释

目录 12、/index/api/addStreamProxy 30、/index/api/addStreamPusherProxy 14、/index/api/addFFmpegSource 24、/index/api/openRtpServer 27、/index/api/startSendRtp 参考 12、/index/api/addStreamProxy 拉流代理 &#xff1a; 194上在播放。 而10.30.2.6上加上这个…

FastDGCNN

Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data | IEEE Journals & Magazine | IEEE Xplore ​​​​​​​题目&#xff1a;Faster Dynamic Graph CNN: Faster Deep Learning on 3D Point Cloud Data&#xff08;更快的动态图形CNN&#xff1a;对…

Android 对View 进行旋转、缩放、平移的属性变换后,获取外矩形顶点

文章目录 前言改变 View 的属性&#xff0c;进行旋转、缩放、平移输出 View 的属性 使用 matrix 映射 view 变换后的外矩形前(左)乘(preXxx)、后(右)乘(postXxx) 对映射结果的影响前(左)乘(preXxx) 的意义后(右)乘(postXxx) 结论 来张图 前言 Android View 通过平移、旋转、…

找PPT模板就上这5个网站~

分享几个可以永久免费下载PPT模板、素材的网站&#xff0c;上万个模板随便下载&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYxMjky 网站素材非常全面&#xff0c;主要以设计类素材为主&#xff0c;办公类素材也很多&#x…

4、RSA终端指令

RSA总结 加密算法,都是数学知识对称加密(传统加密算法)RSA(三个人的名字)非对称加密(现代加密算法) 原根欧拉函数、欧拉定理(费马小定理)模反元素 m^(e * d) mod n ≡ m迪菲赫尔曼密钥交换RSA算法 RSA: 拆解两个(大)质数的乘积很难!所以RSA想对安全.加密: M ^e % N C解密: C…

前端学习:HTML头部、布局

目录 HTML头部 一、HTML 元素 二、head标签和header标签的不同 三、HTML 元素 四、HTML 元素 五、HTML 元素 六、 HTML 七、HTML元素 为搜索引擎定义关键词&#xff1a; 为网页定义描述内容&#xff1a; 每60秒刷新当前页面&#xff1a; 八、HTML 九、HTML头部元素…

Vue项目搭建流程

目录 1、通过命令创建 2、npm下载依赖 3、路由配置 4、配置组件 5、对axios进行二次封装 6、全局接口请求封装 7、配置跨域(反向代理) 1、通过命令创建 create vue 项目名 2、npm下载依赖 nmp i 依赖名版本号 axios1.2.1 echarts5.1.2 element-ui2.15.12 vue-router3…

56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载

文章目录 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载56.1 安装56.2 运行56.3 卸载 56 openEuler搭建Mariadb数据库服务器-安装、运行和卸载 56.1 安装 配置本地yum源&#xff0c;详细信息请参考《openEuler 22.03-LTS 搭建repo服务器》。 清除缓存。 # dnf clean…

【SpringBoot】1、SpringBoot整合JWT实现Token验证

这里写目录标题 1.单点登录1.1 单系统登录1.1.1 单系统登录流程(使用Session实现单系统登录) 1.2 多系统(单点)登录1.2.1 单点登录实现方案1.2.1.1 Session跨域1.2.1.2 Spring Session共享 1.3 Token机制1.3.1 传统身份认证1.3.2 基于Token的身份认证 1.4 JWT机制1.4.1 JWT数据…

Redis集群部署详解

文章目录 集群环境集群搭建测试集群故障转移集群扩容集群缩容 集群环境 集群介绍 1.什么是集群 所谓的集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态。 2.使用redis集群的必要性 单个redis存在不稳定…

9.6 数组的指针和指向数组的指针变量 - 3

9.6 数组的指针和指向数组的指针变量 - 3 一.回顾二维数组和多维数组的概念二.指向多维数组的指针和指针变量探究1.a:二维数组名&#xff0c;也是整个二维数组的首地址。我们可以认为是第0行的首地址是10002.a1 , a2 分别代表第一行首地址和第二行首地址。3.这表示a[0],a[1],a[…

Mapbox-gl.js v2.13.0 扩展支持4326,4490坐标系

mapbox-gl.js新版本中&#xff0c;支持多种projection 显示效果也不错&#xff0c;根据tiles grid可以看到&#xff0c;还是web_mercator的格网&#xff0c;基于图片做了一定的拉伸形变&#xff0c;想要加载4326的切片格网&#xff0c;依然无法实现。 后来在网上搜索加载4326切…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录 一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期 二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门 二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协…

【转行互联网】转行互联网必看答疑

课程 追忆寻梦-转行互联网必备知识 https://edu.csdn.net/course/detail/31180 2023年&#xff0c;迟来的编程私教服务 https://bbs.csdn.net/topics/613231237 优先 必读文章 初学者&#xff0c;打算改行学编程&#xff0c;怎么学习java&#xff1f;求指教。https://bb…

如何抓住IT行业最后的红利?网络安全为什么是风口行业?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…