[SpringCould篇]之断路器(Hystrix)
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)相关推荐
- Spring Cloud第十二篇:断路器监控(Hystrix Dashboard)
在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下Hystrix Dashboard组件,这篇文章更加详细的介绍Hystrix Dashboard. 一.Hystrix Dashboard简 ...
- hystrix 配置 不生效_12、Feign整合断路器Hystrix
上编说了<RestTemplate+Ribbon整合断路器Hystrix>,这篇来看看如何Feign整合断路器Hystrix,Feign整合断路器Hystrix也是相对比较简单的.Feig ...
- springCloud - 第12篇 - 服务监控 Hystrix 面板
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前面有用过 Hystrix 熔断,在多服务运行时.可以通过 Hystrix 的监控面板来实时观察各个 ...
- spring cloud 熔断_Spring Cloud 熔断器/断路器 Hystrix
在微服务架构中,业务会被拆分成一个个服务,服务间可以彼此调用.为了保证服务的高可用性,单个服务通常会被集群部署,但是由于网络等原因,服务并不能保证100%可用.如果某个服务出现了问题,那么调用这个服务 ...
- 断路器hystrix原理及使用
原理 在微服务架构中,服务之间形成调用链路,链路中的任何一个服务提供者都可能面临着相应超时.宕机等不可用的情况,在高并发的情况下,这种情况会随着并发量的上升恶化,形成"雪崩效应", ...
- springCloud - 第5篇 - 断路器 Hystrix ( Feign 、Ribbon )
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.为什么要有熔断 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC ...
- Spring Boot Spring Cloud B2B2C o2o 分布式 微服务 第四篇:断路器(Hystrix)(Finchley版本)-B2B2C小程序 电子商务
一.断路器简介 Netflix has created a library called Hystrix that implements the circuit breaker pattern. In ...
- 【微服务架构】SpringCloud之断路器(hystrix)
说在前面 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用 ...
- Eclipse(STS) 初次搭建Spring Cloud项目之断路器Hystrix(五)
在微服务架构中,根据业务来拆分成一个个的服务,在SpringCloud中用RestTemplate+Ribbon和Feign来实现互相调用.为了保证其高可用,单个服务通常会集群部署. 由于网络原因或者 ...
最新文章
- SPOJ Ada and Spring Cleaning(hash)
- java 顶层类_Javase之集合体系之(1)集合顶层类Collection与其迭代器知识
- socket编程中常见的概念问题!
- svn is already under version control问题解决
- 洛谷 P3835: 【模板】可持久化平衡树
- Ionic Angular自动捕获错误 配置Angular2.x +
- 互联网日报 | 7月19日 星期一 | 美团外卖成立骑手服务部;金山办公发布“文档中台”;一汽-大众奥迪在华销量突破700万辆...
- tomcat更改端口序
- Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?
- python程序打包_python之程序打包
- maven 把依赖包一起打包
- 【c语言】调整数组使奇数所有都位于偶数前面
- EasyRecovery如何恢复wav音频文件
- php获取内容中第一张图片地址
- iOS开发--保存数据到本地
- 华为私有云的搭建方案_私有云平台搭建物业管理系统
- c++时间类型详解 time_t
- 快速上手数据挖掘之Solr5搜索引擎高级教程
- 跑马灯java代码_[Java教程]JQ跑马灯
- Video标签的常用属性操作