当前位置:首页 > IT科技

SpringCloud系列之Hystrix熔断器

什么是断器熔断器?

熔断器本身是一个开关设置,当某个服务单元发生故障之后,断器通过熔断器的断器故障监控(类似保险丝),向调用方返回一个服务预期的断器,可处理的断器备选相应(fallBack),而不是断器长时间的等待或者抛出调用方法无法处理的异常。这样就保证了服务调用方的断器线程不会长时间,不必要的断器占用,从而避免了故障在分布式系统中的断器蔓延,乃至雪崩。断器

Hystrix的断器目标通过第三方客户端访问的依赖项(通常是通过网络)的服务器租用延迟和故障进行保护和控制。在复杂的断器分布式系统中防止级联故障。快速失败,断器快速恢复。断器回退,断器尽可能优雅地降级。启用实时监控、报警和操作控制。Hystrix设计原理防止任何单个依赖项耗尽整个容器用户线程甩掉包袱,快速失败而不是排队。在任何可行的地方提供回退,以保护用户不受失败的影响。使用隔离技术来限制任何一个依赖项的影响。通过实时的度量、监视和报警来优化发现时间。通过配置的低延迟传播来优化恢复时间。支持对Hystrix的源码下载大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。避免在整个客户端执行中出现故障,而不仅仅是在网络流量中。Hystrix断路器Demo

引入jar包;

org.springframework.cloud

spring-cloud-starter-hystrix

1.4.6.RELEASE

</dependency>

在启动类上开启断路器。

@SpringBootApplication

@EnableEurekaClient // 表示是eureka的客户端

@EnableFeignClients

@EnableDiscoveryClient // 提供服务发现

@EnableCircuitBreaker // 开启hystrix断路器

public class UserServiceApplication {

public static void main(String[] args) {

SpringApplication.run(UserServiceApplication.class, args);

}

/

**

* 远程调用

*/

@Bean

public RestTemplate restTemplate() {

return new RestTemplate();

}

/

**

* feign的日志通过代码的方式(也可以通过yml配置文件的方式)

*/

@Bean

public Logger.Level feignLogger() {

return Logger.Level.FULL;

}

}

单个回滚方法:

/

**

* Hystrix实例:单个回滚

* @author Big.Hu

*/

@RestController

public class UserController {

/

**

* 熔断机制

* 异常后执行getFeignFallback()方法

*/

@HystrixCommand(fallbackMethod = "getFeignFallback")

@GetMapping("feign/{ id}")

public String getFeign(@PathVariable("id") int id) {

int i = 1 / 0; // 异常

return userFeign.getOrder1(id);

}

private String getFeignFallback(@PathVariable("id") int id) {

System.out.println("断路器生效。");

return "提示:网络繁忙,请稍候再试。。" + id;

}

}

访问请求:localhost:7001/feign/555。

断路器生效

控制台:

全局的回滚方法:

/

**

* Hystrix实例:全局回滚

* @author Big.Hu

*/

@RestController

@DefaultProperties(defaultFallback = "defaultFallback")

public class UserController {

@GetMapping("feign/{ id}")

public String getFeign(@PathVariable("id") int id) {

int i = 1 / 0; // 异常

return userFeign.getOrder1(id);

}

private String defaultFallback() {

System.out.println("全局断路器生效。");

return "提示:服务器繁忙,请稍候再试。。";

}

}

访问请求:localhost:7001/feign/555。

全局断路器生效

控制台:

控制台

云南idc服务商

分享到:

滇ICP备2023006006号-16