5.springcloud微服务架构搭建 之 《springboot集成Hystrix》

1.springcloud微服务架构搭建 之 《springboot自动装配Redis》

2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》

3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》

4.springcloud微服务架构搭建 之 《springboot集成openFeign》

目录

1.项目引入hystirx

        1.1.项目引入hystrix坐标配置

        1.2.项目启动类启用断路器

2. HystrixCommand 注解

        2.1 使用HystrixCommand 实现fallback

                2.1.1 正常性测试

                 2.1.2 停掉cms服务,模拟服务不可用

          2.2 通过DefaultProperties实现全局fallback

                2.2.1 停到cms服务,模拟测试 

         2.3 通过自定义参数配置接口的熔断策略

 3.开启feign集成hystrix

        3.1 FeignClient 接口实现降级策略,FallbackFactory

                3.1.1 服务正常测试

                 3.1.2 停掉api服务测试

                3.1.3 继续模拟频繁调用接口,则会触发熔断

 4.全局Hystrix配置

5.参考


1.项目引入hystirx

        1.1.项目引入hystrix坐标配置

<!-- hystrix 配置 版本号:2.1.3.RELEASE-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>${spring.cloud.version}</version>
</dependency>

        1.2.项目启动类启用断路器

package lilock.cn.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication(scanBasePackages = {"lilock.cn.*"})
@EnableConfigurationProperties
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"lilock.cn"})  //启用feign调用
@EnableCircuitBreaker // 启用断路器
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class,args);
    }
}

2. HystrixCommand 注解

Hystrix提供了HystrixCommand,用于配置关于Hystrix相关配置,如:回调方法、超时时间、熔断配置等。想要使用hystrix,必须是用@HystrixCommand注解

这种模式下的hystrix使用,配置都是基于 @HystrixCommand注解配置的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置。

        2.1 使用HystrixCommand 实现fallback


    /**
     * 接口熔断
     * @return
     */
    @HystrixCommand(fallbackMethod = "testHystrixError")
    @GetMapping("/testHystrix")
    public String testHystrix(){
        log.info("testHystrix 接口调用 apiCmsServiceFeignClient.getHello");
        String value = apiCmsServiceFeignClient.getHello();
        return "[testHystrix] 验证断路器" + value;
    }


    public String testHystrixError(){
        log.info("{} testHystrixError 调用失败",System.currentTimeMillis());
        return "enable testHystrixError";
    }

                2.1.1 正常性测试

                 2.1.2 停掉cms服务,模拟服务不可用

           

          2.2 通过DefaultProperties实现全局fallback

时候一个类里面会有多个 Hystrix 方法,每个方法都是类似配置的话会冗余很多代码,这时候我们可以在类上使用 @DefaultProperties 注解来给整个类的 Hystrix 方法设置一个默认降级方法,特别标注的,降级走特别标注的方法,没有特别标注的,降级走默认方法

@RestController
@RequestMapping(path = "/user")
@Api(value = "系统用户",tags = {"系统用户"})
@Slf4j
@DefaultProperties(defaultFallback = "defaultFallBackMethod")
public class UserController {
    
    /***
      * 模拟全局配置fallback
      */
    @HystrixCommand
    @GetMapping("/testHystrixTimeOutFallback")
    public BaseResult testHystrixTimeOutFallback(@RequestParam("time") long time){

        BaseResult<String> value = apiCmsHystrixServiceFeignClient.getHystrixTimeOut(time);
        log.info("testHystrixTimeOutFallback 接口调用 响应结果:{}",value);
        try{
            Thread.sleep(time);
        }catch (Exception e){
        }
        return value;
    }


    public BaseResult defaultFallBackMethod(){
        String errorMsg = System.currentTimeMillis() +  "defaultFallBackMethod 调用失败触发熔断";
        log.error("{}",errorMsg);
        return BaseResult.faild(errorMsg);
    }
}

                2.2.1 停到cms服务,模拟测试 

         2.3 通过自定义参数配置接口的熔断策略

配置一个超时时间,并且fallback走公共模式


    /**
     * 模拟带参数走服务熔断
     * @return
     */
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")})
    @GetMapping("/testHystrixTimeDefault")
    public BaseResult testHystrixTimeDefault(long time){
        log.info("testHystrixTimeDefault 接口调用 apiCmsHystrixServiceFeignClient.testHystrixDefault");
        BaseResult<String> value = apiCmsHystrixServiceFeignClient.getHystrix();
        try{
            Thread.sleep(time);
        }catch (Exception e){
        }
        return value;
    }


  public BaseResult defaultFallBackMethod(){
        String errorMsg = System.currentTimeMillis() +  "defaultFallBackMethod 调用失败触发熔断";
        log.error("{}",errorMsg);
        return BaseResult.faild(errorMsg);
    }

接口sleep 1000ms 时间小于降级1500ms时间,正常返回 

 接口sleep 2000ms时间大于降级1500ms时间,触发降级

 3.开启feign集成hystrix

配置文件开启

feign:
  hystrix:
    enabled: true

        3.1 FeignClient 接口实现降级策略,FallbackFactory

fallbackFactory的好处是可以统一配置

当然Api接口上也可以单独配置@HystrixCommand

package lilock.cn.cms.api;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lilock.cn.cms.api.fallback.ApiCmsHystrixServiceFeignClientFallbackFactory;
import lilock.cn.common.resp.BaseResult;
import lilock.cn.common.ribbon.config.FeignConfig;
import lilock.cn.common.ribbon.constant.ApplicationServiceConstants;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

//FeignClient实现了FallbackFactory
@FeignClient(value = ApplicationServiceConstants.LILOCK_CMS_WEB,configuration = {FeignConfig.class},fallbackFactory = ApiCmsHystrixServiceFeignClientFallbackFactory.class)
public interface ApiCmsHystrixServiceFeignClient {

    @GetMapping("/getHystrix")
    BaseResult<String> getHystrix();

    @GetMapping("/getHystrixTimeOut")
    @HystrixCommand
    BaseResult<String> getHystrixTimeOut(@RequestParam long time);
}

                3.1.1 服务正常测试

                 3.1.2 停掉api服务测试

可以看到触发了fallbackFactory的服务降级,服务降级之后还会继续调用下游api

                3.1.3 继续模拟频繁调用接口,则会触发熔断

当降级的数量达到一定的百分比之后,接口就会触发熔断,触发熔断之后不会继续调用下游api

 4.全局Hystrix配置

hystrix:
  command:
    #全局默认配置
    default:
      execution:
        timeout:
          #是否给方法执行设置超时时间,默认为true。一般我们不要改。
          enabled: true
        isolation:
          #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
          strategy: threadPool
          semaphore:
            maxConcurrentRequests: 1000
          thread:
            #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
            timeoutInMilliseconds: 60000
            #发生超时时是否中断方法的执行,默认值为true。不要改。
            interruptOnTimeout: true
            #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
            interruptOnCancel: false
            #熔断器相关配置
      ##并发执行的最大线程数,默认10
      coreSize: 200
      #说明:是否允许线程池扩展到最大线程池数量,默认为false。
      allowMaximumSizeToDivergeFromCoreSize: true
      #说明:线程池中线程的最大数量,默认值是10。此配置项单独配置时并不会生效,需要启用allowMaximumSizeToDivergeFromCoreSize
      maximumSize: 200
      #说明1:作业队列的最大值,默认值为-1。表示队列会使用SynchronousQueue,此时值为0,Hystrix不会向队列内存放作业。
      #说明2:如果此值设置为一个正int型,队列会使用一个固定size的LinkedBlockingQueue,此时在核心线程池都忙碌的情况下,会将作业暂时存放在此队列内,但是超出此队列的请求依然会被拒绝
      maxQueueSize: 20000
      #设置队列拒绝请求的阀值,默认为5。
      queueSizeRejectionThreshold: 30000

      circuitBreaker:
        #说明:是否启动熔断器,默认为true。我们使用Hystrix的目的就是为了熔断器,不要改,否则就不要引入Hystrix。
        enabled: true
        #说明1:启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
        #说明2:那么如果此时默认值为20的话,那么即便10秒内有19个请求都失败也不会打开熔断器。
        #说明3:此配置项需要根据接口的QPS进行计算,值太小会有误打开熔断器的可能,而如果值太大超出了时间窗口内的总请求数,则熔断永远也不会被触发
        #说明4:建议设置一般为:QPS*窗口描述*60%
        requestVolumeThreshold: 3000
        #说明1:熔断器被打开后,所有的请求都会被快速失败掉,但是何时恢复服务是一个问题。熔断器打开后,Hystrix会在经过一段时间后就放行一条请求
        #说明2:如果请求能够执行成功,则说明此时服务可能已经恢复了正常,那么熔断器会关闭;相反执行失败,则认为服务仍然不可用,熔断器保持打开。
        #说明3:所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
        sleepWindowInMilliseconds: 5000
        #说明1:该配置是指在通过滑动窗口获取到当前时间段内Hystrix方法执行失败的几率后,根据此配置来判断是否需要打开熔断器
        #说明2:这里官方的默认配置为50,即窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉
        errorThresholdPercentage: 70
        #说明:是否强制启用熔断器,默认false,没有什么场景需要这么配置,忽略!
        forceOpen: false
        #说明:是否强制关闭熔断器,默认false,没有什么场景需要这么配置,忽略!
        forceClosed: false

5.参考

https://zhuanlan.zhihu.com/p/339535352

https://blog.csdn.net/weixin_40482816/article/details/119215962

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言刷题(7)(字符串旋转问题)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容依旧是复习之前的知识点&#xff0c;那么&#xff0c;就是做一道小小的题目啦&#xff0c;下面&#xff0c;让我们进入C语言的世界吧 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; A…

2023最新性能测试八股文【附答案】,软测人必备!

1. 请描述什么是性能测试、什么是负载测试、什么是压力测试&#xff1f;【参考答案】性能测试&#xff1a;性能测试是和功能测试相对应的。根据用户场景进行的单个用户操作&#xff0c;是属于功能测试领域&#xff0c;主要是验证软件是否可以满足用户的功能需求。比如&#xff…

【刷题之路Ⅱ】LeetCode 11.盛水最多的容器

【刷题之路Ⅱ】LeetCode 11.盛水最多的容器一、题目描述二、解题1、方法1——暴力法1.1、思路分析1.2、代码实现2、方法2——双指针2.1、思路分析2.2、代码实现一、题目描述 原题连接&#xff1a; 11.盛水最多的容器 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height…

44岁了,我从没想过在CSDN创作2年,会有这么大收获

1998年上的大学&#xff0c;02年毕业&#xff0c;就算从工作算起&#xff0c;我也有20余年的码龄生涯了。 但正式开启博文的写作&#xff0c;却是2021年开始的&#xff0c;差不多也就写了2年的博客&#xff0c;今天我来说说我在CSDN的感受和收获。 我是真的没想到&#xff0c;…

QT串口助手开发3串口开发

系列文章目录 QT串口助手开发3串口开发 QT串口助手开发3系列文章目录一、UI界面程序的编写二、发送框程序编写一、UI界面程序的编写 根据上文的未解决问题&#xff1a;我们打开串口按钮打开后只能选择关闭串口&#xff0c;所以这个是循环的过程 上文链接 所以按钮对应的槽函数…

【C++】搜索二叉树(保姆教程)

&#x1f345;二叉树底层是堆&#xff0c;之前学习的简单二叉树不是大堆就是小堆&#xff0c;今天是二叉树进阶&#xff0c;一定要好好掌握&#xff01; 目录 ☃️1.搜索二叉树介绍 ☃️2.底层实现 ☃️3.key模型和key&#xff0c;value模型 ☃️1.搜索二叉树介绍 右>根&…

蜻蜓优化算法Python代码(详细注释)

1.代入例子&#xff0c;目标函数求最优解迭代过程&#xff1a;蜻蜓算法流程&#xff1a;蜻蜓算法&#xff08;Dragonfly Algorithm&#xff09;是一种基于种群的优化算法&#xff0c;灵感来自于蜻蜓的群集行为。该算法通过模拟蜻蜓之间的吸引力和斥力&#xff0c;以及蜻蜓的移动…

IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件

目录 1、在Idea中找到下载插件&#xff0c;Install&#xff0c;重启Idea 2、一个测试java文件&#xff0c;里面有com包 3、在Idea中添加数据库 --------以Oracle数据库为例 4、快速生成entity-service-mapper方法 5、查看生成的代码 6、自动生成&#xff08;增删查改&#xff0…

C++ | 对比inline内联函数和宏的不同点

文章目录一、前言二、宏的优缺点分析1、概念回顾2、宏的缺点3、宏的优点三、inline内联函数1、概念2、特性①&#xff1a;空间换时间&#x1f381;趣味杂谈&#xff1a;庞大的游戏更新包3、特性②&#xff1a;inline实现机制4、特性③&#xff1a;inline的声明与定义反汇编观察…

【链表OJ题(八)】相交链表

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(八)8. 相交…

【C++笔试强训】第三十二天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

Spring Bean实例化和初始化的过程

承接上文Spring Bean生命周期应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?这里涉及到一个非常重要的接口Environment&#xff0c;System.getenv&#xff0c;System.getProperties都是获取当前系统环境变量&#xff0c;Environment接口的实现类AbstractEnviro…

浏览器前进与后退的秘密——栈 (栈的理解与实现)

文章目录前言&#xff1a;浏览器与栈的纠缠如何理解“栈”&#xff1f;如何实现一个“栈”&#xff1f;基于数组的顺序栈基于链表的链式栈解答开篇&#x1f431;‍&#x1f409;作者简介&#xff1a;大家好&#xff0c;我是黑洞晓威&#xff0c;一名大二学生&#xff0c;希望和…

每日算法题

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 作为篮球队教练&#xff0c;你需要从以下名单中选出 11 号位至 55 号位各一名球员&#xff0c;组成球队的首发阵容。 每位球员担任 11 号位至 55 号位时的评分如下…

CCF-CSP真题《202212-3 JPEG 解码》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202212-3试题名称&#xff1a;JPEG 解码时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题背景 四年一度的世界杯即将画上尾声。在本…

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式2)

STM32 OTA应用开发——通过串口/RS485实现OTA升级&#xff08;方式2&#xff09; 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级&#xff08;方式2&#xff09;前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…

面试阿里测开岗失败后,被面试官在朋友圈吐槽了......

前一阵子有个徒弟向我诉苦&#xff0c;说自己在参加某大厂测试面试的时候被面试官怼得哑口无言&#xff0c;场面让他一度十分尴尬印象最深的就是下面几个问题&#xff1a;根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f;非关系型数据库…

HashMap扩容为什么每次都是之前的2倍

一. 背景介绍HashMap的底层是通过数组链表红黑树的数据结构来存放数据的。我们知道&#xff0c;当新添加元素的key值出现了hash碰撞&#xff0c;就会在同一个bucket中形成链表或者红黑树。当键值对的数量超过阈值时就会扩容&#xff0c;将以前处于同一个链表或者红黑树上的元素…

持续集成 在 Linux 上搭建 Jenkins,自动构建接口测试

本篇把从 0 开始搭建 Jenkins 的过程分享给大家&#xff0c;希望对小伙伴们有所帮助。 文章目录 在 Linux 上安装 Jenkins在 Linux 上安装 Git在 Linux 上安装 Python在 Linux 上安装 Allure配置 Jenkinsjenkins 赋能 - 使用邮箱发送测试报告jenkins 赋能 - 优化测试报告内容…

C语言刷题(6)(猜名次)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰还是在复习噢&#xff0c;今天来给大家介绍一个有意思的题目 题目名称&#xff1a; 猜名次 题目内容&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A选…
最新文章