什么是熔断
在之前的代码中我们搭建了如下图所示的微服务结构,
APP-CARGO-LIST功能的实现需要依赖APP-CARGO服务提供的货物数据,若APP-CARGO服务宕机了,会级联造成APP-CARGO-LIST服务不可用。在规模更大的系统里面,这样的调用关系可能存在多个层级,那么若底层或中间某层的服务出现了问题,会使得错误由出现问题的位置一直向上蔓延,导致整个系统不可用,这一现象被称为服务雪崩。
为了防止服务雪崩带来的危害,我们需要一个工具来检测需要访问服务是否可用,如果该服务不可用就将该服务熔断并降级,通过别的方式达成服务或者直接返回一个标识着服务不可用的JSON。这样可以确保上层的服务能接受到可用的数据,当一个服务不可用的时候就不会影响到上层的服务了。在Spring Cloud中,Netflix Hystrix组件就是用来实现这一目标的。
实现
如果APP-CARGO服务发生错误,那么将影响到APP-CARGO-LIST服务,因此我们要在APP-CARGO-LIST服务的模块代码中实现熔断,以达到容错的目的。
首先,需要在cargoAccesser(APP-CARGO-LIST服务)模块的pom.xml文件下新增一个依赖
<!--熔断依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然后在需要进行容错的方法上加上@HystrixCommand,并给其指定一个容错回调方法,也就是说当该方法调用的服务不可用时,将会执行注解中指定的回调方法来完成服务降级。
在我们的项目中通过CargoService中的queryCargoById调用了Cargo服务的接口,因此我们需要在这一个方法上面加上注解,并且指定回调方法的方法名为cargoFallBack,同时在该类中创建对应的回调方法,回调方法的返回类型和参数列表必须与原方法相同。CargoService完整代码如下
package service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import entity.Cargo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class CargoService {
@Autowired
private RestTemplate restTemplate;//SpringBoot对Rest请求做了封装,可以通过模板快速配置请求信息
@HystrixCommand(fallbackMethod = "cargoFallBack")
public Cargo queryCargoById(Long id) {
//需要在RestTemplate对象上加上@LoadBalanced注解
String cargoUrl = "http://app-cargo/cargo/{id}";
Cargo cargo = this.restTemplate.getForObject(cargoUrl,Cargo.class,id);
System.out.println("CargoService is invoked,result:"+cargo);
return cargo;
}
public Cargo cargoFallBack(Long id){
return new Cargo(id,"请求不到name","请求不到price");
}
}
然后我们在这个模块的启动类上加上@EnableHystrix注解,表示该项目启动了Hystrix容错,然后就可以启动模块了。启动完成后我们访问APP-CARGO-LIST的服务,可以查看到如下的正常结果
现在我们关闭APP-CARGO服务,然后再查看APP-CARGO-LIST服务是否还可以被正常调用。
从结果上可以看出来,由于APP-CARGO停机不再提供服务,APP-CARGO-LIST调用不到它所需要的服务了,但是通过Hystrix熔断,执行了对应的回调方法,保证了自身服务的运行状态。
现在,我们移除掉新加入的两个注解,再次启动APP-CARGO-LIST服务查看一下服务的状态。
可以看到,由于APP-CARGO无法访问,导致了APP-CARGO-LIST无法正常工作,Hystrix的价值此时就体现了出来。