唯能极于情,故能极于剑

本文转载于http://www.codecow.cn/

此文由四部分组成(Hystris简介、@EnableCircuitBreaker 使用、实操、总结),别着急,慢慢来

文章目录

  • 一、Hystris
    • 1.1、Hystris 啥玩意 ?
    • 1.2、Hystris 能干嘛 ?
    • 1.3、Hystris 怎么玩 ?
  • 二、Hystris 实操
    • 2.1、服务端 — 操作
    • 2.2、客服端 / 消费端 -- 操作
  • 三、总结

问题:
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: 8888 #端口号spring:application:name: cloud-hystrix-provider-service  #服务名cloud:consul:host: localhost      #consul的IPport: 8500           #consul启动端口默认8500discovery: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

@Resourceprivate 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<>(444, "查询为空");}return RespResult.success(payment);}解释 :Payment 实体就两个字段 id、descRespResult  {"code":200,"message":"成功","data":{"id":1,"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 #端口号  浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“: 80”了spring:application:name: cloud-hystrix-consumer-service  #服务名cloud:consul:host: localhost      #consul的IPport: 8500           #consul启动端口默认8500discovery: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 如何写 ???其实就是实现  这个 接口, 重写里面的方法  ==> 往下看  5、降级 Service(Fallback)}

⑤、降级 Service(Fallback)

说明: 没有,哈哈 ^ _ ^ 朋友 上面 哪一步 都说了 @Service
public class PaymentFallbackService implements PaymentFeignService {@Overridepublic RespResult<Payment> getPaymentById(Integer id) {return RespResult.error(500, " 服务端 getPaymentById 方法调用失败  触发熔断降级  ");}
}

⑥、业务逻辑 Controller

@Resourceprivate PaymentFeignService paymentFeignService; //调用第四步中的接口@GetMapping("/consumer/payment/get/{id}")public RespResult<Payment> getPaymentById(@PathVariable("id") Integer id){log.info("我是使用的Feign");   //打印日志return  paymentFeignService.getPaymentById(id);  // 调用里面的方法}总测试步骤:1、启动服务端2、启动消费端3、地址栏输入url: localhost/consumer/payment/get/1  // 为什么不加端口号(回去看 消费端 Yml 配置  有说明)4、结果:第一次:测试一切正常(客户端和服务端 都正常启动)结果必然为正常结果 eg:{"code": 200,"message": "成功","data": {"id": 1,"desc": "我还是从前那个少年"}}第二次:测试不正常时(假如我们把服务端 停掉了)结果必然为 Fallback 结果 eg:  {"code": 500,"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/21 晚 23:39

SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用相关推荐

  1. SpringCloud微服务简介(一)

    SpringCloud微服务简介(一) Spring Cloud简单认识 微服务英文名称Microservice,Microservice架构模式就是将整个Web应用组织为一系列小的Web服务.这些小 ...

  2. @HystrixCommand 注解的作用与注意事项

    一.说明 @HystrixCommand 注解 能对某个一个接口定制 Hystrix的超时时间. 通过修改 execution.isolation.thread.timeoutInMillisecon ...

  3. Hystrix服务降级的两种处理方式@HystrixCommand注解和定义统一fallback接口

    项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw  提取码:3j4a 问题答疑: Hystrix服务保护框架,在微服务中Hystrix能 ...

  4. springcloud(四):熔断器Hystrix

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

  5. C# 基础知识 (四).C#简介及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了很多东西,也学到了很多东西,也认识到了很多不足之处!闲暇之余我准备重新进一步巩固C#相关知识,包括C#入门 ...

  6. springcloud hystrix入门简介(二)

    Hystrix设计原则 1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败.通过第三方客户端访问(通常是通过网络)依赖服务出现失败.拒绝.超时或 ...

  7. 睡眠音频分割及识别问题(四)--YAMNet简介

    简介 YAMNet模型是在 AudioSet 数据集(一个大型音频.视频数据集)上训练的音频事件分类器. 模型输入 该模型接收包含任意长度波形的float32一维张量或 NumPy数组,且满足范围[- ...

  8. 微服务SpringCloud之Feign简介及使用

    Feign的目标 feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service.Spring Cloud集成了Ribbon和Eurek ...

  9. shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

    一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...

最新文章

  1. Java常用消息队列原理介绍及性能对比
  2. SpringMVC源码之参数解析绑定原理
  3. python怎么读出当前时间_Python读取Excel,日期列读出来是数字的处理
  4. 5 Handler与子线程
  5. 基于matlab/simulink的双电机速度跟踪伺服系统仿真,基于MatlabSimulink的伺服系统仿真pdf.doc...
  6. graphql-yoga的安装步骤
  7. 【转】sqlserver游标概念与实例全面解说
  8. Java属性中指定Json的属性名称(序列化和反序列化)
  9. 运行指定代码_JavaScript 运行机制(Event Loop)详解
  10. 【Qt开发经验】Qt信号槽连接不成功问题原因汇总
  11. linux 查看 CPU 使用率
  12. 如何打通“鱼塘” ?腾讯启动“SaaS技术联盟” 共建技术中台
  13. 中心对称数 java_【LeetCode(Java) - 246】中心对称数
  14. 修改RHEL6的root超级用户密码
  15. iis php 知乎,设置 | WeCenter创建你的知乎
  16. 星巴克中国虎年新春限定产品上市
  17. 五步移相法matlab程序_用MATLAB软件对逆变电路移相调压进行仿真,30°,60°,90°的波形,并用分段分析法分析其原理_学小易找答案...
  18. springboot将文件响应给前端
  19. 家庭用药助手:丁香园推出面向大众家庭用户的药品信息服务工具
  20. 深度学习--深度信念网络(Deep Belief Network)

热门文章

  1. 《金融科技发展规划(2022-2025)年》,明确行业目标
  2. 基于asp.net的服装销售管理系统
  3. 三星手机能支持鸿蒙系统吗,如果三大运营商的定制机都要求鸿蒙系统,苹果三星会安装使用吗?...
  4. 2021年度中关村硬科技孵化器支持资金申报,奖励高达1000万
  5. 数据结构经典面试题-图
  6. 证件照如何换底色,分享三种证件照换底色的方法!
  7. 大疆无人机视频恢复成功
  8. 《编译原理》名词术语解释整理
  9. 数学实验报告1:t检验、方差分析
  10. python-读取excel文件