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

spring cloud hystrix的隔离策略和dashboard的更多相关文章

  1. Spring Cloud Hystrix熔断器隔离方案

      Hystrix组件提供了两种隔离的解决方案:线程池隔离和信号量隔离.两种隔离方式都是限制对共享资源的并发访问量,线程在就绪状态.运行状态.阻塞状态.终止状态间转变时需要由操作系统调度,占用很大的性 ...

  2. spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略

    spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...

  3. 微服务架构之spring cloud hystrix&hystrix dashboard

    在前面介绍spring cloud feign中我们已经使用过hystrix,只是没有介绍,spring cloud hystrix在spring cloud中起到保护微服务的作用,不会让发生的异常无 ...

  4. Spring Cloud 微服务笔记(六)Spring Cloud Hystrix

    Spring Cloud Hystrix Hystrix是一个延迟和容错库,旨在隔离远程系统.服务和第三方库,阻止链接故障,在复杂的分布式系统中实现恢复能力. 一.快速入门 1)依赖: <dep ...

  5. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群

    前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...

  6. 分布式系统的延时和故障容错之Spring Cloud Hystrix

    本示例主要介绍 Spring Cloud 系列中的 Eureka,如何使用Hystrix熔断器容错保护我们的应用程序. 在微服务架构中,系统被拆分成很多个服务单元,各个服务单元的应用通过 HTTP 相 ...

  7. Spring Cloud学习 之 Spring Cloud Hystrix(基础知识铺垫)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 前述: 快速入门: 命令模式: RxJava: 前述: ​ 在微服务架构中, ...

  8. 7、Spring Cloud Hystrix

    1.Spring Cloud Hystrix简介 (1).分布式问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 多个微服务之间调用的时候,假设微服务A调 ...

  9. 笔记:Spring Cloud Hystrix 服务容错保护

    由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加 ...

随机推荐

  1. Python入门学习之:10分钟1500访问量

    看效果: 不扯没用的,直接上代码: # author : sunzd # date : 2019/9/01 # position : beijing from fake_useragent impor ...

  2. JS边角料: NodeJS+AutoJS+WebSocket+TamperMonkey实现局域网多端文字互传

    ---阅读时间约 7 分钟,复现时间约 15 分钟--- 由于之前一直在用的扩展 QPush 停止服务了,苦于一人凑齐了 Window, Android, Mac, ios 四种系统的设备,Apple ...

  3. Marvell 88SE9215 AHCI驱动笔记

    禁止转载!禁止转载!禁止转载! 一.Marvell 88SE9215.AHCI与SATA简介 1.Marvell 88SE9215 1)概述 88SE9215是一个四端口,兼容3 Gbps和6 Gbp ...

  4. python对象引用和垃圾回收

    变量="标签" 变量a和变量b引用同一个列表: >>> a = [1, 2, 3] >>> b = a >>> a.appen ...

  5. base64原理,使用场景

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  6. Loj#6053-简单的函数【Min25筛】

    正题 题目链接:https://loj.ac/p/6053 题目大意 定义一个积性函数\(f(p^c)=p\ xor\ c\),求\(\sum_{i=1}^nf(i)\) 解题思路 异或这个东西不太好 ...

  7. WPF进阶技巧和实战07--自定义元素02

    在01节中,研究了如何开发自定义控件,下节开始考虑更特殊的选择:派生自定义面板以及构建自定义绘图 创建自定义面板 创建自定义面板是一种比较常见的自定义控件开发子集,面板可以驻留一个或多个子元素,并且实 ...

  8. netty系列之:分离websocket处理器

    目录 简介 netty的消息处理 处理WebSocketFrame 处理HTTP 编码和解码器 总结 简介 在上一篇文章中,我们使用了netty构建了可以处理websocket协议的服务器,在这个服务 ...

  9. Redis分布式锁,看完不懂你打我

    简易的redis分布式锁 加锁: set key my_random_value NX PX 30000 这个命令比setnx好,因为可以同时设置过期时间.不设置过期时间,应用挂了,解不了锁,就一直锁 ...

  10. C语言日记② 初识 C的内存

    第一节: 上一个笔记 有趣的恶搞小程序 定时关机 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <str ...