400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

微服务容错限流Hystrix入门

为什么需要容错限流

Hystrix是什么

Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

成都创新互联公司专业成都网站设计、成都做网站、外贸网站建设,集网站策划、网站设计、网站制作于一体,网站seo、网站优化、网站营销、软文营销等专业人才根据搜索规律编程设计,让网站在运行后,在搜索中有好的表现,专业设计制作为您带来效益的网站!让网站建设为您创造效益。

Hystrix能做什么

Hystrix设计原则

Hystrix设计思想来源

舱壁隔离模式

货船为了进行防止漏水和火灾的扩散,会将货仓分隔为多个,当发生灾害时,将所在货仓进行隔离就可以降低整艘船的风险。

微服务容错限流Hystrix入门

断路器模式

熔断器就像家里的保险丝,当电流过载了就会跳闸,不过Hystrix的熔断机制相对复杂一些。

微服务容错限流Hystrix入门

熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的.

Hystrix工作流程

官网原图

微服务容错限流Hystrix入门

中文版

微服务容错限流Hystrix入门

流程说明

  1. 每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
  2. 执行execute()/queue做同步或异步调用.
  3. 当前调用是否已被缓存,是则直接返回结果,否则进入步骤 4
  4. 判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤 8,进行降级策略,如果关闭进入步骤 5
  5. 判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤 6
  6. 调用HystrixCommand的run方法.运行依赖逻辑
    • 6.1. 调用是否出现异常,否:继续,是进入步骤8,
    • 6.2. 调用是否超时,否:返回调用结果,是进入步骤8
  7. 搜集5、6步骤所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态
  8. getFallback()降级逻辑.四种触发getFallback调用情况(图中步骤8的箭头来源):
    返回执行成功结果

两种资源隔离模式

线程池隔离模式

使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)。

信号量隔离模式

使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)。

线程池隔离模式 VS 信号量隔离模式

微服务容错限流Hystrix入门

Hystrix主要配置项

微服务容错限流Hystrix入门
微服务容错限流Hystrix入门

快速上手

pom.xml


    org.springframework.boot
    spring-boot-starter-web


    com.netflix.hystrix
    hystrix-core
    1.5.12


    com.netflix.hystrix
    hystrix-metrics-event-stream
    1.5.12


    com.netflix.hystrix
    hystrix-javanica
    1.5.12

HystrixConfig

@Configuration
public class HystrixConfig {

    /**
     * 声明一个HystrixCommandAspect代理类,现拦截HystrixCommand的功能
     */
    @Bean
    public HystrixCommandAspect hystrixCommandAspect() {
        return new HystrixCommandAspect();
    }

}

HelloService

@Service
public class HelloService {

    @HystrixCommand(fallbackMethod = "helloError",
            commandProperties = {
                    @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
                    @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
                    @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "2")},
            threadPoolProperties = {
                    @HystrixProperty(name = "coreSize", value = "5"),
                    @HystrixProperty(name = "maximumSize", value = "5"),
                    @HystrixProperty(name = "maxQueueSize", value = "10")
            })
    public String sayHello(String name) {
        try {
            Thread.sleep( 15000 );
            return "Hello " + name + " !";
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String helloError(String name) {
        return "服务器繁忙,请稍后访问~";
    }

}

启动类

@SpringBootApplication
@RestController
public class HystrixSimpleApplication {

    @Autowired
    private HelloService helloService;

    public static void main(String[] args) {
        SpringApplication.run( HystrixSimpleApplication.class, args );
    }

    @GetMapping("/hi")
    public String hi(String name) {
        return helloService.sayHello( name );
    }

}

测试

访问 http://localhost:80809/hi?name=zhangsan

curl -X GET -d 'name=zhangsan' http://localhost:8080/hi

返回

服务器繁忙,请稍后访问~

源码

https://github.com/gf-huanchupk/SpringCloudLearning/tree/master/chapter16

参考

https://github.com/Netflix/Hystrix/wiki

https://blog.51cto.com/snowtiger/2057092

欢迎关注我的公众号《程序员果果》,关注有惊喜~~
微服务容错限流Hystrix入门


网站题目:微服务容错限流Hystrix入门
分享网址:http://mbwzsj.com/article/jejcej.html

其他资讯

让你的专属顾问为你服务