随着服务的拆分,各个服务有着明确的职责,服务之间通过轻量级的协议进行通讯。但有时候我们完成一个功能需要同时调用多个微服务,比如完成订单的创建,那么获取用户信息需要调用用户微服务,获取商品信息需要调用商品微服务,给用户增加积分需要调用积分微服务。假如用户微服务调用此时响应慢,就会导致调用线程(tomcat线程或jetty线程等)被占用,降低系统的处理能力。如果用户微服务被隔离了,使用是自己的线程,那么就不会占用调用线程,系统的处理能力就会提高。 下面是官网隔离的图。
从上面可以看到,隔离机制分成2种,左侧是线程池隔离,右侧是信号量隔离。上方蓝色的线是调用线程(tomcat线程...),黄色的线是hystrixCommand线程
线程池隔离:
1、调用线程和hystrixCommand线程不是同一个线程,并发请求数受到线程池(不是容器tomcat的线程池,而是hystrixCommand所属于线程组的线程池)中的线程数限制,默认是10。
2、这个是默认的隔离机制
3、hystrixCommand线程无法获取到调用线程中的ThreadLocal中的值
信号量隔离:
1、调用线程和hystrixCommand线程是同一个线程,默认最大并发请求数是10
2、调用数度快,开销小,由于和调用线程是处于同一个线程,所以必须确保调用的微服务可用性足够高并且返回快才用
需求:
1、修改默认的隔离策略为线程隔离
2、为具体的某个方法设置信号量隔离
3、对线程隔离和信号量隔离其余的参数进行配置
4、fallback最大的并发设置,超出直接抛出异常(即同时调用fallback的上限,超出抛出异常)
代码结构:
eureka-server
|- 服务注册中心
hystrix
product-provider-8091
|- 服务提供者,返回商品信息
product-consumer-feign-hystrix-isolation-dashboard-8094
|- 服务消费者,实现服务隔离和dashboard查看
代码实现
一、注册中心和服务提供者的实现(和上一节的代码一样或见最下方的代码连接)
二、服务消费者
1、引入依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-httpclient</artifactId> <version>8.17.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
引入依赖:
spring-cloud-starter-netflix-hystrix
spring-cloud-starter-netflix-hystrix-dashboard
2、启动类上增加注解@EnableHystrixDashboard 图表监控注解
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker @EnableHystrixDashboard public class ApplicationProductConsumer8094 { public static void main(String[] args) { SpringApplication.run(ApplicationProductConsumer8094.class, args); } }
3、远程调用feign的实现和yml的配置
注意:需要记住这个类名和selectByProductIdAndName这个方法名,下方yml配置中使用信号量隔离用到了。
注意:
1、注意上面yml 中隔离的写法以及其他的参数的含义。
2、hystrix.command.default ===> 全局配置
3、hystrix.command.commandKey ===> 局部配置
4、控制层写法
/** * 商品控制器 * * @author huan.fu * @date 2018/5/30 - 16:52 */ @RestController @RequestMapping("product") public class ProductController { @Autowired private ProductService01Feign productService01Feign; /** * 获取商品信息 * * @param productId * @return */ @GetMapping("/01/selectOne/{productId}") public Map<String, Object> select01ByProductId(@PathVariable String productId) { try { MDC.put("productId", productId); return productService01Feign.selectByProductId(productId); } finally { MDC.clear(); } } @GetMapping("/01/selectByProductIdAndName") public Map<String, Object> selectByProductIdAndName(String productId, String productName) { return productService01Feign.selectByProductIdAndName(productId, productName); } }
访问路径:
http://localhost:8094/product/01/selectOne/p0001 -> 访问的是信号量隔离方法
http://localhost:8094/product/01/selectByProductIdAndName?productId=p0001&productName=Mac%20Book -> 访问的是线程池隔离的方法
运行结果,看下方的运行结果图。
5、运行结果
监控页面:
1、访问 http://localhost:8094
2、因为我们是单机的,所以访问路径是:http://localhost:8094/hystrix.stream
从运行结果的最后的监控页面上我们可以看到,当访问http://localhost:8094/product/01/selectByProductIdAndName?productId=p0001&productName=Mac%20Book链接时,监控页面上
出现了线程池监控,且pool size的最大值为6,说明这个使用的是线程池隔离,访问另外的一个没有出现,说明是使用的是信号量隔离
三、完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/hystrix
hystrix隔离代码:https://gitee.com/huan1993/spring-cloud-parent/tree/master/hystrix/product-consumer-feign-hystrix-isolation-dashboard-8094
相关推荐
2. **隔离(Isolation)**: Hystrix 提供线程池和信号量两种隔离策略,限制同时进行的服务调用数量,防止资源耗尽。 3. **Fallback(回退)**: 当服务调用失败或被熔断器拦截时,可以提供一个备用的回退逻辑,保证...
以上是关于 Spring Cloud Hystrix 及其 Dashboard 的源码解读,深入理解这些核心组件和机制对于开发者来说是非常有价值的。这不仅能帮助我们更好地利用 Hystrix 来实现服务间的容错机制,还能在实际应用中更好地进行...
通常,这包括`spring-cloud-starter-netflix-hystrix`和`spring-cloud-starter-netflix-hystrix-dashboard`,后者用于可视化监控。 2. **配置Hystrix**:在`application.yml`或`application.properties`文件中配置...
总结来说,Spring Cloud Hystrix 通过断路器、线路隔离、回退策略等手段,增强了微服务架构的稳定性和容错性。通过实际项目中的集成示例,开发者可以更好地理解和运用这些概念,提升系统的整体性能和可靠性。
1. **依赖添加**:在你的`pom.xml`文件中,需要添加`spring-cloud-starter-netflix-hystrix-dashboard`和`spring-cloud-starter-netflix-turbine`依赖。Turbine是用于聚合多个Hystrix流的组件,这样你就可以在一个...
总之,SpringCloud Hystrix通过服务熔断和降级策略,提高了微服务架构的稳定性和容错性,是构建高可用系统的关键工具。通过理解其核心概念和使用方法,开发者可以更好地应对分布式系统中的复杂挑战,实现更加健壮的...
spring-cloud-hystrix-dashboard(包含注册中心、member、hystrix-dashboard配置等).zip 包含配置好的eureka注册中心,member服务生产者、hystrix-dashboard的hystrix配置和仪表盘配置
7. **监控与告警**:通过Hystrix Dashboard和Turbine,可以实时监控服务的运行状况,包括成功率、响应时间和熔断次数等,及时发现并解决问题。 总之,Spring Cloud Hystrix是构建高可用、健壮微服务的关键工具,它...
这个例子展示了如何在Spring Cloud环境中集成Hystrix来实现服务熔断和降级策略。 首先,`spring-cloud-hystrix` 是Netflix开发的一个库,它是基于Hystrix设计模式的实现,用于构建容错系统。Hystrix的核心概念包括...
spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar
SpringCloud Hystrix-Dashboard 仪表盘的实现 SpringCloud Hystrix-...Hystrix-Dashboard 仪表盘是 SpringCloud 中的一种强大且灵活的监控工具,能够帮助开发者快速发现系统中存在的问题,提高系统的可靠性和稳定性。
在Spring Cloud生态系统中,Hystrix是一个至关重要的组件,它主要负责实现服务容错和断路器模式,以增强系统的稳定性和健壮性。本文将深入探讨如何在Spring Cloud项目中集成并使用Hystrix,以及如何将其与Feign...
6. **集成监控**:集成Hystrix Dashboard和Turbine,实现对Hystrix指标的可视化监控。 通过以上步骤,我们可以有效地利用Spring Cloud Netflix Hystrix构建一个健壮的微服务架构,增强系统的容错性,确保在面临高...
Hystrix 和 Hystrix Dashboard 是 SpringCloud 中的两个组件,分别用于熔断监控和实时监控。 知识点四:Maven 依赖管理 Maven 是一个项目管理工具,可以帮助开发者快速构建项目。Maven 依赖管理可以帮助开发者快速...
【标签】"Spring hystrix dashborad" 指出,这个项目与Spring框架的扩展Spring Cloud Hystrix和其配套的可视化监控界面Hystrix Dashboard有关。Spring Cloud Hystrix是一个用于实现断路器模式的库,能够帮助服务防止...
这两个文件很可能是Hystrix的两个不同版本的示例,可能涵盖了Hystrix命令模式的使用、断路器的配置、降级策略的实现,以及Hystrix Dashboard和Turbine的集成,用于实时监控服务健康状态。 通过学习和实践这些示例...
springcloud hystrix-dashboard
同时,Spring Cloud还提供了Hystrix Dashboard和Turbine来监控和聚合Hystrix命令的运行状况,帮助开发者了解服务的健康状态和性能指标。 在实际项目中,合理地配置和使用Hystrix不仅能提高系统的容错能力,还能优化...
课程中对比了 Dubbo 和 SpringCloud,并深入讲授SpringCloud核心组件Eureka、Ribbon、Feign、Hystrix、HystrixDashboard、Zuul、Config。除此之外,还通过整合SpringMVC+SpringBoot+Mybatis构建一个可用的基于Spring...