在之前的文章中,我们先后介绍了eureka,ribbon,feign,使用eureka集群的方式来保证注册中心的高可用,在eureka中使用ribbon进行负载均衡,使用feign接口替换手动编码请求接口的代码,整个微服务看似基本完成了,那是否有继续值得优化的地方呢?答案肯定是有的,并且是整个微服务最重要的一环,那就是服务的热熔断与降级,那为什么服务熔断与降级是最重要的一环呢?我们先来看一下服务雪崩的概念.

服务雪崩

  所谓服务雪崩,是微服务系统中特有的概念,不了解服务雪崩的概念的童鞋,初一听服务雪崩,肯定会联想到缓存雪崩,所谓缓存雪崩,即大量缓存在同一时间过期,导致大量请求不走缓存而进行数据库访问,数据库瞬时压力暴增,导致数据库宕机.一般我们的解决方案无非有几点:
1.为不同的缓存设置不同的过期时间.
2.热点数据永不过期.
3.缓存预热.
  我们之所以要预防缓存雪崩,从系统架构五个方面(高性能/高可用/伸缩性/扩展性/安全性)来讲,是保证系统的高性能以及保护数据库,而我们说要预防服务雪崩,是为了保证整个微服务系统的可用性,让我们用一张图来说说明:

  假设在一个电商微服务系统中,有用户服务,订单服务,产品服务,物流服务等服务,用户服务调用订单服务,订单服务调用产品服务,产品服务调用物流服务,如果没有考虑服务的熔断与降级,假如在产品服务调用物流服务的时候,物流服务本身出问题了返回了错误或者是网络波动导致请求超时,则产品服务会报错,从而影响订单服务跟着报错,层层返回,直到最顶层的服务,这样就导致了一个微服务自身的问题影响了整个微服务系统级联报错,这就是所谓的服务雪崩,极端情况下,可能导致几个甚至整个微服务系统全部宕机,这对于现代微服务系统来说,是无法忍受的,因此,我们需要进行服务的熔断与降级.
  需要注意的是,服务的熔断与降级是两个概念,一般而言,所谓服务熔断,是对服务提供方而言,当服务提供方无法调用的时候需要被熔断,而降级是对服务消费方而言,当服务提供方无法正常提供服务时,消费方需要降级处理.spring cloud中对服务的熔断和降级是使用hystrix,接下来,让我们详细了解一下hystrix.

服务熔断与降级hystrix

  spring cloud中使用hystrix进行服务的熔断和降级,hystrix翻译成中文是豪猪的意思,它是Netflix开源的一款针对分布式系统进行服务熔断与降级的框架.那么我们如何使用呢?让我们直接用代码来演示一下:
  把之前我们的项目dhp-micro-service-producer复制一份为dhp-micro-service-producer-hystrix:

  将之加入父项目:

  老规矩,三个步骤,首先新增maven依赖:

  然后修改代码:

  其中@HystrixCommand的作用是指定一个熔断方法,当有该注解的方法抛出异常的时候,会调用fallbackMethod指定的方法,该方法需要我们自己根据业务需要来完成.需要注意的是,方法的入参和返回值都必须要和原始方法保持一致.
  修改一下配置文件,注意eureka注册中心的地址和端口号,我这里修改端口号为7301:

  最后修改启动类,增加对hystrix的支持:

  然后启动来访问试一试,注意如果启动报错,看看是否eureka-server未启动,但这并不影响我们的测试,由于我们在producer项目中的product信息是使用代码方式来mock数据库操作:

  总计只有6条数据,因此ID>6均查不出数据,返回product=null,就会触发我们设置的降级方法,因此访问试一试:

  说明我们的服务提供方在服务出现异常时的熔断方法已经成功使用了,但这还不够,在某些情况下,服务的提供方并没有问题,但是可能由于网络原因导致消费方并不能成功调用到提供方的接口,此时服务提供方的任何处理都是毫无意义的,因此我们需要在消费者端进行服务降级.
  由于我们之前使用feign进行接口代理,而feign中已经集成了hystrix,因此我们需要改造consumer端代码:
  首先在feign代理接口中新增fallbackFactory指定降级服务的类:

  然后实现该类,该类需要实现FallbackFactory接口的create方法,返回一个泛型指定的服务,并且实现该指定接口中的所有方法的降级处理:

  然后我们可以验证一下:首先启动eureka-server,然后启动producer,将producer注册到eureka:

  可以看到,我们修改端口号为7301的producer[dhp-micro-service-producer-hystrix]已经成功注册到eureka,然后再启动consumer[dhp-micro-service-consumer-feign],我修改端口号为7005,并且还需要开启feign.hystrix.enabled=true,默认是false:

  启动成功后,访问一下试一试:

  当我们id=1时,可以成功获取结果,再试一试当ID>6时的情况:

  从描述可以看到,这是执行了producer[dhp-micro-service-producer-hystrix]的熔断方法,那我们如何来验证消费者端的降级方法呢?首先需要关闭eureka-server的自我保护功能,并且设置10秒自检一次,剔除无效的服务:

  那么如何算无效呢?这需要服务提供方进行设置,修改producer[dhp-micro-service-producer-hystrix]发送心跳时间以及服务过期时间,以便尽快让eureka-server剔除producer:

  这里我们为了快速让eureka-server剔除producer,设置5秒(默认值为30秒)发送1次心跳,并且告诉eureka-server,假如15秒(默认值为90秒,一般为心跳间隔时间的3倍)内没有发送任何心跳,则eureka-server将producer剔除,此时,eureka-server主动失效检测时间为10秒,则当我们停止producer后最多25秒eureka-server会将producer剔除,此时再访问consumer:

  可以看到,这是执行了我们consumer的降级方法,自此hystrix在服务提供方和消费方的配置都完成了,是不是很简单?接下来,让我们再了解一下hystrix的仪表盘dashboard.

HystrixDashboard

  Dashboard(仪表盘)是hystrix提供的一种用于服务监控的功能,可以利用它对某一个微服务进行监控,让我们来试一试,首先新建一个module[dhp-micro-service-hystrix-dashboard]:

  然后将之加入父项目:

  接下来新增maven依赖:

  然后配置文件修改服务端口号:

  然后启动类新增对dashboard的支持:

  启动起来看一下:

  那么该如何使用呢?首先,需要确保被监控的服务有健康检查的依赖,比如我们对producer[dhp-micro-service-producer-hystrix]进行监控,则需要确保producer的maven配置中有健康检查的相关依赖:

  并且还需要相关的配置:

  然后启动producer,并且在hystrix dashboard中输入对应的producer的地址,则就能监控到所有的对该地址的访问:

  此时再访问该producer的相关接口,就能看到相关统计信息了:

  至于其中每项数据的含义,我相信肯定难不倒各位广大童鞋,毕竟有问题找度娘,大家都知道,有条件就Google,没有任何问题能难倒我们.

Turbine

  细心的同学会发现,之前我们在hystrix-dashboard的首页上看到了这么一行提示:

  翻译一下,就是告诉我们如果是使用turbine的方式,监控地址的格式是turbine-hostname:port/turbine.stream,如果是单一的hystrix-app的方式,地址格式是hystrix-app:port/actuator/hystrix.stream,我们之前就是使用的单一的这种方式,那么turbine又是什么呢?

  我们在上面说到,dashboard只能对某一个微服务进行监控,但实际情况是一个微服务生产系统远远不止一个微服务,我们需要对所有的微服务都进行监控,而dashboard显然无法满足我们的需求,而turbine则可以,因此turbine的作用就是可以对多个微服务同时进行监控.为了方便演示turbine对多个微服务的监控,我们新建一个module[dhp-micro-service-user-hystrix]:

  然后加入父项目:

  然后老规矩,三个步骤,先配置maven依赖:

  然后再配置application.properties:

  相关配置具体的含义就不在多说了,之前的文章已经讲得很详细了,接着修改主类:

  然后进行编码:

  相关代码和producer类似,然后启动eureka-server,再启动user和producer:

  可以看到两个服务都已经注册到eureka了,然后使用dashboard测试一下:

  没有问题,说明可以,接下来,我们使用turbine同时监控producer和user服务,为了便于和之前的dashboard比较,我们新增一个turbine module[dhp-micro-service-turbine-dashboard]:

  将之加入父项目:

  然后老规矩,首先配置maven依赖:

  然后配置application.properties:

  其中最重要的就是需要配置turbine相关信息,app-config标识需要监控的服务,多个用逗号隔开,并且从名字我们可以看出就是eureka中注册的服务的服务名:

  新增主类配置:

  然后先启动eureka-server,再启动user[dhp-micro-service-user-hystrix]和producer[dhp-micro-service-producer-hystrix]两个服务,再启动dashboard[dhp-micro-service-hystrix-dashboard],最后启动turbine[dhp-micro-service-turbine-dashboard],然后访问dashboard[dhp-micro-service-hystrix-dashboard],并监控turbine的地址:

  然后分别请求user和producer:

  然后看一下hystrix-dashboard:

  发现只监控到了userController,但是并没有监控到ProducerController,这是为什么呢?是我们配置不对吗?别着急,我们来看一下控制台的信息:

  提示信息告诉我们,有一个连接被拒绝,因此放弃turbine对其的监控,失败的地址是192.168.1.13:7301,可以看出这是我们的producer服务的地址,另外提示信息中status401,error和message都提示我们,未授权的登录,回忆一下,之前我们的producer项目引入了dhp-micro-service-auth进行安全验证,需要用户名和密码,因此我们找到了原因:登录producer时未授权,导致监控失败,那这该如何解决呢?很遗憾,turbine既能监控所有服务都有密码的情形,也能监控所有服务都没有密码的情形,但是对于有些服务有密码,而有些服务没有密码的情形,turbine就无能为力了,如果实在因为生产需要要适配,我们只能通过修改dhp-micro-service-auth的方式,来让相应的服务取消对/actuator/hystrix.stream与/turbine.stream这两个地址的密码验证:

  此时再重启一下producer,然后再次访问user和producer,再看一下dashboard:

  此时producerController和UserController均成功被turbine监控了.

  回顾一下,在本文我们介绍了spring-cloud断路器hystrix以及对hystrix的单个服务监控hystrix-dashboard以及对多个服务监控的turbine,下一篇文章,我们继续介绍网关zuul,敬请期待!

  本文的github地址

本文由博客一文多发平台 OpenWrite 发布!

Spring-cloud微服务实战【七】:服务熔断与降级hystrix的更多相关文章

  1. Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)

    作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...

  2. Spring Cloud微服务实战阅读笔记(一) 基础知识

    本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识   1:什么是微服务架构     是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...

  3. Spring Cloud 微服务实战笔记

    Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...

  4. spring cloud微服务实战教程/pdf/视频/百度云资源

    资源站:http://www.supan.vip 点击进入直接查找资源: http://www.supan.vip/spring%20cloud微服务实战 <Spring Cloud微服务实战& ...

  5. Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构

    https://blog.csdn.net/w1054993544/article/details/78932614

  6. SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  7. Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer)

    概要 用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了.所以他的重要性不言而喻.本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程. 目录 Go微服务实战 - 从 ...

  8. 【五】服务熔断、降级 —— Hystrix(豪猪)

    分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖,每个依赖关系将在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务 B和微服务 ...

  9. 微服务实战——微服务架构选型SpringCloud / Dubbo / K8S比较(一)

    ## 说在前面 大概是三年前,因一些原因公司原项目最初为单体结构部署,所有业务模块都在一个项目里面,而后随着业务的不断膨胀以及模块之间的耦合,导致后面增加或修改一些简单业务时的成本都会变的极大.新入职 ...

随机推荐

  1. JVM执行引擎

    1.概述 执行引擎是jvm核心组成部分之一,建立在物理器,硬件和操作系统层面之上,引擎在执行代码时会有解释执行和编译执行两种选择,输入字节码文件,字节码解析输出结果. 2.栈帧 栈帧是用于支持虚拟机进 ...

  2. 014 Ceph管理和自定义CRUSHMAP

    一.概念 1.1 Ceph集群写操作流程 client首先访问ceph monitor获取cluster map的一个副本,知晓集群的状态和配置 数据被转化为一个或多个对象,每个对象都具有对象名称和存 ...

  3. Visual Studio 2017 安装心得

    既然VS2017已经发布了,就想安装一下试试,先卸载VS2015, 网上有个完全卸载的东东,https://github.com/Microsoft/VisualStudioUninstaller/r ...

  4. Spring Security入门(基于SSM环境配置)

    一.前期准备 配置SSM环境 二.不使用数据库进行权限控制 配置好SSM环境以后,配置SpringSecurity环境 添加security依赖   <dependency> <gr ...

  5. 推荐中的多任务学习-YouTube视频推荐

    本文将介绍Google发表在RecSys'19 的论文<Recommending What Video to Watch Next: A Multitask Ranking System> ...

  6. 学以致用,react学习前奏准备阶段

    ReactJS:支持React开发,提供JSX代码提示,高亮显示,ReactJS官方介绍 1.cdm→  componentDidMount: fn() { ... }   cdm 2.cdup→  ...

  7. SpringBoot2 整合Nacos组件,环境搭建和入门案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Nacos基础简介 1.概念简介 Nacos 是构建以"服务"为中心的现代应用架构,如微服务范式.云原生范式等服务基础 ...

  8. SpringBoot项目配置Date类型数据自动格式转换

    application.yml加入配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8

  9. Proxmox VE:自建虚拟化方案

    Proxmox VE 简介 Proxmox Virtual Environment,或 Proxmox VE,是来自德国的开源虚拟化方案.软件和社区支持都是免费的,企业用户则可以通过订阅制获得付费商业 ...

  10. 关于neo4j初入门(3)

    这一章主要是函数的部分 UPPER 它需要一个字符串作为输入并转换为大写字母. UPPER (<input-string>)<input-string>可以是来自Neo4J数据 ...