SpringCloud 微服务架构五大核心组件(三):Hystrix 断路器

chan 作者
阅读 6351 喜欢 0

前言

当服务规模足够大的时候,会出现多个服务之间调用的情况
这样会产生一种问题,即某个服务不可用的时候,调用方线程就会阻塞在这个不可用的服务上,不断的重试
断路器就像一把刀子,可以割断一颗树上坏掉的分支,起到断路的作用

Hystrix Fallback 服务降级

第一步
在消费者中引入依赖:

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

第二步
启动类添加注解:

@EnableHystrix

// 此注解同时开启熔断功能
@EnableCircuitBreaker

第三步
为主方法添加 fallback 方法:

/**
 * 主方法
 */
@ResponseBody
@RequestMapping(value = "product/{id}")
@HystrixCommand(fallbackMethod = "fallback")
public Product getById(@PathVariable Integer id) {
    return productClient.getById(id);
}

/**
 * fallback 方法
 */
public Product fallback(@PathVariable Integer id) {
    Product product = new Product();
    product.setPremark("no this database in mysql !!");
    return product;
}

测试
正常服务:

关闭服务提供者:

Hystrix Fallback 基于 Feign

第一步
feign 已经集成了 hystrix ,因此无需导入依赖,在 yml 中配置即可

feign:
  hystrix:
    enabled: true

第二步
创建一个类实现 FallbackFactory,加入 Spring ioc 容器,重写 create 方法,并返回 feign 服务端接口。

@Component
public class ProductFallback implements FallbackFactory {
    @Override
    public Object create(Throwable throwable) {
        return new ProductClient() {
            @Override
            public Product getById(Integer id) {
                return new Product(1, "Hystrix",null , "", 0, "no this database in MySql", 0);
            }
        };
    }
}

第三步
feign 服务端接口的方法的注解上增加 fallbackFactory

@FeignClient(value = "product", fallbackFactory = ProductFallback.class)
public interface ProductClient {
    @PostMapping(value = "getById")
    Product getById(@RequestParam Integer id);
}

Hystrix 的熔断机制

熔断其实是在降级的基础上引入了重试的机制。当某个时间内失败的次数达到了多少次就会开启断路器 OPEN ,触发熔断机制。这时所有的请求将会直接返回 fallback,默认5秒后,断路器为半开状态 HALF-OPEN ,这是会判断请求是否成功,成功则关闭断路器 CLOSED,否则继续开启。

启动类添加注解即可开启熔断机制

@EnableCircuitBreaker

Hystrix Dashboard 可视化实时监控

第一步
在消费者中引入依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

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

第二步
启动类添加注解:

@EnableHystrixDashboard

第三步
在2.x之前的版本中,会自动注入该Servlet的,但是在2.x之后的版本,没有自动注册该Servlet。因此需要我们手动的注册该 Servlet 到容器中:

/**
 * 配置Hystrix.stream的servlet
 */
@Bean
public ServletRegistrationBean registrationBean() {
    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
    registrationBean.setLoadOnStartup(1);
    registrationBean.addUrlMappings("/hystrix.stream");
    registrationBean.setName("HystrixMetricsStreamServlet");
    return registrationBean;
}

测试

输入:http://localhost:8080/hystrix 访问主界面

填写监控数据 http://localhost:8080/hystrix.stream 进入可视化监控界面

全部评论0