Spring Cloud 微服务架构学习记录与示例

一、初识Hystrix

Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力。为了实现容错和自我保护,下面我们看看Hystrix如何设计和实现的。

Hystrix设计目标:

  • 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的
  • 阻止故障的连锁反应
  • 快速失败并迅速恢复
  • 回退并优雅降级
  • 提供近实时的监控与告警
Hystrix⽤于隔离访问远程系统、服务或者第三⽅库,防⽌级联失败,从⽽提升系统的可⽤性与容错性。Hystrix主要通过以下⼏点实现这些设计目标,主要包括延迟和容错。
  • 包裹请求:使⽤HystrixCommand或HystrixObservableCommand包裹对依赖的调⽤逻辑(切面增强的原理)
  • 跳闸机制:当某服务的错误率超过⼀定的阈值时,Hystrix可以跳闸,停⽌请求该服务⼀段时间
  • 资源隔离:Hystrix为每个依赖都维护了⼀个⼩型的线程池(舱壁模式)(或者信号量)。如果该线程池已满, 发往该依赖的请求就被⽴即拒绝,⽽不是排队等待,从⽽加速失败判定
  • 监控:Hystrix可以近乎实时地监控运⾏指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等
  • 回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执⾏回退逻辑。回退逻辑由开发⼈员⾃⾏提供,例如返回⼀个缺省值
  • ⾃我修复:断路器打开⼀段时间后,会⾃动进⼊“半开”状态

二、应用

1、引入pom依赖

  由于父项目中已经引入了SpringCloud依赖的版本管理,所以我这里只引入没有指定version属性,如果你的项目中没有版本管理需要单独引入version属性.

  1. <!--熔断器Hystrix-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  5. <!--<version> 2.0.2.RELEASE</version>-->
  6. </dependency>

2、引入pom依赖之后需要在启动类上开启熔断器

 注解介绍如果仅仅需要是一个熔断使用@EnableCircuitBreaker即可

  1. @EnableDiscoveryClient 注解声明启动Ribbon负载
  2. @EnableHystrix      标识使用Hystrix,在SpringBoot2.x版本后也可以省略掉
  3. @EnableCircuitBreaker 标识开启熔断器
  4. @SpringCloudApplication 注解等同与同属引入@SpringBootAppliction + @EnableDiscoveryClient + @EnableCircuitBreaker注解
  1. /**
  2. * @author niunafei
  3. * @function
  4. * @email niunafei0315@163.com
  5. * @date 2020/9/2 6:11 PM
  6. * <p>
  7. * 注解简化写法
  8. * @SpringCloudApplication = @SpringBootApplication + @EnableDiscoveryClient + @EnableCircuitBreaker
  9. */
  10. @SpringBootApplication
  11. @EnableDiscoveryClient
  12. @EnableHystrix
  13. @EnableCircuitBreaker
  14. //@SpringCloudApplication
  15. public class AutodeliverApplication {
  16. public static void main(String[] args) {
  17. SpringApplication.run(AutodeliverApplication.class, args);
  18. }
  19. /**
  20. * 注⼊RestTemplate
  21. * LoadBalanced开启ribbon
  22. *
  23. * @return
  24. */
  25. @Bean
  26. @LoadBalanced
  27. public RestTemplate getRestTemplate() {
  28. return new RestTemplate();
  29. }
  30. }

3、调取客户端进行配置使用

  多个参数说明,具体概念参考-->这里

  代码硬编码如下,应用于单个接口,这里存在跳闸与自我修复机制、线程池(舱壁模式)、服务降级。

  1. // 使⽤@HystrixCommand注解进⾏熔断控制
  2. @HystrixCommand(
  3. // 线程池标识,仓壁模式的应用,每一个标识独立线程池,要保持标识唯⼀,不唯⼀的话就共⽤了
  4. threadPoolKey = "findResumeOpenState",
  5. // 线程池细节属性配置
  6. threadPoolProperties = {
  7. @HystrixProperty(name = "coreSize", value = "1"), // 线程数,默认10个线程
  8. @HystrixProperty(name = "maxQueueSize", value = "20") // 等待队列⻓度
  9. },
  10. // commandProperties熔断的⼀些细节属性配置
  11. commandProperties = {
  12. // 每⼀个属性都是⼀个HystrixProperty,HystrixCommandProperties可以获取配置信息
  13. //服务降级,设置超时时间2秒
  14. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000"),
  15. //以下配置是熔断跳闸与自我修复:8秒钟内,请求次数达到2个,并且失败率在50%以上,就跳闸,跳闸后活动窗⼝设置为3s,即三秒后进行重试
  16. //统计时间窗口定义
  17. @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "8000"),
  18. //最小请求数量
  19. @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "2"),
  20. //统计时间框口内的异常百分比
  21. @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),
  22. //自我修复活动窗口时长
  23. @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "3000")
  24. },
  25. //异常返回方法,也是服务降级,方法的入参和返回值与该方法一致,在类上@DefaltProperties(defaultFallback="fallback")注解是为全类指定降级回调方法
  26. fallbackMethod = "fallback"
  27. )
  28. @GetMapping("/checkState/{userId}")
  29. public String findResumeOpenState(@PathVariable Long userId) {
  30. //发起调用
  31. Long start = System.currentTimeMillis();
  32. Integer forObject = restTemplate.getForObject("http://city-service-resume/resume/openstate/" + userId, Integer.class);
  33. System.out.println("======>>>调⽤微服务,获取到⽤户" + userId + "的默认 当前状态为:" + forObject);
  34. return forObject + " ,响应时间" + (System.currentTimeMillis() - start);
  35. }
  36.  
  37. /**
  38. * 降级返回值
  39. *
  40. * @param userId
  41. * @return
  42. */
  43. public String fallback(Long userId) {
  44. return -1 + " ,响应时间" + (System.currentTimeMillis() - System.currentTimeMillis());
  45. }

  全局配置如下(仅仅适用于commandProperties内的属性配置):改配置应用于全局HystrixCommand注解

  1. # 配置熔断策略:
  2. hystrix:
  3. command:
  4. default:
  5. circuitBreaker:
  6. # 强制打开熔断器,如果该属性设置为true,强制断路器进⼊打开状态,将会拒绝所有的请求。 默认false关闭的
  7. forceOpen: false
  8. # 触发熔断错误⽐例阈值,默认值50%
  9. errorThresholdPercentage: 50
  10. # 熔断后休眠时⻓,默认值5秒
  11. sleepWindowInMilliseconds: 3000
  12. # 熔断触发最⼩请求次数,默认值是20
  13. requestVolumeThreshold: 2
  14. execution:
  15. isolation:
  16. thread:
  17. # 熔断超时设置,默认为1秒
  18. timeoutInMilliseconds: 2000

提示:简单测试熔断器的状态(是否被熔断),方式通过SpringBoot的健康检查接口即可。需要:

  第一步配置开启健康检查(如下)

  第二步然后访问http://ip:端口/actuator/health接口

  第三步查看返回json的hystrix属性。

  1. # springboot中暴露健康检查等断点接⼝
  2. management:
  3. endpoints:
  4. web:
  5. exposure:
  6. include: "*"
  7. # 暴露健康接⼝的细节
  8. endpoint:
  9. health:
  10. show-details: always

三、监控

监控仪表盘

  上面链接监控仪表盘需要注意的点:

  1、正常配置springCloud的配置文件,包括应用名称与Eureka的注册中心等配置

  2、上面使用的spring原生xml配置方式,在springboot中被监控的应用添加以下Bean对象配置即可

  1. @Bean
  2. public ServletRegistrationBean getServlet(){
  3. HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
  4. ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
  5. //启动状态
  6. registrationBean.setLoadOnStartup(1);
  7. //mvc访问路径
  8. registrationBean.addUrlMappings("/actuator/hystrix.stream");
  9. //bean名称
  10. registrationBean.setName("HystrixMetricsStreamServlet");
  11. return registrationBean;
  12. }

SpringCloud之(豪猪)Hystrix限流、熔断、降级的更多相关文章

  1. springBoot整合Sentinel实现降级限流熔断

    由于hystrix的停止更新,以及阿里Sentinel在历年双十一的贡献.项目中使用了Sentinel,今天我们来讲讲Sentinel的入门教程,本文使用1.6.3版本进行讲解 本文通过Sentine ...

  2. Hystrix介绍以及服务的降级限流熔断

    (dubbo熔断,Hystrix问的少) 无论是缓存层还是存储层都会有出错的概率,可以将它们视同为资源.作为并发量较大的系统,假如有一个资源不可用,可能会造成线程全部 hang (挂起)在这个资源上, ...

  3. 高可用服务设计之二:Rate limiting 限流与降级

    <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <nginx限制 ...

  4. .net core使用ocelot---第四篇 限流熔断

    简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...

  5. 0.9.0.RELEASE版本的spring cloud alibaba sentinel限流、降级处理实例

    先看服务提供方的,我们在原来的sentinel实例(参见0.9.0.RELEASE版本的spring cloud alibaba sentinel实例)上加上限流.降级处理,三板斧只需在最后那一斧co ...

  6. .Net微服务实践(四)[网关]:Ocelot限流熔断、缓存以及负载均衡

    目录 限流 熔断 缓存 Header转化 HTTP方法转换 负载均衡 注入/重写中间件 后台管理 最后 在上篇.Net微服务实践(三)[网关]:Ocelot配置路由和请求聚合中我们介绍了Ocelot的 ...

  7. DBPack 限流熔断功能发布说明

    上周我们发布了 v0.4.0 版本,增加了限流熔断功能,现对这两个功能做如下说明. 限流 DBPack 限流熔断功能通过 filter 实现.要设置限流规则,首先要定义 RateLimitFilter ...

  8. SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

    源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监 ...

  9. springcloud3(六) 服务降级限流熔断组件Resilience4j

    代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-gateway/src/test/java/com/ ...

  10. dubbo 熔断,限流,降级

    1 写在前面 1.1 名词解释 consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲. 下面的A调用B服务,一般是泛指调用B服务里面的一个接口. 1.2 拓扑图 ...

随机推荐

  1. Hi3559AV100 SDK的详细安装过程及问题解决方法

    下面给出Hi3559AV100 SDK的安装的详细步骤(一些注意事项可以参照我之前写的随笔-<Hi3519 SDK搭建.问题总结及yolov3 RFCN的运行结果与测试 >): 1.开发环 ...

  2. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...

  3. 面试官:不会sql优化?出门右转顺便带上门,谢谢

    导读 作为一个后端程序员,数据库这个东西是绕不开的,特别是写sql的能力,如果您参加过多次面试,那么一定会从面试复盘中发现面试官总是会考察到sql优化这个东西. 我在之前的多次面试中最常遇到的一个问题 ...

  4. 【Arduino学习笔记06】上拉电阻和下拉电阻

    为什么要用上拉电阻和下拉电阻?--避免输入引脚处于"悬空"状态 下图是一个没有使用上拉电阻/下拉电阻的电路图: 在按键没有按下时,要读取的输入引脚没有连接到任何东西,这种状态就称为 ...

  5. mongoDB服务器连接不上Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException:

    一大早打开node项目就报错,终端报 UnhandledPromiseRejectionWarning: MongooseServerSelectionError: connect ECONNREFU ...

  6. &#128681;数分工作了三年,我干了件很酷的事情

    从17年毕业来,一直都在干数据分析的工作.和很多转行的小伙伴一样,没有对口的科班学习,摸不清数据分析具体情况,起初充满着很多迷茫. 在刚开始的1年半中,都是自己从淘宝买些课程,最多时,网盘放了4-5T ...

  7. [HEOI2014] 人人尽说江南好

    [HEOI2014] 人人尽说江南好 题目大意:一个博弈游戏,地上\(n\)堆石子,每堆石子有\(1\)个,每次可以合并任意两个石子堆\(a,b\),要求\(a + b \leq m\),问先手赢还是 ...

  8. python打印9宫格25宫格81宫格.....

    """ 2 问题描述: 3 给定一个奇数(num),生成一个横竖斜加起来的和相等 4 问题解析: 5 这其实就是一个九宫格的问题 6 九宫格问题的解答技巧: 7 1要放在 ...

  9. .Net5 下Dictionary 为什么可以在foreach中Remove

    在一个讨论群里,看见有人说Dictionary可以在foreach中直接调用Remove了,带着疑问,写了简单代码进行尝试 class Program { static void Main(strin ...

  10. C++11多线程编程(常见面试题)

    [题目1] 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码 [题解] 首先我们来分析一下这道题...( ...