​熔断降级

微服务架构中,一般把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,为了保证高可用,每个微服务都可能会部署集群。

即便如此,也无法保证100%可用。如遇程序问题、网络问题、不可抗拒因素等造成的服务不可用,调用此服务就会发生堵塞。

此时再加上外部高并发带来的大量请求,由于服务与服务之间的互相依赖,一瞬间就能引起整个微服务系统的瘫痪,也称之为“雪崩”效应。

为了解决此问题,“断路器”应运而生。

服务熔断

服务熔断类似于电路中的保险装置,当电路负荷过大,会自动烧毁,以保护整个电路安全。服务熔断也是一样的道理,当服务出现不可用或响应超时的情况时,为防止整个系统出现雪崩,会暂停会当前服务的调用。

服务降级

服务降级会针对服务状态及整个系统的负荷情况作出考量,如服务不可用,或者对某些服务负荷会比较高,为了预防某些业务场景出现不可用、负荷过载、响应过慢的情况,在内部暂时舍弃一些非核心请求,直接返回一个预先设置好的fallback默认结果。

如此一来,虽然有损且舍弃了部分用户体验,但毕竟最终保证了整个系统的稳定性和可用性。

简介

Netflix has created a library called Hystrix that implements the circuit breaker pattern. In a microservice architecture it is common to have multiple layers of service calls.

Hystrix实现并开源了断路器组件Hystrix,而Spring Cloud针对Netflix开源的Hystrix组件,封装了基于Spring Cloud的断路器组件。

在微服务架构中,通常有多个服务调用层。

​​

较低级别的服务中出现的服务故障可能会导致连锁故障,当对特定服务的调用达到某个阈值时(Hystrix中默认在5秒钟内出现20次故障),断路器将会打开且不会再对此服务进行调用。

断路器打开后,可避免连锁故障,fallback方法可以直接返回特定值。

准备工作

本文基于之前服务消费者(rest+ribbon)、服务消费者(feign)文章工程,启动xmall-product工程,端口为8080。

添加断路器

分别在xmall-product-clients-ribbon、xmall-product-clients-feign工程pom文件中添加hystrix依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

​​ribbon方式

基于xmall-product-clients-ribbon进行断路器相关改造。

开启hystrix

程序启动类XmallProductClientsRibbonApplication中添加@EnableHystrix注解开启hystrix。

package com.luas.xmall.product.clients;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
​
@EnableHystrix
@SpringBootApplication
public class XmallProductClientsRibbonApplication {​public static void main(String[] args) {SpringApplication.run(XmallProductClientsRibbonApplication.class, args);}
​@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
​
}

改造SkuService

添加fallback方法,在方法上添加@HystrixCommand开启熔断功能,并声明fallback方法。fallback方法在服务不可用时,返回默认商品信息。

package com.luas.xmall.product.clients.clients;
​
import cn.hutool.core.map.MapUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
​
@Component
public class SkuService {​@Autowiredprivate RestTemplate restTemplate;
​@HystrixCommand(fallbackMethod = "infoFallback")public Object info(String skuId) {return this.restTemplate.getForObject("http://xmall-product/sku/{skuId}", Object.class, skuId);}
​private Object infoFallback(String skuId) {return MapUtil.builder().put("skuId", "0000000").put("name", "未知").put("price", "99999").put("port", "未知").build();}
​
}

验证

正常访问http://localhost:8082/sku/1122,返回商品1122的信息。

​​

停止xmall-product服务,再次访问http://localhost:8082/sku/1122,返回默认商品信息。

此时说明,当xmall-product不可用时,通过ribbon调用此服务会执行降级策略,快速失败并返回预先设置好的默认信息,而不是等待服务调用超时,导致调用堵塞。​​

feign方式

基于xmall-product-clients-feign进行断路器相关改造。

开启hystrix

feign自带熔断器功能,Spring Cloud在D版本之后,默认关闭feign的熔断功能,需要手工打开。

feign:hystrix:enabled: true

改造SkuService

添加SkuFallbackService,在xmall-product服务不可用时,返回默认商品信息。

@Component
public class SkuFallbackService implements SkuService {​@Overridepublic Object info(String skuId) {return MapUtil.builder().put("skuId", "0000000").put("name", "未知").put("price", "99999").put("port", "未知").build();}
}

在@FeignClient注解中声明fallback类。

@FeignClient(name = "xmall-product", fallback = SkuFallbackService.class)
public interface SkuService {​@RequestMapping(value = "/sku/{skuId}", method = RequestMethod.GET)Object info(@PathVariable("skuId") String skuId);
​
}

验证

正常访问http://localhost:8083/sku/1122,返回商品1122的信息。

​​

停止xmall-product服务,再次访问http://localhost:8083/sku/1122,返回默认商品信息。

​​

同ribbon方式,当xmall-product不可用时,通过feign调用此服务会执行降级策略,快速失败并返回预先设置好的默认信息,而不是等待服务调用超时,导致调用堵塞。

源码

github

https://github.com/liuminglei/SpringCloudLearning/tree/master/06/

gitee

https://gitee.com/xbd521/SpringCloudLearning/tree/master/06/

正文完!

本文系【银河架构师】原创,如需转载请在文章明显处注明作者及出处。

微信搜索【银河架构师】,发现更多精彩。

​​

feign整合hystrix开启hystrix后启动报错_Spring Cloud进阶之路 | 六:断路器(hystrix)...相关推荐

  1. linux安装tomcat后启动报错Cannot find ./catalina.sh的解决方法

    linux安装tomcat后启动报错: Cannot find ./catalina.sh The file is absent or does not have execute permission ...

  2. [HAProxy] CentOS7安装HAProxy1.8.17后启动报错“cannot bind UNIX socket [/var/lib/haproxy/stats]”解决

    问题: CentOS7.3安装HAProxy1.8.17后启动报错,日志 [root@ldap1 run]# systemctl start haproxy Job for haproxy.servi ...

  3. 下载公司 svn 项目后启动报错之 uniapp no such file or direc

    下载公司 svn 项目后安装依赖报错之 uniapp no such file or direc 近期公司开展微信小程序业务,需要用到uniapp开发,当从svn把主包下载下来后发现安装依赖报错,un ...

  4. oracle在服务器断电重启后启动报错ORA-00600: internal error code, arguments: [kcm_headroom_warn_1], []

    一.错误场景介绍. 数据库:11.2.0.4(单实例,没有任何备份) 系统:Centos 6.5(虚拟机) 由于机房断电导致oracle数据库(单实例)所在服务器的虚拟服务器出现问题,在经过恢复后虚拟 ...

  5. windows安装docker后启动报错无法下载镜像文件Error with pre-create check: “Get https://github-production-release-ass

    windows 安装docker后启动保错无法下载镜像文件Error with pre-create check: "Get https://github-production-releas ...

  6. linux 启动nacos报错_Spring Cloud:Alibaba 之 Nacos

    上个月最后一天的凌晨,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 maven 中央库发布了第一个版本. 目前 Spring Cloud Aliba ...

  7. 安装完MySQL后启动报错_MySQL数据库之mysql编译安装完成后,启动时报错The server quit without updating PID file...

    本文主要向大家介绍了MySQL数据库之mysql编译安装完成后,启动时报错The server quit without updating PID file ,通过具体的内容向大家展现,希望对大家学习 ...

  8. tomcat一次升级后启动报错的解决,IllegalArgumentException: AJP连接器配置secretRequired=“true“

    tamcat升级到8.5.82 启动服务报错信息: java.lang.IllegalArgumentException: AJP连接器配置secretRequired="true" ...

  9. KVM+OVS环境虚机修改网卡为ovs网桥后启动报错

    问题环境: 本地新搭建了kvm+ovs网桥的测试环境,linux系统用的是centos7.9,测试虚机启动默认使用的网桥是linux bridge,brctl show能看到虚机起的网桥. 问题描述: ...

最新文章

  1. 多模态大模型——通用人工智能路径的探索
  2. Android开发环境搭建与起步--太详细了,一步一步图文教你
  3. 学习笔记(1)centos7 下安装nginx
  4. Android UI开发第三十篇——使用Fragment构建灵活的桌面
  5. matlab画二维颜色深浅,MATLAB scatter 画二维/三维散点图时 用颜色表示数值大小 colorbar
  6. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案
  7. python手机话费_查询话费订单详情示例代码
  8. android自定义圆圈动画,自定义view实现动画数字圆圈
  9. Ros学习——roslaunch
  10. shiro中ini配置文件
  11. 【高校联合主办| SCI、EI 快检索】物联网,机器学习,网络安全,通信技术,算法,微芯片等计算机多主题征稿!...
  12. BeatSaber节奏光剑双手柄MR教程
  13. 软件工程——NS图,PAD图
  14. 鹿鼎记 · 韦小宝,丽春院、天地会、入皇宫等五个场景的恶搞版多线程锁学习!
  15. 从零实现HarmonyOS(鸿蒙)运动手表两个游戏的合并
  16. Ubuntu 20.04.2.0 LTS 下Geany 1.36的“编译文件”和“生成当前文件”两个按键不可用
  17. windows10下模拟器运行LVGL记录
  18. 使用vagrant搭建三台虚拟机环境
  19. 至强服务器性能视频,至强E5 V4性能表现测试
  20. 你不必去一个遥远的星系去寻找这些奇怪的世界

热门文章

  1. 编写通用计算机代码,计算机源代码编写规范(VB版本).doc
  2. unity怎么在文本中修改字体_[专栏作家]UGUI中CustomFont字体使用与制作
  3. linux进行硬盘分区挂载-了解系统,最更好的开发
  4. SSM-水果商城-pom.xml-学习-3
  5. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack
  6. 【李宏毅2020 ML/DL】P62-65 More about Auto-encoder
  7. 威学一百_涨价通知丨威学一百VIP全年畅学卡价格即将上调!
  8. minhash算法 java_minhash算法
  9. 技术人创业建站简略指南(第一季)
  10. java面试题 接口和抽象类的区别是什么