SpringCloud五大神兽03-Hystrix断路器(豪猪)
1.简介
- 雪崩:在微服务架构中,假如某个微服务无法正常运行就会形成阻塞,导致调用这个微服务的其他所有微服务都会阻塞。到达某个时间节点,服务器的并发量会达到峰值,这样的话,后续其他请求即使访问的不是当前被阻塞的微服务也会无法正常访问。这种由于一个微服务异常导致整个微服务架构都无法工作的情况称为雪崩。
- 熔断:监听服务提供者方请求的并发量、访问失败率,只要并发量或者失败率达到一定阈值,服务消费者和提供者之间的请求就会断开,称为熔断。
- 降级:当发生熔断现象时,服务提供者就不会有任何响应,这样对服务消费者来说体验很差,所以退而求其次,给服务消费者返回托底数据而不是没有任何响应,这就叫降级。
- 托底数据:异常发生时,服务提供者给服务消费者返回的异常提示消息,托底数据类型和正常响应返回的数据类型一致。
- Hystrix 断路器:解决雪崩效应的一种自我保护机制,包括四个方面:
- 资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用;
- 熔断:当失败率达到阀值自动触发熔断(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复;
- 降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据;
- 缓存:提供了请求缓存、请求合并实现;
2.使用
① Ribbon集成Hystrix:在服务提供者方使用,需要
- 在服务提供者方添加Hystrix依赖;
- 在Controller的每个接口方法上添加@HystrixCommand注解并指定返回托底数据的方法名;
- 自定义返回托底数据的方法;
- 在启动类上添加@EnableHystrix注解;
② Feign集成Hystrix:由于Feign本身已经集成了Hystrix,所以在服务消费者方使用Hystrix,只需要
- 在yml中配置开启Hystrix支持;
- 在FeignClient中指定返回托底数据的方法名;
- 自定义返回托底数据的方法(需要实现FallbackFactory接口);
2.1.Ribbon集成Hystrix
服务提供者端集成,服务消费者端正常调用
2.1.1.导入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- Hystrix依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
</dependencies>
2.1.2.写启动类
添加@EnableHystrix注解,开启Hystrix支持
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class Provider8082App {public static void main(String[] args) {SpringApplication.run(Provider8082App.class,args);}
}
2.1.3写yml配置
配置端口和服务名称、注册到Eureka注册中心
server:port: 8082eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/instance:instance-id: service-provider-ribbon:8082 #自定义一个服务id名称,否则就默认使用当前计算机名称作为服务的idspring:application:name: SERVICE-PROVIDER-RIBBON #服务名称标识 如果不配置,则默认是UNKNOWN
2.1.4.写Controller
方法上添加@HystrixCommand注解进行资源隔离、fallbackMethod属性指定返回托底数据的方法名、定义返回托底数据的方法
注意:如果有多个方法,每个方法上都需要加@HystrixCommand注解,并定义返回托底数据的方法,该方法的返回值类型需要和正常响应时返回的数据类型一致。
@RestController
public class ProviderController8082 {/*** @HystrixCommand 用HystrixCommand对象包裹该微服务进行隔离* fallbackMethod:定义返回托底数据的方法名* @return*/@HystrixCommand(fallbackMethod = "providerFallback")@GetMapping("/ribbon/provider")public String provider(){System.out.println("provider..............");//自定义异常int i = 1/(new Random().nextInt(3));return "*****8082*****";}/*** 定义返回托底数据的方法* @return*/public String providerFallback(){return "服务器繁忙~~~~";}
}
2.1.5.浏览器访问
当异常发生时,微服务响应的结果是我们自定义的数据
2.2.Feign集成Hystrix
由于Feign是在服务消费者方使用的,并且Feign内部已经集成了Hystrix,所以直接在服务消费者方使用,服务提供者方正常写。
2.2.1.导入依赖
只需要导入Feign即可
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- feign场景启动器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
</dependencies>
2.2.2.写启动类
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class FeignConsumerApp {public static void main(String[] args) {SpringApplication.run(FeignConsumerApp.class,args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
2.2.3.写yml配置
开启熔断支持:feign.hystrix.enabled=true
server:port: 9091eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/instance:instance-id: feign-consumer:9091 #自定义一个服务id名称,否则就默认使用当前计算机名称作为服务的idspring:application:name: FEIGN-CONSUMER #服务名称标识 如果不配置,则默认是UNKNOWNfeign:hystrix:enabled: true #开启熔断支持
2.2.4.写FeignClient和FallBackFactory方法
FeignClient和FallBackFactory方法都单独定义,加上@Component交给Spring管理
FeignClient:
/*** value:服务提供者的名字* fallbackFactory:返回托底数据的方法*/
@FeignClient(value = "SERVICE-PROVIDER",fallbackFactory = ProviderFallbackFactory.class)
@Component
public interface ProviderClient {@GetMapping("/feign/provider")String provider();
}
FallBackFactory方法:
/*** 返回托底数据的方法,必须实现FallbackFactory接口*/
@Component
public class ProviderFallbackFactory implements FallbackFactory<ProviderClient> {/*** 重写create方法,返回值用匿名内部类的方式写,返回异常提示信息* 通过throwable可以取出异常信息* @param throwable* @return*/@Overridepublic ProviderClient create(Throwable throwable) {return new ProviderClient() {@Overridepublic String provider() {return "服务繁忙"+throwable.getMessage();}};}
}
2.2.5.写Controller
注入ProviderClient对象,调方法(类似mapper层接口调用方式)
@RestController
public class FeignConsumerController {@Autowiredprivate ProviderClient providerClient;@GetMapping("/feign/consumer")public String feignConsumer(){System.out.println("feignConsumer.....................");String s = providerClient.provider();return s;}
}
2.2.6.浏览器访问测试
服务提供者端写一个异常,异常提示信息被返回到了浏览器页面显示
3.总结
Hystrix断路器的作用就是自定义方法,在微服务出现异常的时候返回托底数据给服务消费者,而不是没有任何响应,这样的话,整个微服务架构还可以继续运作。
由于Feign内部已经集成了Hystrix,所以一般都使用Feign而不是Ribbon。
SpringCloud五大神兽03-Hystrix断路器(豪猪)相关推荐
- springcloud五大神兽之Eureka介绍
一.springcloud简介 1.0 什么是微服务? ① 业务角度 从业务角度分析,就是将整体项目(传统的一站式应用)按照业务拆分,将每个业务拆分为一个个独立的服务,彻底解除业务模块之间的耦合,每个 ...
- springCloud五大神兽(思维导图)
SpringCloud的五大件 思维导图 服务发现--Netflix Eureka 客服端负载均衡--Netflix Ribbon 断路器--Netflix Hystrix 服务网关--Netflix ...
- SpringCloud中 Feign结合Hystrix断路器开发。
Feign结合Hystrix断路器开发: 转载于:https://www.cnblogs.com/longdb/p/10468371.html
- SpringCloud与微服务Ⅷ --- Hystrix断路器
复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务调用服务B和微服务C,微服务B和微服务C又调用其他服务,这就是 ...
- SpringCloud五大神兽快速入门
Spring Cloud 单一应用架构 :主要解决ORM 数据库访问层. 垂直应用架构 : 解决分层问题,实现应用的分层开发,提升开发效率. 分布式应用架构:解决系统间调用问题,引发了SOA(面向服务 ...
- 【SpringCloud】服务降级 Hystrix 断路器
文章目录 1.概述 1.3 服务雪崩 1.4 Hystrix 1.5 服务降级 1.5.1 哪些情况会出发降级 1.5 服务熔断 1.5 服务限流 2.案例 2.1 案例1 2.1.1 配置 2.1. ...
- SpringCloud五大神兽之Eureka服务注册(三)——Eureka的自我保护
一.ACID与CAP 传统ACID: A:atomicity 原子性 C:consistency 一致性 I:isolation 独立性 D:durability 持久性 目前流 ...
- springcloud五大神兽及其原理
一.使用eureka做注册中心 个人版本的初级springcloud总体结构 一.使用eureka做注册中心 总体说明: 会员和订单都以服务的形式存在(即只有接口,没有页面的那种工程),springc ...
- springcloud五大神兽之Gateway
① 什么是网关? API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层. 网关的出现原因是伴随微服务架构的出现而出现,因为不同的微服务一般有不同的网络地址(ip ...
最新文章
- python 调用sqldr_sqlldr并发
- java如何把文件中的内容存到一个动态数组arraylist中_如何动态地向Java中的数组添加项目?...
- 编程方法学11:Gimage
- Spring集成–从头开始应用程序,第1部分
- android studio gradle 自动更新,android studio gradle 两种更新方法更新
- LVIS挑战赛冠军总结 | 视觉任务中长尾分布问题研究进展与挑战
- 异步消息的传递-回调机制(转)
- kafka-client 版本兼容问题
- 因子分析在SPSS中的应用
- csr蓝牙驱动Linux,csr harmony蓝牙适配器驱动
- 2016款MACBOOK PRO触控条版 安装WIN10初体验 及 无奈退货记
- 机器学习——朴素贝叶斯分类器
- 初谜无钢圈内衣,女性健康的好选择
- n平方的求和公式_1到N的平方和,立方和公式是怎么推导的
- ppt矩形里面的图片怎么放大缩小_如何使用PPT调节图片的大小
- 安卓屏幕坏了怎么把资料拷出来_选择苹果还是安卓呢?(老安卓转苹果11用户体验)...
- 快速了解各种三维数字沙盘
- 对不起!我来晚了!——《Android群英传》出版祭
- 给GitLab项目添加成员用户
- mysql强制杀进程_mysql 杀掉(kill) lock进程脚本
热门文章
- 计算机主机安装图,最新版本:计算机主机插件安装图_布法罗计算机主板安装图...
- win10升级到win11教程
- 如何为谷歌浏览器启用暗模式
- 活体检测-用照片来做人脸识别可行吗?
- 计算机开机慢怎么办,笔记本电脑开机很慢怎么办?五个小妙招来帮忙!
- net core mysql开源框架_.NetCore开源集成框架
- 阿里云ECS学习资源
- sdau启航前端第一次作业
- 算力进化!新华三打造“一体·两中枢”全新智慧计算体系
- win10密码忘了怎么办_笔记本密码忘了怎么办