zoukankan      html  css  js  c++  java
  • Hystrix 断路器

    一.什么是熔断

    做过分布式的同学应该都知道这个概念,熔断就是切断项目对指定服务的调用。举个例子在分布式环境下有A,B,C,D四个个服务,A依赖B,C,D。在调用的过程中发现D服务异常了,为了不拖垮整个集群,我们会选择不调用D服务,进行服务降级。

    二.Hystrix是什么

    上面说了什么是熔断,可是什么时候该启用熔断,什么时候去探测服务是否可用,当依赖异常恢复时,什么时候上层恢复依赖等这些技术细节都是我们要去考虑的。而Hystrix就是为了解决这些问题而诞生的。

    在分布式环境下hystrix通过添加延迟容错和失败容差逻辑来帮助我们处理服务之间的交互。它会隔绝各服务间的调用,防止出现雪崩现象并提供fallback失败备用方案,以此提高我们服务集群的弹性。

    三.Hystrix设计原则是什么

        3.1 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
        3.2 甩掉包袱,快速失败而不是排队。
        3.3 在任何可行的地方提供回退,以保护用户不受失败的影响。
        3.4 使用隔离技术(如隔离板、泳道和断路器模式)来限制任何一个依赖项的影响。
        3.5 通过近实时的度量、监视和警报来优化发现时间。
        3.6 通过配置的低延迟传播来优化恢复时间。
        3.7 支持对Hystrix的大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。
        3.8 避免在整个依赖客户端执行中出现故障,而不仅仅是在网络流量中。

     四.Hystrix案列实现

       4.1   maven

       <!--SpringCloud Hystrix-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>

    4.2 启动断路器

    @SpringBootApplication
    @EnableEurekaClient  //服务扫面
    @EnableFeignClients  //启用feign
    @EnableCircuitBreaker //启用断路器Hystrix
    public class Feign {
        public static void main( String[] args )
        {
            SpringApplication.run(Feign.class);
        }
    
    }

    4.3定义使用短路机制的接口

    package com.web.client;
    
    import com.web.pojo.User;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    @FeignClient(name = "PRODUCTACLIENT")
    public interface TestClient {
    
    
        @GetMapping("/getuser/{id}")
        public User getuser(@PathVariable int id);
    }

    4.4 使用断路机制

    @RestController
    public class EurekaController {
    
        @Autowired
        private TestClient testClient;
    
        //断路
        @GetMapping("/Info/{id}")
        //表示将在这个方法中启用断路机制
        //fallbackMethod:指定降级方法,当这个方法超过默认的2s超时后就调用下面error这个的结果
        @HystrixCommand(fallbackMethod = "error")
        public String Info(@PathVariable int id){
            long ms=(long)(3000L*Math.random());
            try {
                Thread.sleep(ms);
            }catch (Exception e){
                e.printStackTrace();
            }
            User Restlt=testClient.getuser(id);
            System.out.println("result={}");
            System.out.println(Restlt);
            return Restlt.toString();
        }
    
        //降级方法
        public String error(@PathVariable int id){
            return id+"超时出错";
        }
    }

    4.5 测试效果如何

  • 相关阅读:
    javascript语句语义大全(6)
    javascript语句语义大全(5)
    javascript语句语义大全(4)
    javascript语句语义大全(3)
    javascript语句语义大全(2)
    javascript语句语义大全(1)
    javascript基础知识(1)
    模版引擎Handlebars语法(1)
    一个完整的项目中,需要的基本gulp
    HTML5新特性总览
  • 原文地址:https://www.cnblogs.com/KdeS/p/12033526.html
Copyright © 2011-2022 走看看