大多数分布式服务的调用是http或者Rpc请求进行访问,在项目中使用了http作为通信方式,通常http访问具有很多不确定因素,除了服务异常、常常还有网络或者业务引起的超时等问题(网络连接慢、资源繁忙、暂时不可用、服务脱机)。如果在web请求处理线程中直接进行http访问,在异常或者超时发生时,将会严重影响服务器的请求处理性能。当然我们可以自己封装服务调用,通过future等模式来实现服务的异步调用。Hystrix则为我们服务调用变的更安全可控,服务调用过程是在hystrix管理的线程池中,因此使得服务调用过程与web线程能隔离开,保证服务器的稳定,同时hystrix将不同的业务调用隔离在不同的线程池,能够很好的解决业务的重要性,处理效率问题。
Hystrix把服务调用统称为依赖调用, Hystrix通过命令模式封装依赖调用,每一个依赖调用封装在HystrixCommand中,每个命令在Hystrix的线程池中运行。另外可以对其配置分组名、线程组,使得不同的依赖可以分类在不同的线程组,隔离不同模块的依赖,也可根据负载情况,配置不同组的线程数。Hystrix还提供一种熔断器(CircuitBreaker)的机制,Hystrix可以通过设定的条件判断该封装的依赖调用是否可以正确调用,如果在一定时间内调用失败次数过多,则会熔断自身,使得相同的调用无法执行,待冷却之后重新再试。
构造HystrixCommand
命名HystrixCommandKey
HystrixCommand有自己的名字,比如可以是某远程服务名,如查询购物车、查询订单等,Hystrix使用单例模式存储HystrixCommand,熔断机制正式基于单实例上的调用情况统计实现。如果不设置这个名字,Hystrix会为其设置默认的名字:类名。
分组HystrixCommandGroupKey
GroupKey是每个命令最少配置的必选参数,因为下一个参数HystrixThreadPoolKey如果不指定的话,其会使用该参数值
线程池 HystrixThreadPoolKey
ThreadPoolKey顾名思义,是HystrixCommand运行所在的线程池,如果该参数不设置则使用GroupKey作为ThreadPoolKey,这种情况下往往是同一个业务模块的依赖调用在同一个线程池内,比如使用服务模块[user,order,product等]作为GroupKey,各个模块。如果同一业务内的服务之间还需要隔离的话,就可以设置该参数,比如order的订单和购物车可以通过设置不同的ThreadPoolKey再区分到不同线程池中,这在应对高并发时可以带来较好的效果,因为订单某些查询时比较慢的,如果和购物车放在同一个线程池回影响购物车的速率,同时也可以把下单接口单独隔离。
另外可以通过HystrixThreadPoolProperties设置线程池的属性,比如核心线程数大小、最大线程数、任务队列大小,和java的线程池一致,HystrixThreadPoolProperties本身也提供了一些默认值。
下面是简单的一个HystrixCommand的构造过程
//构造setter
HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey(group);
HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey(group);
HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey(service);
HytrixBaseCommand.Setter setter = HytrixBaseCommand.Setter.withGroupKey(groupKey)
.andCommandKey(commandKey)
.andThreadPoolKey(threadPoolKey);
//构造command
HystrixCommand<String> command = new HystrixCommand<String>(setter) {
protected String run() throws Exception {
logger.info("##################### in hystrix thread");
Thread.sleep(time);
if(isException)
throw new RuntimeException("exception in run");
return service+ ":return";
}
@Override
protected String getFallback() {
logger.info("##################### in request thread");
return service+":fallback";
}
};
run()方法
实现run方法,执行具体的依赖调用。
getFallback()方法
如果run方法中发生异常,或者run方法运行时间过长(相当于超时),又或者线程池中任务队列已满,这时HystrixCommand会调用getFallback返回一个默认值,当然也可以在这进行特殊的出错处理,该函数是运行在web请求线程中。如果没有重写该方法,那run抛出的异常将被抛到web请求线程中。
如果某个依赖的run方法在短时间内发生异常或超时次数过多,此时Hystrix会发生熔断,该依赖新的HystrixCommand执行会直接调用getFallback返回,避免无效的调用浪费资源。当然在冷却一段时间后,新的依赖调用还是会通过run重试。
执行HystrixCommand
HystrixCommand的执行有以下四种方式
1.execute()
阻塞方式,内部使用queue().get()
2.queue()
非阻塞方式,返回future对象,可以再调用get来阻塞调用获取结果
3.observe()
热注册方式
4.toObservable()
冷注册方式,等注册时执行
前三种调用方式,最终都是依赖第四种方式.
Hystrix 另外还提供给我们一个监控功能,可以直接使用其开源项目进行配置,就能实时的观察我们的服务调用情况。
配置 Hystrix-dashboard
1.构建dashboard项目
$ git clone https://github.com/Netflix/Hystrix.git
$ cd Hystrix/hystrix-dashboard
$ ../gradlew jettyRun
打开路径:
http://localhost:7979/hystrix-dashboard
2.配置服务状态上报 xml
<servlet>
<display-name>HystrixMetricsStreamServlet</display-name>
<servlet-name>HystrixMetricsStreamServlet</servlet-name>
<servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HystrixMetricsStreamServlet</servlet-name>
<url-pattern>/hystrix.stream</url-pattern>
</servlet-mapping>
3.添加stream
在hystrix-dashboard中按照说明添加自己的http://hystrix-app:port/hystrix.stream,然后监视
4.如果是集群,通过turbine进行监视
Hystrix执行 流程图
简单的翻译下官网介绍,其中注意几点,excute,queue方法最终会调用toObservable方法。如果使用ObservableCommand,需要实现的方法分别为construct方法与resumeWithFallBack方法。
测试例子
@Component
@RequestMapping("/cmd")
public class CmdCtl {
Logger logger = LoggerFactory.getLogger(CmdCtl.class);
@RequestMapping("/do")
@ResponseBody
public String getOne(@RequestParam String method,
@RequestParam(required = false,defaultValue = "0") Integer time,
@RequestParam(required = false,defaultValue = "false") Boolean isException) {
return dispatch(method,time,isException);
}
public String dispatch(final String service,final int time,final boolean isException) {
String group = service.split("\\.")[0];
//构造setter
HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey(group);
HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey(group);
HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey(service);
HytrixBaseCommand.Setter setter = HytrixBaseCommand.Setter.withGroupKey(groupKey) //分组名
.andCommandKey(commandKey) //依赖名
.andThreadPoolKey(threadPoolKey); //执行线程池名
//构造command
HystrixCommand<String> command = new HystrixCommand<String>(setter) {
protected String run() throws Exception {
logger.info("##################### in hystrix thread");
if(time>0)//模拟长时间操作
Thread.sleep(time);
if(isException) //模拟异常情况
throw new RuntimeException("exception in run");
return service+ ":return";
}
@Override
protected String getFallback() {
logger.info("##################### in request thread");
return service+":fallback";
}
};
//阻塞执行,获取结果
String rel=command.execute();
return rel;
}
}
测试结果
可以通过设置不同的请求查看调用结果,对于熔断机制,因为默认的熔断器是在短时间内进行判断,因此可以通过jmeter进行并发测试。
启动30个线程执行
测试中有三类请求:
one.p1 time:1000 isException:false
one.p2 time:1000 isException:true
two.a1 time:100 isException:false
可以发现one.p1和one.p2 服务依赖出错情况较多,one.p2主要是由于抛出异常错误率为100%,且熔断器circult为open状态,one.p1因为运行时间较长,也发生了熔断,错误也较多。但是tow模块的请求未受到任何影响。
对于熔断机制,和一些参数设置还需要进一步学习研究。
- 大小: 299.2 KB
- 大小: 88.8 KB
分享到:
相关推荐
Spring Cloud Hystrix入门和Hystrix命令原理分析 Spring Cloud Hystrix是一种基于Netflix Hystrix实现的服务保护框架,主要用于解决分布式系统中的服务调用故障问题。它提供了断路器、线程隔离、服务降级、服务熔断...
Hystrix的入门相对简单,其提供的注解编程模型允许开发者通过极简的配置就能实现上述功能。对于开发者而言,只需在需要的服务调用上添加相应的Hystrix注解即可将该调用纳入Hystrix的管理之下。 简而言之,Spring ...
3. **Hystrix快速入门**: 要使用Hystrix,首先需要在项目中引入依赖,如在Spring Boot项目中,需要添加Hystrix的Maven依赖。接着,通过`@HystrixCommand`注解标记服务调用方法,配置相应的属性,如超时时间、降级...
初学者入门要点** 对于初学者来说,理解以下几点至关重要: - **理解微服务架构**:学习微服务的基本概念,了解服务之间的独立性和通信方式。 - **掌握Spring Cloud**:熟悉Spring Cloud的组件和它们在微服务中的...
在本"springCloud入门源码"中,我们可以深入理解这些核心组件的工作原理。 1. **服务注册与发现**:使用Eureka作为服务注册与发现的组件。Eureka Server负责注册服务提供者的实例,并维护服务实例的状态。服务消费...
适用于入门快速看效果。整合了eureka(注册中心)、Zuul(网关)、Feign(本地化的远程调研、负载均衡)、hystrix(熔断器)。笔记可查看:https://blog.csdn.net/snail_spoor/article/details/117196596
4. **Hystrix:断路器**:解释了 Hystrix 如何防止服务雪崩,通过隔离请求和降级策略来保护系统稳定性。 5. **Spring Cloud Config:配置管理**:阐述了如何使用 Config Server 和 Config Client 进行集中式配置...
SpringCloud入门版学习资料集合了微服务架构的关键组件和技术,为初学者提供了全面的了解和实践平台。以下将详细介绍其中涉及的知识点。 1. **分布式架构与微服务**: 分布式架构是一种将应用程序拆分为多个独立的...
项目简介 SpringCloud微服务框架实战(2020年3月更新),源自一线项目实践总结和... SpringCloud从入门到精通教程(六)-细分/服务消费者(功能区+ hystrix) SpringCloud从入门到精通教程(七)-细分/服务消费者(fe
4. **Hystrix**:Hystrix是Netflix开源的一个延迟和容错库,用于隔离服务之间的调用,防止因某个服务的故障导致整个系统的崩溃。它提供了断路器模式,当服务出现异常时,可以迅速切换到降级策略,保证系统的稳定运行...
Hystrix是Spring Cloud中的断路器组件,用于处理服务之间的延迟和故障,防止因单个服务失败导致整个系统雪崩。断路器状态有开、半开、闭合三种,当服务调用频繁失败时,断路器打开,阻止后续请求,避免系统过载。 ...
Spring Cloud 入门知识点总结 Spring Cloud 是基于 SpringBoot 的一站式微服务解决方案,旨在简化分布式系统的开发和维护。下面是 Spring Cloud 入门的知识点总结: 什么是 Spring Cloud? Spring Cloud 是一个...
hawtio-plugin-hystrix 用于 Hystrix 仪表板的 Hawt.io 插件 这是一个独立的 Hystrix Hawt.io 插件,允许将 hystrix 仪表板嵌入到 Hawt.io 控制台中。 插件旨在部署在 OSGi 容器中,例如 Karaf。 该插件是自包含...
Spring Cloud集成Hystrix Spring Cloud Config Spring Cloud Sleuth https://spring.io/projects/spring-cloud-sleuth#overview 非Spring Boot Web项目 注册节点到Eureka Server并提供服务 ...
本入门操作手册将全面涵盖以下几个核心知识点: 1. **Eureka 服务注册与发现**:Eureka 是 Spring Cloud 的服务注册与发现组件,它允许服务提供者向 Eureka Server 注册自己的服务,同时服务消费者可以通过 Eureka ...
- hystrixdashboard hystrix监控service 无需注册 # 注册中心 - [原版官网](https://cloud.spring.io/spring-cloud-static/Finchley.M6/single/spring-cloud.html) - [中文版]...
本资源为新手提供了一个完整的SpringCloud入门项目,包括源码、SQL脚本和详细的开发文档,非常适合想要快速了解和学习SpringCloud的新手。 1. **SpringCloud简介** SpringCloud是基于SpringBoot构建的服务治理框架...
本资料涉及了系统架构演变,eureka注册中心,ribbon负载均衡,hystrix断路器,feign,Hystrix DashBoard监控,性能工具Jmetter,Zuul网关,Spring Cloud Config配置中心等。 文档非常详细的书写了每个项目搭建步骤,...
在Spring Cloud生态系统中,Eureka、Feign、Ribbon、Hystrix和Zuul是五个关键组件,它们协同工作,构建出一个强大的微服务架构。让我们深入了解一下这些组件及其功能。 1. **Eureka**:Eureka是Spring Cloud的服务...