SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用
唯能极于情,故能极于剑
文:SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用
注:有空看看小编:CodeCow · 程序牛的个人技术博客吧:http://www.codecow.cn/
《 人生路上,你我都是过客,来去皆是缘分 —— 随缘 》
问题:
1、复杂的分布式体系结构中,每个应用程序都有数十个依赖,每个依赖关系在某些时候将不可避免的失败;此时怎么办?
2、当服务之间的调用时,出现网络卡顿、超时、程序出错、甚至机房断电,此时又怎么办 ?
3、直接上图

这可咋办,凉拌,哈哈,不可能,此时迎来了我们的 “豪猪哥 — Hystris ” 带着这两个问题,小编将浅聊 Hystris
一、Hystris
1.1、Hystris 啥玩意 ?
- 官网:Hystris 是一个处理分布式系统的 延迟 和 容错 的开源库,在服务调用中不可避免的会调用失败,比如超时、异常等,Hystris 能够保证在一个服务出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
1.2、Hystris 能干嘛 ?
①、服务降级(fallback)
例如:当服务器超时、程序运行异常、线程池爆满的时候,立即返回一个友好提示如 “服务器忙,请稍后再试”,而不是直接给客服端整个 ERROR
②、服务熔断(break)
例如:当服务器达到最大访问量后,直接拒绝访问(例如家里的 保险丝 ),然后调用服务降级的方法并返回友好提示(过程:服务降级 —> 进而熔断 —> 恢复调用链路 )
③、服务限流(flowlimit)
例如:淘宝、京东秒杀时高并发操作时,严禁一窝蜂的过来拥挤,大家排队,一秒N个,有序进行
。。。。。。
1.3、Hystris 怎么玩 ?
官网:https://github.com/Netflix/Hystrix/wiki/How-To-Use

呵呵,朋友别着急,下面小编带你细品 豪猪哥
二、Hystris 实操
了解 Hystris 了,不来点 硬核 咋行呢,下面小编就结合实际开发和大家聊聊
注意:有服务端和客户端两个模块/项目
2.1、服务端 — 操作
①、首先导包
// 监控
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> // Web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> // 服务注册与发现 Consul
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency> // 熔断器 Hystris
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
②、改 YML 配置文件
server:
port: #端口号 spring:
application:
name: cloud-hystrix-provider-service #服务名
cloud:
consul:
host: localhost #consul的IP
port: #consul启动端口默认8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true #不写这个配置,在docker下的consul里面健康检查会失败
healthCheckInterval: 5s #健康检查频率
port: ${server.port} #注册服务所在端口
③、添加主启动类
/**
* 注意:@SpringCloudApplication 注解可以代替下面三个注解
*/
@SpringBootApplication // springboot 注解
@EnableDiscoveryClient // 作用:能够让Consul注册中心发现,并扫描到该服务
@EnableCircuitBreaker // SpringCloud中使用断路器,需要加上此注解
public class HystrixProviderMain8001 { public static void main(String[] args) {
SpringApplication.run(HystrixProviderMain8001.class, args);
}
}
④、业务逻辑Controller
@Resource
private PaymentService paymentService; //service层调用 @GetMapping("/payment/hystrix/ok/{id}")
public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id) {
log.info(" hystrix 8001 ok "); //使用@Slf4j打印日志
Payment payment = paymentService.getById(id); //getById 是serviceImpl中根据id 获取 payment 实体的方法, 小编在这就不赘述了
if(payment == null){
return new RespResult<>(, "查询为空");
}
return RespResult.success(payment);
} 解释 :Payment 实体就两个字段 id、desc
RespResult {"code":,"message":"成功","data":{"id":,"desc":"我还是从前那个少年"}} 这种格式 经过 小编一顿 SAO 操作, 服务端 还可以吧 ^ _ ^
别急 没完事的 。。。。
2.2、客服端 / 消费端 – 操作
注意:消费端大体和客服端一样,注意细节 O ^ _ ^
①、首先导包
<!--监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <!--Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--服务注册与发现 consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency> <!--服务调用 openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> <!--熔断器 hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
②、改 YML 配置文件
server:
port: #端口号 浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: ”了 spring:
application:
name: cloud-hystrix-consumer-service #服务名
cloud:
consul:
host: localhost #consul的IP
port: #consul启动端口默认8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true #不写这个配置,在docker下的consul里面健康检查会失败
healthCheckInterval: 5s #健康检查频率
port: ${server.port} #注册服务所在端口 feign:
hystrix:
enabled: true #在feign中开启 Hystrix(熔断器)
③、添加主启动类
@SpringBootApplication
@EnableFeignClients // 作用:启用feign客服端
@EnableCircuitBreaker //SpringCloud中使用断路器,需要加上此注解
public class HystrixConsumerMain80 { public static void main(String[] args) {
SpringApplication.run(HystrixConsumerMain80.class, args);
}
}
④、业务逻辑 Service
/**
* 朋友 @FeignClient 此注解还不会用? 别急 小编是老中医 专治不会 哈哈
* 看小编上一讲(地址:https://blog.csdn.net/Msxd_/article/details/105551238
* ==> OpenFeign简介及@FeignClient等注解的使用)
*/
@FeignClient(value = "cloud-hystrix-provider-service", fallback = PaymentFallbackService.class)
public interface PaymentFeignService { @GetMapping("/payment/hystrix/ok/{id}")
RespResult<Payment> getPaymentById(@PathVariable("id") Integer id); //============================================================================================= 特殊说明:上面 @FeignClient 注解中 fallback = PaymentFallbackService.class 是干嘛的 ?
作用:比如客服端 调用服务端时,服务端突然 “挂了”,此时需要一个降级的方法
因为,你不可能让客服端直接 来个 “ERROR” 吧 还不懂: 看上面 ==> 1.2、Hystris 能干嘛 ? PaymentFallbackService 如何写 ???
其实就是实现 这个 接口, 重写里面的方法 ==> 往下看 、降级 Service(Fallback) }
⑤、降级 Service(Fallback)
说明: 没有,哈哈 ^ _ ^ 朋友 上面 哪一步 都说了 @Service
public class PaymentFallbackService implements PaymentFeignService { @Override
public RespResult<Payment> getPaymentById(Integer id) {
return RespResult.error(, " 服务端 getPaymentById 方法调用失败 触发熔断降级 ");
}
}
⑥、业务逻辑 Controller
@Resource
private PaymentFeignService paymentFeignService; //调用第四步中的接口 @GetMapping("/consumer/payment/get/{id}")
public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id){
log.info("我是使用的Feign"); //打印日志
return paymentFeignService.getPaymentById(id); // 调用里面的方法
} 总测试步骤:
、启动服务端
、启动消费端
、地址栏输入url: localhost/consumer/payment/get/ // 为什么不加端口号(回去看 消费端 Yml 配置 有说明)
、结果: 第一次:测试一切正常(客户端和服务端 都正常启动)
结果必然为正常结果 eg:
{
"code": ,
"message": "成功",
"data": {
"id": ,
"desc": "我还是从前那个少年"
}
} 第二次:测试不正常时(假如我们把服务端 停掉了)
结果必然为 Fallback 结果 eg:
{
"code": ,
"message": " 服务端 getPaymentById 方法调用失败 触发熔断降级 ",
"data": null
}
此结果 就是我们在 第五步(降级 Service(Fallback)) 中配置 的 小编一顿 SAO 操作, 还可以吧 ^ _ ^
对 Hystris 实操 总结: 其实就两点:
①、在 消费端 启动类加:@EnableCircuitBreaker 注解
②、在@FeignClient 调用接口的属性里加:fallback = PaymentFallbackService.class 并实现此方法,即可
咋青山不改,绿水长流,不妨看看小编其他作品,很香哟,哈哈,加油 ^ _ ^
三、总结
这是 SpringCloud 的 Hystris 篇,后续小编会从 “ GateWay(网关)、Config(分布式配置中心)…” 等坚持以博客的方式来分享自己对SpringCloud 的理解,并从不同角度和大家分享工作心得,并且含有相关Demo,最终小编会发布到GitHub上,供大家下载、分享、交流、指正,下面是源码地址:
GitHub:https://github.com/msxdlb/Spring-Cloud-2020
有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正 啦
《 人生路上,你我都是过客,来去皆是缘分 》 随缘——但须努力
2020/04/22 早 00:20
SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用的更多相关文章
- Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器
第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...
- Spring Boot入门(四):开发Web Api接口常用注解总结
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...
- springCloud四:熔断器ribbon--Hystrix
注:前文概念部分摘抄自博客园 纯洁的微笑 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩 ...
- SpringCloud微服务简介(一)
Spring Cloud简单认识 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过 ...
- 《springcloud 四》服务保护机制
服务保护机制SpringCloud Hystrix 微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要. 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用 ...
- SpringCloud技术涵盖简介
SpringCloud是微服务架构的集大成者,云计算最佳业务实践. 我们平常使用的Spring和他们的关系,对Spring,springboot , SpringCloud 的 概念区分,上图: Sp ...
- SpringCloud(四) config
Spring Cloud Config 在分布式系统中,尤其是当我们的分布式项目越来越多,每个项目都有自己的配置文件,对配置文件的统一管理就成了一种需要,而 Spring Cloud Config 就 ...
- springcloud(四):熔断器Hystrix
说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基 ...
- SpringCloud四:hystrix-propagation
注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...
随机推荐
- 将不确定变成确定~LINQ DBML模型可以对应多个数据库吗
答案是肯定的,一个DBML模型可以对应多个数据库,只要数据库中的表与模型中定义的表结构完成相同,就可以这个技术,我们可以用来开发一些通用的功能模块,如通过后台管理模块,我们将一些通用表进行抽象,如,对 ...
- 快放弃你的管家软件吧! Part 2 强制删除
在Windows系统中,难免会遇到用常规方法无法删除文件的情况. 经常有遇到过一些情况? 软件卸载了,有些文件夹就是删不掉,提示被占用,mmp,这时候你肯定想到了360文件粉碎机! mmp,我就删个文 ...
- andorid jar/库源码解析之Dagger/Dagger2
目录:andorid jar/库源码解析 Dagger.Dagger2: 作用: 1.用于解耦Activity和业务逻辑 2.在使用业务的时候,不需要重复编写new代码. 3.当业务变化的时候,不需要 ...
- IDEA破解,自动激活【2020年版本也可以破解】
破解 在破解之前,需要下载的文件有两个ideaIU-2019.3.3.exe.jetbrains-agent-latest.zip,前者是程序安装包,后者是破解补丁包(PS:补丁包里面有使用说明,下面 ...
- basicRF双向灯光控制
题目: 实现基于BasicRF无线点对点通信的双向灯光控制,具体要求如下: 1> 节点A 和节点B 的PANID设置为0x1234,通道号设置为17,节点地址自定义.<2> 按下节点 ...
- 201771010113 李婷华 《面向java对象程序设计(Java)》第四章学习总结
一. 理论知识部分 第四章 对象与类 本章主要讲述面向对象程序设计.如何创建标准Java类库中的类对象.如何编写自己的类. 1.面向对象程序设计的几个主要概念: 抽象数据类型.类和对象.封装.类层次( ...
- 玩转FPGA边缘视觉——4k视频图像抓取
随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,最近几年,图像的分辨率和扫描频率都有了较大范围的提升,1080P分辨率的视频已经非常流行,2K甚至4K分辨率的图像也在火热发展中. ...
- Qt源码解析之-从PIMPL机制到d指针
一.PIMPL机制 PIMPL ,即Private Implementation,作用是,实现 私有化,力图使得头文件对改变不透明,以达到解耦的目的 pimpl 用法背后的思想是把客户与所有关于类的私 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
- Mysql常用sql语句(14)- 多表查询
测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...