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

一、初识Hystrix

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

Hystrix设计目标:

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

二、应用

1、引入pom依赖

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

       <!--熔断器Hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<!--<version> 2.0.2.RELEASE</version>-->
</dependency>

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

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

@EnableDiscoveryClient 注解声明启动Ribbon负载
@EnableHystrix      标识使用Hystrix,在SpringBoot2.x版本后也可以省略掉
@EnableCircuitBreaker 标识开启熔断器
@SpringCloudApplication 注解等同与同属引入@SpringBootAppliction + @EnableDiscoveryClient + @EnableCircuitBreaker注解
/**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/9/2 6:11 PM
* <p>
* 注解简化写法
* @SpringCloudApplication = @SpringBootApplication + @EnableDiscoveryClient + @EnableCircuitBreaker
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableHystrix
@EnableCircuitBreaker
//@SpringCloudApplication
public class AutodeliverApplication {
public static void main(String[] args) {
SpringApplication.run(AutodeliverApplication.class, args);
}
/**
* 注⼊RestTemplate
* LoadBalanced开启ribbon
*
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

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

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

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

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

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

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

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

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

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

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

# springboot中暴露健康检查等断点接⼝
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接⼝的细节
endpoint:
health:
show-details: always

三、监控

监控仪表盘

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

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

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

    @Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
//启动状态
registrationBean.setLoadOnStartup(1);
//mvc访问路径
registrationBean.addUrlMappings("/actuator/hystrix.stream");
//bean名称
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}

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. macOS命令行切换Python版本

    目录 brew安装anaconda3 anaconda3环境变量设置 安装双版本 命令后切换python环境 pip ide vscode set 参考 brew安装anaconda3 brew ca ...

  2. node.js详解1

    1.运行node脚本     新建app.js   写入代码console.log('hello')     cmd终端执行 node app.js 2.node读取环境变量     浏览器地址:ht ...

  3. pytorch(03)tensor的操作

    张量操作 一.张量的拼接 torch.cat() 功能:将张量按维度dim进行拼接,且[不会扩张张量的维度] tensors:张量序列 dim:要拼接的维度 torch.cat(tensors, di ...

  4. PTA甲级—常用技巧与算法

    散列 1078 Hashing (25 分) Quadratic probing (with positive increments only) is used to solve the collis ...

  5. MySQL基本指令3 和 索引 、分页

    1视图: -创建  create view 视图名称 as SQL  ps:虚拟 -修改  alter view 视图名称 as SQL -删除  drop view 视图名称 2触发器  3自定义函 ...

  6. java异常的 理解

    1.体系结构 java.lang.Object |----java.lang.Throwable |-------java.lang.Error:错误,java程序对此无能为力,不显式的处理 |--- ...

  7. Python爬虫知识

    一.爬虫 1.概述 网络爬虫,搜索引擎就是爬虫的应用者. 2.爬虫分类 (1)通用爬虫,常见就是搜索引擎,无差别的收集数据,存储,提取关键字,构建索引库,给用户提供搜索接口. 爬取一般流程: 初始化一 ...

  8. FTT简单入门板子

    DFT : 1 #include <cstdio> 2 #include <iostream> 3 #include <cmath> 4 #include < ...

  9. C# yield return 原理探究

    天需要些一个小工具,需要使用到多线程读写程序集,接口方法返回值类型需要为"IEnumerable<string>"这里用到了"yield return&quo ...

  10. 依赖反转原则DIP 与使用了Repository模式的asp.net core项目结构

    DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 假设Controller依赖于Repo ...