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

SpringCloud 之 Hystrix 断路器,服务降级,自定义配置

Hystrix 是由 Netflix 开源的⼀个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix 主要通过以下几点实现延迟和容错:

依赖隔离

Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)

1.引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

2.添加注释

在启动类上添加 @EnableCircuitBreaker 或 @EnableHystrix 注解开启断路器

PS:本文基于之前写的 ribbon 例子上进行代码的添加 SpringCloud 之 Ribbon

// 开启 Hystrix 断路器
@EnableCircuitBreaker
// Eureka 客户端
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

    // ...

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3.服务降级

关于 Feign 的 Hystrix 降级,异常拦截:SpringCloud 之 Feign 以及 Feign 异常处理

经过上面的配置 Hystrix 就已经能够正常使用了,但是当我们的请求出问题了怎么办?

继续添加依赖:

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

当我们的服务出现问题导致请求无法正常响应时,Hystrix 就会对服务进行降级,这段时间这个服务的请求都会走降级逻辑,我们可以自己设计这个降级逻辑来返回我们想要的东西,这个降级的时间默认是 5s,之后又会去尝试调用主逻辑。

在这个降级逻辑中,我们既可以用它来查找问题,也可以用来返回我们所需要的提示信息

/**
     * 获取信息示例
     * @return
     */
    // Hystrix 自定义参数使用示例
    @HystrixCommand(
            fallbackMethod = "fallback"
    )
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String getMsg(@PathVariable("id") Integer id) throws InterruptedException {
        Thread.sleep(2000);
        return restTemplate.getForObject("http://service-a/getMsg", String.class);
    }

    /**
     * 降级逻辑输出错误
     * 也可以用来返回错误提示
     * @return
     */
    public String fallback(Integer id, Throwable throwable) {
        System.out.println("id ======" + id);
        System.out.println("throwable ======" + throwable);
        return "fallback";
    }

当然你不需要获取你请求的参数以及错误,那么这个回调就不需要参数了

4.自定义断路器

配置参考:Hystrix 配置参数全解析

经常在一些特殊情况我们需要自定义断路器,比如:报表输出 之类的需要较长时间请求的类型,因为断路器默认的 5 s,极大可能无法满足要求,可见自定义配置还是必不可少的。为此这里给出配置模板,可以参考这种格式去自定义配置:

/**
     * 获取信息示例
     * @return
     */
    // Hystrix 自定义参数使用示例
    @HystrixCommand(
            fallbackMethod = "fallback",
            commandProperties = {
                    // 方法执行超时时间,默认值是 1000,即 1 秒
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value="10000"),
                    // 熔断降级时间配置
                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value="10000"),
            },
            threadPoolProperties = {
                    // 核心线程池的大小
                    @HystrixProperty(name = "coreSize", value = "1"),
                    // 设置队列大小为 5,默认为 -1 不启用队列
                    @HystrixProperty(name = "maxQueueSize", value = "1")
            }
    )
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String getMsg(@PathVariable("id") Integer id) throws InterruptedException {
        Thread.sleep(2000);
        return restTemplate.getForObject("http://service-a/getMsg", String.class);
    }

5.全局配置 Hystrix

PS:这个配置 IDEA 不会出提示,所以要多检查,看看有没写错了

这种在配置文件中进行的配置在优先级落后注解的配置方式,因此我们可以把全局配置与注解配置混搭使用以达到想要的效果

# 全局配置 hystrix 示例
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000

我们也可以在配置文件中通过将 default 换成方法名,以此单独对某个方法进行配置

# 全局配置 hystrix 示例
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000
    getMsg:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000

 

相关文章:

  • Oracle 让指定数据排在最前面
  • Gitlab 之 Windows 环境进行 tomcat 持续集成部署,包含项目打包,备份,部署以及问题
  • Git 克隆指定分支的代码
  • Vue 新手学习笔记:vue-element-admin 之 入门开发教程(v4.0.0 之后)
  • Tomcat 内存优化
  • SpringCloud 之 Zuul 基础使用与进阶
  • Navicat 连接 sqlserver 带端口号配置
  • SpringCloud 之 Config 配置中心与动态刷新
  • Java 基础:队列
  • Java 基础:栈
  • LeetCode 151. 翻转字符串里的单词
  • LeetCode 1. 两数之和
  • LeetCode 20. 有效的括号
  • LeetCode 202. 快乐数
  • LeetCode 217. 存在重复元素
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Joomla 2.x, 3.x useful code cheatsheet
  • redis学习笔记(三):列表、集合、有序集合
  • spring boot 整合mybatis 无法输出sql的问题
  • 不上全站https的网站你们就等着被恶心死吧
  • 翻译--Thinking in React
  • 区块链分支循环
  • 算法之不定期更新(一)(2018-04-12)
  • 移动端唤起键盘时取消position:fixed定位
  • 智能合约开发环境搭建及Hello World合约
  • const的用法,特别是用在函数前面与后面的区别
  • # 数论-逆元
  • #define与typedef区别
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (BFS)hdoj2377-Bus Pass
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (二十四)Flask之flask-session组件
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)ObjectiveC 深浅拷贝学习
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net Application的目录
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NetCore项目nginx发布
  • .Net组件程序设计之线程、并发管理(一)
  • ::前边啥也没有
  • @Bean有哪些属性
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [Angular] 笔记 21:@ViewChild
  • [BT]BUUCTF刷题第9天(3.27)
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)