SpringCloud学习笔记(四):使用Hystrix实现熔断

SpringCloud学习笔记(四):使用Hystrix实现熔断

什么是熔断

在之前的代码中我们搭建了如下图所示的微服务结构,
微服务
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服务是否还可以被正常调用。
Cargo服务关闭
调用结果

从结果上可以看出来,由于APP-CARGO停机不再提供服务,APP-CARGO-LIST调用不到它所需要的服务了,但是通过Hystrix熔断,执行了对应的回调方法,保证了自身服务的运行状态。

现在,我们移除掉新加入的两个注解,再次启动APP-CARGO-LIST服务查看一下服务的状态。
服务雪崩
可以看到,由于APP-CARGO无法访问,导致了APP-CARGO-LIST无法正常工作,Hystrix的价值此时就体现了出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值