掘金日新计划 · 8 月更文挑战第21天--断路器Hystrix实践

50 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

微服务架构中多层服务相互调用,如果一层发生故障,可能会导致一层服务或者多层服务故障,导致整个系统故障,这就是服务雪崩效应,熔断器就是为了解决这种问题。
熔断器:NetFlix的来源熔断器,通过Hystrix就可以实现资源隔离 限流、超时设计或者服务降级等措施,和监控功能。
服务降级:当后台微服务不可用或者访问超时,将其中一个服务通知返回默认信息,执行了降级代码,比如就是默认情况下后台微服务10秒接受的请求达到20个,并且有一半请求发生了请求失败,此时hystrix打开断路器,让所有请求执行降级代码

1.在good-price中引入断路器依赖(依赖要下载一下,会比较慢,耐心等一会儿)

image.png

<!--        1.引入断路器依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

2.在good-price服务的 /ressource/application.properties配置文件中开启断路器

image.png

feign.hystrix.enabled=true

3.在GoodPriceApplication中声明注解断路器

image.png

@EnableCircuitBreaker

4.在GoodListClient客户端,声明断路器异常调用

image.png

@FeignClient(value = "good-list",fallback = GoodListClientHystrix.class)
@Primary
public interface GoodListClient {
    @GetMapping("/goods")
     List<Good> goodList();
}

代码说明:
@Primary表示要引用哪个外部服务,如果没有使用@Primary,程序也不会出错,在运行的时候,程序知道如何去调用哪个外部服务 image.png

5.定义断路器GoodListClientHystrix类,实现GoodListClient

package com.imooc.good.client;

import com.imooc.good.entity.Good;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
//断路器实现类
@Component
public class GoodListClientHystrix implements GoodListClient {
    @Override
    public List<Good> goodList() {
       List<Good> defaultGoods = new ArrayList<>();
       Good good = new Good();
       good.setId(1);
       good.setGoodId(1);
       good.setGoodName("默认课程");
       good.setValid(1);
       defaultGoods.add(good);
        return defaultGoods;
    }
}

代码说明:
为什么要实现GoodListClient的goodList方法呢,引入断路器的作用是在服务不可调用时候,调用断路器实现类的返回值,防止外部一致在请求不可使用的服务,导致服务器负载过大
@Component表示组件

6.启动三个服务

image.png 这时候我们访问一下:http://localhost:8083/goodsInPrice image.png 发现正常返回good-list接口数据

7.停止good-list服务

image.png 这时候我们看到Eureka Server只剩下一个good-price服务了 image.png 再次访问http://localhost:8083/goodsInPrice image.png
看到这个界面,说明我的断路器已经正常调用了。