1.背景

在微服务架构中,服务间根据业务拆分成多个,并且服务之间相互调用。
为了保证高可用,服务通常会集群部署,但是由于网络或自身原因,服务并不能保证100%可用。若某个服务出现问题,调用就会出现阻塞。若Servlet容器线程资源会被消耗完毕,会导致服务瘫痪。

为了解决以上问题引入了断路器(Hystrix),hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。起到了微服务的保护机制,防止某个单元出现故障.从而引起依赖关系引发故障的蔓延,最终导致整个系统的瘫痪。

简言之断路器(Hystrix)主要作用是,当服务不可用时,不是报错,而是返回自定义的默认值,SpringCloud调用服务有两种方式分别是Ribbon与Feign,本文主将介绍,两种调用方式下如何实现断路器(Hystrix)

2.Ribbon

2.1添加依赖

在server-consum-ribbon 项目添加依赖 spring-cloud-starter-netflix-hystrix

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

2.2启动类开启开关

在程序的启动类 加 @EnableHystrix 注解开启Hystrix

/*** Ribbon 方式 服务消费者-实例** @author 程序员小强*/
@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class RibbonApplication {public static void main(String[] args) {SpringApplication.run(RibbonApplication.class, args);}/*** 初始化 Rest模板 bean** @LoadBalanced 注解表明这个restRemplate开启负载均衡的功能*/@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}}

2.3定义断路方法

在HelloServiceApi 示例hello方法中添加一个断路后执行的方法。 hystrixError并通过,注解@HystrixCommand(fallbackMethod = “hystrixError”)指定方法名。

@Service
public class HelloServiceApi {@Autowiredprivate RestTemplate restTemplate;@HystrixCommand(fallbackMethod = "hystrixError")public Map<String, Object> hello(String consumerApplicationName) {return restTemplate.getForObject("http://server-provider/hello?consumerApplicationName=" + consumerApplicationName, Map.class);}public Map<String, Object> hystrixError(String consumerApplicationName) {Map<String, Object> resultMap = new LinkedHashMap<>();resultMap.put("code", 500);resultMap.put("messages", "网络繁忙,请稍后再试");resultMap.put("consumerApplicationName", consumerApplicationName);return resultMap;}
}

2.4断路测试

现有注册中心中,有server-consum-ribbon服务调用server-provider服务


当服务正常时访问结果

当停止生产者server-provider服务再访问时,可以看到触发了断路器,返回了自定义的默认值。

3.Feign

3.1添加依赖

在server-consum-feign 项目由于已经添加了feign依赖,feign已经默认集成了Hystrix。所以不用再添加多余依赖

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

3.2配置开启开关

# hystrix 支持
feign:hystrix:enabled: true

3.3定义断路实现Api

/*** Hystric 组件** @author 程序员小强*/
@Component
public class HelloFeignServiceHystric implements HelloFeignServiceApi {/*** 断路 hello方法** @param consumerApplicationName*/@Overridepublic Map<String, Object> hello(String consumerApplicationName) {Map<String, Object> resultMap = new LinkedHashMap<>();resultMap.put("code", 500);resultMap.put("messages", "网络繁忙,请稍后再试");resultMap.put("consumerApplicationName", consumerApplicationName);return resultMap;}}

3.4使用断路实现

在@FeignClient注解fallback属性指定断路实现

/*** 调用生产者测试接口** @author 程序员小强*/
@FeignClient(value = "server-provider", fallback = HelloFeignServiceHystric.class)
public interface HelloFeignServiceApi {@RequestMapping(value = "/hello", method = RequestMethod.GET)Map<String, Object> hello(@RequestParam(value = "consumerApplicationName") String consumerApplicationName);
}

3.5断路测试

现有注册中心中,有server-consum-feign服务调用server-provider服务

当服务正常时访问结果

当停止生产者server-provider服务再访问时,可以看到触发了断路器,返回了自定义的默认值。

3.6断路异常信息

问题1:添加了如下配置,但是

@FeignClient(value = "server-provider", fallback = HelloFeignServiceHystric.class)

当调用生产者服务,服务不存在下,会返回断路配置的默认值。


但是异常信息去哪里了呢?异常信息对我们排查问题尤为重要。

3.6.1FallbackFactory断路实现

换fallbackFactory实现方式,( 注意:与fallback方式不能同时使用 )
修改@FeignClient中fallback属性,改为fallbackFactory。
@FeignClient(value = “server-provider”, fallbackFactory = HelloFeignServiceHystricFactory.class)

定义FallbackFactory实现类

/*** Feign -FallbackFactory 断路实现** @author 程序员小强*/
@Component
public class HelloFeignServiceHystricFactory implements FallbackFactory<HelloFeignServiceApi> {private static final Logger log = LoggerFactory.getLogger(HelloFeignServiceHystricFactory.class);@Overridepublic HelloFeignServiceApi create(Throwable throwable) {String message = throwable.getMessage();log.error("[ 服务 hystrix 触发了 ] message:{} ", message, throwable);return new HelloFeignServiceApi() {@Overridepublic Map<String, Object> hello(String consumerApplicationName) {Map<String, Object> resultMap = new LinkedHashMap<>();resultMap.put("code", 500);resultMap.put("messages", "网络繁忙,请稍后再试");resultMap.put("consumerApplicationName", consumerApplicationName);return resultMap;}};}
}

日志这样就可以打印了

关注程序员小强公众号更多编程趣事,知识心得与您分享

[SpringCould篇]之断路器(Hystrix)相关推荐

  1. Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)

    在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard. 一.Hystrix Dashboard简 ...

  2. hystrix 配置 不生效_12、Feign整合断路器Hystrix

    上编说了<RestTemplate+Ribbon整合断路器Hystrix>,这篇来看看如何Feign整合断路器Hystrix,Feign整合断路器Hystrix也是相对比较简单的.Feig ...

  3. springCloud - 第12篇 - 服务监控 Hystrix 面板

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前面有用过 Hystrix 熔断,在多服务运行时.可以通过 Hystrix 的监控面板来实时观察各个 ...

  4. spring cloud 熔断_Spring Cloud 熔断器/断路器 Hystrix

    在微服务架构中,业务会被拆分成一个个服务,服务间可以彼此调用.为了保证服务的高可用性,单个服务通常会被集群部署,但是由于网络等原因,服务并不能保证100%可用.如果某个服务出现了问题,那么调用这个服务 ...

  5. 断路器hystrix原理及使用

    原理 在微服务架构中,服务之间形成调用链路,链路中的任何一个服务提供者都可能面临着相应超时.宕机等不可用的情况,在高并发的情况下,这种情况会随着并发量的上升恶化,形成"雪崩效应", ...

  6. springCloud - 第5篇 - 断路器 Hystrix ( Feign 、Ribbon )

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.为什么要有熔断 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC ...

  7. Spring Boot Spring Cloud B2B2C o2o 分布式 微服务 第四篇:断路器(Hystrix)(Finchley版本)-B2B2C小程序 电子商务

    一.断路器简介 Netflix has created a library called Hystrix that implements the circuit breaker pattern. In ...

  8. 【微服务架构】SpringCloud之断路器(hystrix)

    说在前面 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用 ...

  9. Eclipse(STS) 初次搭建Spring Cloud项目之断路器Hystrix(五)

    在微服务架构中,根据业务来拆分成一个个的服务,在SpringCloud中用RestTemplate+Ribbon和Feign来实现互相调用.为了保证其高可用,单个服务通常会集群部署. 由于网络原因或者 ...

最新文章

  1. SPOJ Ada and Spring Cleaning(hash)
  2. java 顶层类_Javase之集合体系之(1)集合顶层类Collection与其迭代器知识
  3. socket编程中常见的概念问题!
  4. svn is already under version control问题解决
  5. 洛谷 P3835: 【模板】可持久化平衡树
  6. Ionic Angular自动捕获错误 配置Angular2.x +
  7. 互联网日报 | 7月19日 星期一 | 美团外卖成立骑手服务部;金山办公发布“文档中台”;一汽-大众奥迪在华销量突破700万辆...
  8. tomcat更改端口序
  9. Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?
  10. python程序打包_python之程序打包
  11. maven 把依赖包一起打包
  12. 【c语言】调整数组使奇数所有都位于偶数前面
  13. EasyRecovery如何恢复wav音频文件
  14. php获取内容中第一张图片地址
  15. iOS开发--保存数据到本地
  16. 华为私有云的搭建方案_私有云平台搭建物业管理系统
  17. c++时间类型详解 time_t
  18. 快速上手数据挖掘之Solr5搜索引擎高级教程
  19. 跑马灯java代码_[Java教程]JQ跑马灯
  20. Video标签的常用属性操作

热门文章

  1. NLP进阶,Bert+BiLSTM情感分析实战
  2. 盘点抖音上的整蛊程序,会了这些谁还敢跟你玩?小心没朋友啦
  3. 有赞996刷屏:男程序员们,别再低头写代码了
  4. tools:ignore=Suspicious0dp
  5. 程序员脱发问题之个人经历
  6. 【逻辑漏洞】业务中常见的漏洞
  7. 搭建vue前端脚手架
  8. Excel公式大全加详解
  9. void value not ignored as it ought to be解决方法
  10. 使用python识别图像中的文字