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 测试效果如何

原文地址:https://www.cnblogs.com/KdeS/p/12033526.html