服务发生故障在所难免,当其他服务去调用故障服务时就会调不到,如果是底层基础服务发生故障的话,更是会导致级联故障,造成雪崩效应,造成整个系统的服务不可用。

针对这个问题,我们就需要对服务接口做错误处理,一旦发现无法访问服务,则立即返回并报错,然后捕捉到这个异常以可读化字符串返回前端。

因此,我们需要利用 Hystrix 组件,当特定的服务不可用达到一个阈值(Hystrix 默认5秒20次),将打开熔断器,避免发生连锁反应。

在原有代码的基础上进行修改:


1. 因为熔断只作用在服务调用这一端,因此只需要修改服务消费者即 spring-cloud-consumer 模块,而服务调用是用 feign 进行远程调用,feign 自带熔断器,只是是默认关闭的,因此需要在 application.properties 中将熔断器打开:
feign.hystrix.enabled=true

2. 新建一个 HelloRemoteHystrix 类实现 HelloRemote 接口:
@Component
public class HelloRemoteHystrix  implements HelloRemote{

    @Override
    public String hello(String name) {
        return "hello" + name + ",this message send failed";
    }
}

3. 在 HelloRemote 接口的 @FeignClient 注解中添加 fallback 降级操作:
@FeignClient(name = "spring-cloud-producer",fallback = HelloRemoteHystrix.class)
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    String hello(@RequestParam String name);
}

测试:

依次启动注册中心,服务提供者,服务消费者。

访问 http://localhost:9001/hello/neo 返回 hello neo,this is first message

手动停掉服务提供者,再次访问,返回 hello neo,this message send failed