`

spring cloud hystrix的隔离策略和dashboard

阅读更多

    随着服务的拆分,各个服务有着明确的职责,服务之间通过轻量级的协议进行通讯。但有时候我们完成一个功能需要同时调用多个微服务,比如完成订单的创建,那么获取用户信息需要调用用户微服务,获取商品信息需要调用商品微服务,给用户增加积分需要调用积分微服务。假如用户微服务调用此时响应慢,就会导致调用线程(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

  • 大小: 73.1 KB
  • 大小: 196 KB
  • 大小: 1.6 MB
分享到:
评论

相关推荐

    springcloud hystrix 断路由

    2. **隔离(Isolation)**: Hystrix 提供线程池和信号量两种隔离策略,限制同时进行的服务调用数量,防止资源耗尽。 3. **Fallback(回退)**: 当服务调用失败或被熔断器拦截时,可以提供一个备用的回退逻辑,保证...

    spring cloud hystrix &&dashboard源码解读

    以上是关于 Spring Cloud Hystrix 及其 Dashboard 的源码解读,深入理解这些核心组件和机制对于开发者来说是非常有价值的。这不仅能帮助我们更好地利用 Hystrix 来实现服务间的容错机制,还能在实际应用中更好地进行...

    springcloud hystrix的使用

    通常,这包括`spring-cloud-starter-netflix-hystrix`和`spring-cloud-starter-netflix-hystrix-dashboard`,后者用于可视化监控。 2. **配置Hystrix**:在`application.yml`或`application.properties`文件中配置...

    Spring Cloud Hystrix

    总结来说,Spring Cloud Hystrix 通过断路器、线路隔离、回退策略等手段,增强了微服务架构的稳定性和容错性。通过实际项目中的集成示例,开发者可以更好地理解和运用这些概念,提升系统的整体性能和可靠性。

    SpringCloud10-2 Hystrix整合Dashboard教程

    1. **依赖添加**:在你的`pom.xml`文件中,需要添加`spring-cloud-starter-netflix-hystrix-dashboard`和`spring-cloud-starter-netflix-turbine`依赖。Turbine是用于聚合多个Hystrix流的组件,这样你就可以在一个...

    SpringCloud Hystrix服务熔断.docx

    总之,SpringCloud Hystrix通过服务熔断和降级策略,提高了微服务架构的稳定性和容错性,是构建高可用系统的关键工具。通过理解其核心概念和使用方法,开发者可以更好地应对分布式系统中的复杂挑战,实现更加健壮的...

    spring-cloud-hystrix-dashboard(包含注册中心、member、hystrix-dashboard配置等).zip

    spring-cloud-hystrix-dashboard(包含注册中心、member、hystrix-dashboard配置等).zip 包含配置好的eureka注册中心,member服务生产者、hystrix-dashboard的hystrix配置和仪表盘配置

    Spring Cloud(Hystrix)使用.zip

    7. **监控与告警**:通过Hystrix Dashboard和Turbine,可以实时监控服务的运行状况,包括成功率、响应时间和熔断次数等,及时发现并解决问题。 总之,Spring Cloud Hystrix是构建高可用、健壮微服务的关键工具,它...

    spring cloud hystrix 服务容错保护例子

    这个例子展示了如何在Spring Cloud环境中集成Hystrix来实现服务熔断和降级策略。 首先,`spring-cloud-hystrix` 是Netflix开发的一个库,它是基于Hystrix设计模式的实现,用于构建容错系统。Hystrix的核心概念包括...

    spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar

    spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar

    SpringCloud Hystrix-Dashboard仪表盘的实现

    SpringCloud Hystrix-Dashboard 仪表盘的实现 SpringCloud Hystrix-...Hystrix-Dashboard 仪表盘是 SpringCloud 中的一种强大且灵活的监控工具,能够帮助开发者快速发现系统中存在的问题,提高系统的可靠性和稳定性。

    15.Spring Cloud中使用Hystrix

    在Spring Cloud生态系统中,Hystrix是一个至关重要的组件,它主要负责实现服务容错和断路器模式,以增强系统的稳定性和健壮性。本文将深入探讨如何在Spring Cloud项目中集成并使用Hystrix,以及如何将其与Feign...

    spring-cloud-netflix-hystrix应用

    6. **集成监控**:集成Hystrix Dashboard和Turbine,实现对Hystrix指标的可视化监控。 通过以上步骤,我们可以有效地利用Spring Cloud Netflix Hystrix构建一个健壮的微服务架构,增强系统的容错性,确保在面临高...

    SpringCloud之熔断监控Hystrix Dashboard的实现

    Hystrix 和 Hystrix Dashboard 是 SpringCloud 中的两个组件,分别用于熔断监控和实时监控。 知识点四:Maven 依赖管理 Maven 是一个项目管理工具,可以帮助开发者快速构建项目。Maven 依赖管理可以帮助开发者快速...

    hystrix-dashboard.zip

    【标签】"Spring hystrix dashborad" 指出,这个项目与Spring框架的扩展Spring Cloud Hystrix和其配套的可视化监控界面Hystrix Dashboard有关。Spring Cloud Hystrix是一个用于实现断路器模式的库,能够帮助服务防止...

    springcloud2-hystrix-feign-zuul.zip

    这两个文件很可能是Hystrix的两个不同版本的示例,可能涵盖了Hystrix命令模式的使用、断路器的配置、降级策略的实现,以及Hystrix Dashboard和Turbine的集成,用于实时监控服务健康状态。 通过学习和实践这些示例...

    hystrix-dashboard-1.5.9.war

    springcloud hystrix-dashboard

    SpringCloud10-Hystrix熔断器学习代码及指定默认的全局兜底方法

    同时,Spring Cloud还提供了Hystrix Dashboard和Turbine来监控和聚合Hystrix命令的运行状况,帮助开发者了解服务的健康状态和性能指标。 在实际项目中,合理地配置和使用Hystrix不仅能提高系统的容错能力,还能优化...

    springcloud教程源码 springcloud demo

    课程中对比了 Dubbo 和 SpringCloud,并深入讲授SpringCloud核心组件Eureka、Ribbon、Feign、Hystrix、HystrixDashboard、Zuul、Config。除此之外,还通过整合SpringMVC+SpringBoot+Mybatis构建一个可用的基于Spring...

Global site tag (gtag.js) - Google Analytics