一.什么是熔断
做过分布式的同学应该都知道这个概念,熔断就是切断项目对指定服务的调用。举个例子在分布式环境下有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 测试效果如何