社区编辑申请
注册/登录
SpringCloud系列之Hystrix熔断器
开发 架构
熔断器本身是一个开关设置,当某个服务单元发生故障之后,通过熔断器的故障监控(类似保险丝),向调用方返回一个服务预期的,可处理的备选相应(fallBack)。

什么是熔断器?

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

Hystrix的目标

  1. 通过第三方客户端访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
  2. 在复杂的分布式系统中防止级联故障。
  3. 快速失败,快速恢复。
  4. 回退,尽可能优雅地降级。
  5. 启用实时监控、报警和操作控制。

Hystrix设计原理

  1. 防止任何单个依赖项耗尽整个容器用户线程
  2. 甩掉包袱,快速失败而不是排队。
  3. 在任何可行的地方提供回退,以保护用户不受失败的影响。
  4. 使用隔离技术来限制任何一个依赖项的影响。
  5. 通过实时的度量、监视和报警来优化发现时间。
  6. 通过配置的低延迟传播来优化恢复时间。
  7. 支持对Hystrix的大多数方面的动态属性更改,允许使用低延迟反馈循环进行实时操作修改。
  8. 避免在整个客户端执行中出现故障,而不仅仅是在网络流量中。

Hystrix断路器Demo

引入jar包;

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</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。

全局断路器生效

控制台:

控制台

责任编辑:姜华
相关推荐

2022-04-06 08:29:26

Kafka通信中间件

2022-04-01 10:08:21

SQL 优化MySQL数据库

2022-05-16 13:37:12

Sysrv僵尸网络微软

2022-04-11 07:34:46

OAuth2UAA节点

2022-05-03 22:25:57

Python浏览器语言

2022-04-21 10:01:48

VMware

2022-04-30 08:43:52

Spring模块化框架

2022-04-09 14:45:02

2022-05-12 07:37:51

单点登录微服务开源

2022-02-10 15:32:20

2022-04-26 08:41:54

JDK动态代理方法

2022-04-28 08:05:05

2022-05-16 10:49:28

网络协议数据

2022-02-18 09:30:48

2022-05-16 08:22:11

2022-04-13 08:00:00

Hilla开发Java

2022-05-16 10:41:40

GNOME 42Console控制台

2022-05-09 11:19:12

CSS函数开源

2022-04-30 09:09:55

SecureFXSecureCRT

2022-05-16 23:13:38

边缘计算数字化转型数据

同话题下的热门内容

架构师必备:多维度查询的优秀实践快手一面:讲一讲 Hadoop、Hive、Spark 之间的关系?分布式系统之Sentinel介绍与使用图解 Kafka 生产者元数据拉取管理全流程链路追踪:Sleuth整合ZipKinSOA中的软件架构设计及软硬件解耦方法论链路追踪:项目整合Sleuth实现链路追踪阿里10年沉淀|那些技术实战中的架构设计方法

编辑推荐

终于有人把Elasticsearch原理讲透了!花了一个星期,我终于把RPC框架整明白了!拜托!面试不要再问我Spring Cloud底层原理陌陌基于K8s和Docker容器管理平台的架构实践收藏 | 第一次有人把“分布式事务”讲的这么简单明了
我收藏的内容
点赞
收藏

51CTO技术栈公众号