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

分布式系统面临的问题

复杂分布式体系结构中的应用程序有数十个依赖,每个依赖关系将在某些时候将不可避免地失败。

9a6de6b3408d4a72f98de8b163d06810.png

服务雪崩

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务 B和微服务C又调用其它的微服务,这就是所谓的"扇出 "。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引发系统崩溃,所谓的"雪崩效应"。

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

Hystrix

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等

Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

断路器

"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者拋出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

服务熔断

一般是某个服务故障或异常引起,类似现实世界中的“保险丝”,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。

熔断机制

服务熔断熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服匆阵可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud 框架里熔断机制通过Hystrix 实现.Hystrix会监控微服务间调用的状况,当失败的调用到一定闽值,缺省是 5 秒内 20 次调用失败就会启动熔断机制。熔断机制的注解是 @ HystrixCommand。

2687411e53653bc4d9db12d14e534a18.png

参照microservicecloud-provider-dept-8001项目  创建microservicecloud-provider-hystrix-8001项目

1.pom.xml

4.0.0

com.everjiankang.springcloud

microservicecloud

0.0.1-SNAPSHOT

microservicecloud-provider-hystrix-8001

com.everjiankang.springcloud

microservicecloud-api

${project.version}

org.springframework.boot

spring-boot-starter-actuator

org.springframework.cloud

spring-cloud-starter-eureka

org.springframework.cloud

spring-cloud-starter-config

junit

junit

mysql

mysql-connector-java

com.alibaba

druid

ch.qos.logback

logback-core

org.mybatis.spring.boot

mybatis-spring-boot-starter

org.springframework.boot

spring-boot-starter-jetty

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

org.springframework

springloaded

org.springframework.boot

spring-boot-devtools

org.springframework.cloud

spring-cloud-starter-hystrix

2.application.yml

server:

port: 8001

mybatis:config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径

type-aliases-package:com.everjiankang.springcloud.entity # 所有Entity别名类所在包

mapper-locations:-classpath:mybatis/mapper/**/*.xml # mapper映射文件spring:

application:

name:microservicecloud-dept # 微服务整合的命名 ,对外暴露的名字,非常重要datasource:

type:com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型

driver-class-name:org.gjt.mm.mysql.Driver # mysql驱动包url: jdbc:mysql://localhost:3306/springcloud # 数据库名称

username:rootpassword:xiaochaodbcp2:min-idle: 5# 数据库连接池的最小维持连接数

initial-size: 5# 初始化连接数

max-total: 5# 最大连接数

max-wait-millis: 200# 等待连接获取的最大超时时间eureka:

client:#客户端注册进eureka服务列表内

service-url:

defaultZone: http://localhost:7001/eureka

instance:instance-id:microservicecloud-dept8001-hystrix

prefer-ip-address:true #访问路径可以显示IP地址info:app.name: everjiankang-microservicecloud

company.name: www.guchunchao.com

project.artifactId: $project.artifactId$

project.version: $project.version$

3.java Controller类

importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.RestController;importcom.atguigu.springcloud.entities.Dept;importcom.atguigu.springcloud.service.DeptService;importcom.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@RestControllerpublic classDeptController

{

@Autowiredprivate DeptService service = null;

@RequestMapping(value= "/dept/get/{id}", method =RequestMethod.GET)//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法

@HystrixCommand(fallbackMethod = "processHystrix_Get")public Dept get(@PathVariable("id") Long id)

{

Dept dept= this.service.get(id);if (null ==dept) {throw new RuntimeException("该ID:" + id + "没有没有对应的信息");

}returndept;

}public Dept processHystrix_Get(@PathVariable("id") Long id)

{return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")

.setDb_source("no this database in MySQL");

}

4.启动类添加注解:@EnableCircuitBreaker

@SpringBootApplication

@EnableEurekaClient//本服务启动后会自动注册进eureka服务中

@EnableDiscoveryClient //服务发现

@EnableCircuitBreaker//对hystrixR熔断机制的支持

public classDeptProvider8001_Hystrix_App

{public static voidmain(String[] args)

{

SpringApplication.run(DeptProvider8001_Hystrix_App.class, args);

}

}

5.service接口

packagecom.everjiankang.springcloud.service;importjava.util.List;importcom.everjiankang.springcloud.entity.Dept;public interfaceDeptService

{public booleanadd(Dept dept);publicDept get(Long id);public Listlist();

}

6.service实现类

packagecom.everjiankang.springcloud.service.impl;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importcom.everjiankang.springcloud.dao.DeptDao;importcom.everjiankang.springcloud.entity.Dept;importcom.everjiankang.springcloud.service.DeptService;

@Servicepublic class DeptServiceImpl implementsDeptService

{

@AutowiredprivateDeptDao dao;

@Overridepublic booleanadd(Dept dept)

{returndao.addDept(dept);

}

@OverridepublicDept get(Long id)

{returndao.findById(id);

}

@Overridepublic Listlist()

{returndao.findAll();

}

}

7.dao

packagecom.everjiankang.springcloud.dao;importjava.util.List;importorg.apache.ibatis.annotations.Mapper;importcom.everjiankang.springcloud.entity.Dept;

@Mapperpublic interfaceDeptDao

{public booleanaddDept(Dept dept);publicDept findById(Long id);public ListfindAll();

}

resources/mybatis/mapper/DeptMapper.xml

/p>

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select deptno,dname,db_source from dept where deptno=#{deptno};

select deptno,dname,db_source from dept;

INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());

resources/mybatis/mybatis.cfg.xml

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

若是每个服务提供的方法上都搞一个@HystrixCommand(fallbackMethod = "processHystrix_Get")以及相应的处理方法,那么类方法就会急剧膨胀,注解也会很多很繁琐。这样不好。以上是在服务端设置Hystrix的注解,现在为了避免啰嗦的问题,解决方法如下:(转移到客户端解决)

服务降级

整体资源快不够了,忍痛先将某些服务关掉,待度过难关,再开启回来。

30d43965e25f39a884e99e9f95f00914.png

//针对接口配置相应的处理类集中统一处理,而不再向上面那样麻烦。

/***

* @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口

新建

一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory

*@authorzzyy

* @date 2018年4月21日*/

//@FeignClient(value = "MICROSERVICECLOUD-DEPT")

@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)public interfaceDeptClientService

{

@RequestMapping(value= "/dept/get/{id}", method =RequestMethod.GET)public Dept get(@PathVariable("id") longid);

@RequestMapping(value= "/dept/list", method =RequestMethod.GET)public Listlist();

@RequestMapping(value= "/dept/add", method =RequestMethod.POST)public booleanadd(Dept dept);

}

处理方法都集中到一个统一的类中

@Component //不要忘记添加,不要忘记添加

public class DeptClientServiceFallbackFactory implements FallbackFactory{

@OverridepublicDeptClientService create(Throwable throwable)

{return newDeptClientService() {

@Overridepublic Dept get(longid)

{return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")

.setDb_source("no this database in MySQL");

}

@Overridepublic Listlist()

{return null;

}

@Overridepublic booleanadd(Dept dept)

{return false;

}

};

}

}

microservicecloud-consumer-dept-feign项目配置文件

server:

port: 80

feign:

hystrix:

enabled:trueeureka:

client:register-with-eureka:false

service-url:

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

0edd3aa282a9e2198c7a2f41eaa43de2.png

此时服务端provider已经down了,但我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息,而不会挂起耗死服务器。

【服务熔断】

一般是某个服务故障或异常引起,类似现实世界中的“保险丝”,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。

【服务降级】

所谓降级,一般是从整体符合考虑。就是当某个服务熔断之后,服务器将不再调用。

此时客户端可以准备一个本地的fallback回调,返回一个缺省值。

这样做,虽然服务水平下降,但是好歹可用,比直接挂掉强。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
购买提醒:全程代码实战,本系列课程建议有Java开发经验2年以上的学员观看和购买。录制本套教程的初衷,通过从业10年接触过很多的技术开发人员,尤其在面试一些技术人员的时候,发现他们的技术知识更新较慢,很多人渴望接触到高并发系统和一些高级技术架构,为了帮助更多人能够提升自己和接触到这类技术架构,并满足企业的人才需求,利用业余时间我开始录制这套教程。通过录制教程有很多学员给我反馈信息,给了我很大的鼓舞,当然也有吐槽,我想说的是技术是没有边界的,脱离一线业务场景去谈技术,都是耍流氓的。如对我录制的教程内容有建议请及时交流。本套课程历经1年时间研发,案例来源于真实业务场景抽离,由从业10年企业一线架构师实录,没有基础不建议购买。购买后提供企业级多方位指导,通过本套案例可以让你学习目前主流的微服务技术架构和多种企业级高并发和海量数据、高可用、分布式、支付、多语言、前后端分离等技术的综合应用解决方案。在开始本课程前给大家科普几个概念: 高并发是指在比较短的时间内有大量的访问者访问目标系统,系统负载饱和或者过载宕机。 高并发的应用,我们应该都有用过或者见过,比如天猫、京东、拼多多、亚马逊的秒杀抢购还有12306的抢票。我们在体验应用的时候,可能并不会像到这种高并发系统背后的技术实现难度。高并发系统都存在这几种问题,高并发读、高并发写、访问高峰突发性、反馈结果的即时性。在抢购的时候,尤其是抢购火车票的时候,我们经常会疯狂的刷库存,几亿用户产生非常大的高并发读; 通过以上的科普相信大家对课程有一个基本的认知了,本套教程以应用最为广泛的电商系统为标本,给大家构建一个亿级微服务秒杀系统,让大家跟着我的步骤能学习行为背后的原理。本课程采用全新的微服务架构,运用了很多工业界企业解决方案和高级技术,带大家手把手实现一个高性能,高并发,高可用等的亿级微服务秒杀系统,本课程会包含很多高级的内容,比如微服务架构、分布式部署方案、多线程、支付、多语言、全链路性能压力测试等,让大家在实战中学习知识,在实战中不断进步。该课程是一个完整的微服务架构秒杀系统项目代码,案例具有很高的商业价值,大家可以根据自己的业务进行修改,便可以使用。本套课程可以满足世面上绝大多数企业级的业务场景,本课程全部代码可以直接部署企业,普通集群,支撑**并发;集群规模大,支撑亿级并发。本课程包含的技术: IDEA集成开发工具 SpringBoot2.0.2.RELEASE SpringCloudFinchley.RELEASE Thymeleaf(模板引擎技术) 微信支付 支付宝支付 银联支付 分布式数据库Mycat MySQL Druid RabbitMQ 分布式事务 分布式锁 事件驱动 多线程 MyBatis QuartzEhcache Redis Hystrix 单点登陆CAS Nginx Lua Restful AOP技术 性能压力测试Jemter VUE+jQuery+Ajax+NodeJS Python Go语言课程亮点: 1.与企业无缝对接、真实工业界产品 2.主流支付全覆盖(微信、支付宝、银联) 3.前后端分离(主流技术架构) 4.实现高并发请求和实现高可用架构解决方案 5.多语言(Java、Go、Python) 6.亿级微服务秒杀系统(支撑海量数据) 7.大型系统分布式部署方案 8.全链路性能压力测试  9.分布式事务解决方案 10.事件驱动设计解决方案 11.多线程技术的实战应用 12.高并发下的服务降级、限流实战 13.分布式架构师下实现分布式定时调度 14.集成MyBatis实现多数据源路由实战 15.集成Redis缓存实战 16.Eureka注册中心 17.OpenFeign声明式服务调用 18.Hystrix服务熔断降级方式 19.基于Hystrix实现接口降级实战 20.集成SpringCloud实现统一整合方案 21.全程代码实操,提供全部代码和资料 22.提供答疑和提供企业技术方案咨询购买提醒: 我本人在企业从业10年,因为热爱,所以坚持,下一个10年依然会在企业一线服务,因此对于课程中的技术点可以提供全方面的业务场景解决方案。我本人并非培训机构脱离一线业务场景的讲师,从业多年接触过大量的真实业务场景案例,后面会逐步通过教程案例分享我多年的实战经验,送给同行一句话:技术是服务于业务的,脱离一线业务场景就是耍流氓。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值