2019独角兽企业重金招聘Python工程师标准>>>

工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应

有A服务调用B服务,B服务调用C服务,如果B服务调用C服务出了问题,那么B服务会一直重试,等待会将资源耗尽,结果B服务也不可用,导致A服务调用B服务的时候,也出问题,这样的话,ABC服务都瘫了

为预防以上问题,在下面学习Spring Cloud Hystrix,防雪崩,容错机制,基于NetFlix的Hystrix

Hystrix翻译中文是豪猪的意思,没见过也知道防御力很高的样子,还有之前学习的Eureka翻译中文的意思是找到了,就是后来词化成发现

Hystrix 供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问

Spring Cloud Hystrix

①服务降级

②服务熔断

③依赖隔离

④监控(Hystrix Dashboard)

根据以上特性功能开始学习

服务降级

这个功能其实我们平时也都见过,比如访问某宝页面抢购,某奇艺看东西会提示: 网络开小差了,请稍后再试 等类似的提示

服务降级主导思想是区分业务,详细体现在优先核心服务,非核心服务不可用或放低其可用度,就有一种弃车保帅的意思,舍小保大

假设一个电商系统,某天的交易有巨大的流量出现,摆好的服务器资源就这么多,那么优先保证商品、订单、支付等服务的可用性,另外比如广告、积分等就属于非核心服务,那么就可以调度一下

细分到服务,比如商品服务,购买的时候,买家查询频繁度远高于卖家查询,那么就可以调度买家查询为核心服务,优先保证其可用性,另外买家查询服务就属于非核心服务,实际还需要根据业务场景调度

Hystrix的使用,通过@HystrixCommand注解,fallbackMethod回退函数实现降级逻辑

在之前的order服务和product服务进行学习,主要学习组件内容,按套路出牌

order服务

第一步maven加入Hystrix的依赖

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

注意: 如果后面@DefaultProperties注解无法导入的话,在依赖上把版本号<version>加上

凡是遇到这样的问题,大多数原因是官方把这个包名改过了,为了继续使用原来已经使用过的组件依赖,要求加上version指定版本,才可以

这边spring-cloud-starter-hystrix的名字在spring cloud 2.0.3发布的正式版中改成了spring-cloud-starter-netflix-hystrix

所以引入依赖,改成以下写法就可以了

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

第二步在启动类上,将之前的注解替换成@SpringCloudApplication,

该注解包含@SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker三个注解的效果

从这点大家就可以明白怎么整合注解功能的使用

@SpringCloudApplication
@EnableFeignClients
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}

第三步创建一个controller测试代码

/*** 测试 使用hystrix*/
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {/*** HystrixCommandProperties 参数对应查看* 下面超时配置*/@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})@GetMapping("/list")public String list() {RestTemplate restTemplate=new RestTemplate();String s=restTemplate.postForObject("http://192.168.5.102:9001/product/list",Arrays.asList("1"),String.class);return s;}public String defaultFallback() {return "拼命加载中...";}
}

简单的测试降级,请求发送会触发defaultFallback的返回,相关配置信息也不用记,实在太长了,知道在哪里就可以了,如果不出现降级,可以去url请求的终端服务做点小手脚,比如thread.sleep(xxx)

依赖隔离

依赖隔离就想到之前学习的docker,也具有隔离特性,docker实现进程的隔离,使容器之前互不影响,回来Hystrix,他使用的是线程池隔离方式,Hystrix会为每一个hystrixcommand创建独立的线程池,你就像上面测试的某一个依赖服务,并不会拖慢影响其他的服务,Hystrix自动实现依赖隔离

熔断机制

微服务分布式容错机制必须要考虑,到目前知道的方式主要两种,

①重试机制: 对应预期短暂的故障问题

②断路器模式: 对应更长时间的故障问题,该模式是将受保护的服务封装在一个可以监控故障的断路器对象中,当该服务的故障达到阀值,断路器就会采取措施,跳闸断路,断路器对象被采取返回错误的方式告之

martin fowler发的一篇文章,关于CircuitBreaker(断路器),

URL: https://martinfowler.com/bliki/CircuitBreaker.html

拿其中的执行状态机制图,做一个翻译学习

以上解释到断路器设计模式---状态机制,可以看出有三种状态closed、open、half open, 顾名思义,以熔断路为主角

closed: 熔断器关闭状态,调用失败次数累计达到阀值,就会启动熔断机制

open/half open: 熔断器打开状态,此时对服务都直接返回错误,该处设计时钟概念,到了点就会进入half open状态,运行一些服务请求,如果请求是成功的,就认为服务恢复了,关闭熔断器closed,否则就继续fail回到open状态

代码中注解配置写法类似超时设置,主要参数以及说明 如下:

/*** HystrixCommandProperties 参数对应查看* @return*/
@HystrixCommand(commandProperties = {//超时设置@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000"),//设置熔断@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//设置滚动窗口中,断路器的最小请求数量@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),//断路器确定是否需要打开统计请求和错误数据的时候,具有一个时间范围即时间窗口,当断路器打开,//对主逻辑进行熔断之后,hystrix会启动休眠时间窗,此时降级逻辑会称为主逻辑,当休眠时间窗到期,断路           //器就进入half open状态//尝试释放请求到原主逻辑上,就想之前描述的,成功则断路器闭合closed,失败则继续打开open,休眠时间//窗将重新计时//以下设置休眠时间窗为10000毫秒@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//设置断路器打开的百分比条件,//比如此处设置为60,在滚动窗口中发生了10次request,有7次发生了异常,超出设置值,则断路器就进入//open状态,反之即closed@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")}
)
@GetMapping("/list")
public String list() {......
}

以上是粗略学习hystrix,所以配置都写在了注解上面,下面转化配置文件,以超时设置为例,上面服务中的方法名字是list,下面设置一个默认超时设置和一个针对list方法的超时设置,在方法上需要加上@HystrixCommand注释,该注解有一个commandKey参数,指定该方法的key使用断路器,如果不设置默认是方法的名字,此处没有其他方法,图方便就直接用名字

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2500list:execution:isolation:thread:timeoutInMilliseconds: 2800

关于Hystrix还有控制面板可以观察调控的更清晰,还有结合Hystrix+feign等方面的使用,继续学习

-------------------------------------------------------------

转载于:https://my.oschina.net/u/3829444/blog/1860203

SpringCloud 微服务 (十五) 服务容错 Hystrix相关推荐

  1. Dubbo学习记录(十五) - 服务调用【一】-之 服务端Netty的hander包装过程与 服务端线程模型

    Dubbo服务调用 之前写十几篇文章, 自己对Dubbo的运行有了一定的了解.而Dubbo服务调用则是重中之重, 目测将这个过程写出来起码需要5-6篇文章: 服务端Netty的hander包装 服务导 ...

  2. 手把手教你搭建SpringCloud项目(十)集成Hystrix之服务降级

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  3. 手把手教你搭建SpringCloud项目(十六)集成Stream消息驱动

    Spring Cloud全集文章目录: 零.什么是微服务?一看就会系列! 一.手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二.手把手教你搭建SpringCloud项目(二)生产 ...

  4. SpringCloud Alibaba 微服务架构(十五)- 一文详解 Nacos 高可用特性

    前言 服务注册发现是一个经久不衰的话题,Dubbo 早期开源时默认的注册中心 Zookeeper 最早进入人们的视线,并且在很长一段时间里,人们将注册中心和 Zookeeper 划上了等号,可能 Zo ...

  5. SpringCloud微服务架构之,Hystrix 熔断器,Gateway 网关

    Hystrix 概述 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务.第三方库,防止出现级联失败(雪崩). pom依耐 <!-- hystrix -->&l ...

  6. 《深入理解 Spring Cloud 与微服务构建》第十五章 微服务监控 Spring Boot Admin

    <深入理解 Spring Cloud 与微服务构建>第十五章 微服务监控 Spring Boot Admin 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  7. SpringCloud微服务,euraka、feign、hystrix组件学习

    SpringCloud 1 eureka 1.1 eureka基本概念 eureka主要包含两个组件:Eureka Server 和 Eureka Client. eureka server(注册中心 ...

  8. Github三天点击破亿,四天助力金九银十,精通SpringCloud微服务架构,成就大厂梦

    又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群众多,技术 ...

  9. SpringCloud微服务基础 Eureka、Feign、Ribbon、Zuul、Hystrix、配置中心的基础使用

    1.单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N ...

最新文章

  1. 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
  2. openstack的网络、子网、端口的关系
  3. HDU 3625 Examining the Rooms【第一类斯特灵数】
  4. html一半文字一半图片,一个div的子div宽是200高是350 里面怎么让图片显示一半 另外一半文字居中!?...
  5. webView 点击连接如何不让跳转到系统的 浏览器
  6. 洛谷【P2257】YY的GCD
  7. UDT协议实现分析——UDT Socket的创建
  8. ajax跨域只能是get,jsonp跨域请求只能get变相解决方案
  9. 前端笔记-webpack加载前端资源(图片,css等)
  10. 测试方案和测试计划的区别
  11. DSP原理与应用知识点(期末复习)
  12. 64k超高清3d程序 Warez出品的精品动画 近25万倍的压缩的精品
  13. 银行计算机综合知识,银行秋招综合知识测试包含哪些专业课?
  14. LDA-线性判别分析
  15. SQL Server 大数据管理——数据归档(主文件备份)
  16. Chapter 12 设计概念
  17. 科技云报道:中国电子云曹心驰:做成云计算“国家队”该有的样子
  18. 软件测试面试题银行,资讯详情-金融测试面试题-柠檬班-自动化测试-软件测试培训-自学官网...
  19. yolov2中的reorg网络层数据理解
  20. P2071 座位安排

热门文章

  1. 在linux centos7上安装git
  2. php中头部含义,PHP 常用的header头部定义汇总大全
  3. html按键变色,按键变色.html
  4. java开发安装程序_创建java开发环境安装包
  5. linux 进程内存分布,linux C++ 的内存分布情况
  6. html没有代码补全 vscode_借助clangd实现VSCode C++代码补全
  7. nacis服务注册原理_HwServiceManager篇Android10.0 HwBinder通信原理(五)
  8. Python案例:输出指定要求的回文日期
  9. Django讲课笔记10:使用QuerySet删除和查询数据表
  10. 《天天数学》连载08:一月八日