唯能极于情,故能极于剑

文: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 注解的使用的更多相关文章

  1. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器

    第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...

  2. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  3. springCloud四:熔断器ribbon--Hystrix

    注:前文概念部分摘抄自博客园  纯洁的微笑 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩 ...

  4. SpringCloud微服务简介(一)

    Spring Cloud简单认识 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小的Web服务可以独立地编译及部署,并通过 ...

  5. 《springcloud 四》服务保护机制

    服务保护机制SpringCloud Hystrix 微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要. 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用 ...

  6. SpringCloud技术涵盖简介

    SpringCloud是微服务架构的集大成者,云计算最佳业务实践. 我们平常使用的Spring和他们的关系,对Spring,springboot , SpringCloud 的 概念区分,上图: Sp ...

  7. SpringCloud(四) config

    Spring Cloud Config 在分布式系统中,尤其是当我们的分布式项目越来越多,每个项目都有自己的配置文件,对配置文件的统一管理就成了一种需要,而 Spring Cloud Config 就 ...

  8. springcloud(四):熔断器Hystrix

    说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基 ...

  9. SpringCloud四:hystrix-propagation

    注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...

随机推荐

  1. 将不确定变成确定~LINQ DBML模型可以对应多个数据库吗

    答案是肯定的,一个DBML模型可以对应多个数据库,只要数据库中的表与模型中定义的表结构完成相同,就可以这个技术,我们可以用来开发一些通用的功能模块,如通过后台管理模块,我们将一些通用表进行抽象,如,对 ...

  2. 快放弃你的管家软件吧! Part 2 强制删除

    在Windows系统中,难免会遇到用常规方法无法删除文件的情况. 经常有遇到过一些情况? 软件卸载了,有些文件夹就是删不掉,提示被占用,mmp,这时候你肯定想到了360文件粉碎机! mmp,我就删个文 ...

  3. andorid jar/库源码解析之Dagger/Dagger2

    目录:andorid jar/库源码解析 Dagger.Dagger2: 作用: 1.用于解耦Activity和业务逻辑 2.在使用业务的时候,不需要重复编写new代码. 3.当业务变化的时候,不需要 ...

  4. IDEA破解,自动激活【2020年版本也可以破解】

    破解 在破解之前,需要下载的文件有两个ideaIU-2019.3.3.exe.jetbrains-agent-latest.zip,前者是程序安装包,后者是破解补丁包(PS:补丁包里面有使用说明,下面 ...

  5. basicRF双向灯光控制

    题目: 实现基于BasicRF无线点对点通信的双向灯光控制,具体要求如下: 1> 节点A 和节点B 的PANID设置为0x1234,通道号设置为17,节点地址自定义.<2> 按下节点 ...

  6. 201771010113 李婷华 《面向java对象程序设计(Java)》第四章学习总结

    一. 理论知识部分 第四章 对象与类 本章主要讲述面向对象程序设计.如何创建标准Java类库中的类对象.如何编写自己的类. 1.面向对象程序设计的几个主要概念: 抽象数据类型.类和对象.封装.类层次( ...

  7. 玩转FPGA边缘视觉——4k视频图像抓取

    随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,最近几年,图像的分辨率和扫描频率都有了较大范围的提升,1080P分辨率的视频已经非常流行,2K甚至4K分辨率的图像也在火热发展中. ...

  8. Qt源码解析之-从PIMPL机制到d指针

    一.PIMPL机制 PIMPL ,即Private Implementation,作用是,实现 私有化,力图使得头文件对改变不透明,以达到解耦的目的 pimpl 用法背后的思想是把客户与所有关于类的私 ...

  9. Linux dts 设备树详解(二) 动手编写设备树dts

    Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...

  10. Mysql常用sql语句(14)- 多表查询

    测试必备的Mysql常用sql语句,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1683347.html 前言 ...