SpringCloud05之Hystrix熔断器(基于IDEA)

本文介绍了如何使用Hystrix熔断器防止微服务中的服务雪崩,通过实例展示了在Spring Cloud项目中如何配置和启用Hystrix。当服务调用不可用达到阈值时,熔断器开启,执行预设的fallback方法,以保障系统的稳定。
摘要由CSDN通过智能技术生成

上一期博客我们介绍了如何使用Fegin实现服务的负载均衡,博客链接为https://blog.csdn.net/chenpeixing361/article/details/95616890。这一次我们介绍如何用Hystrix熔断器防止服务雪崩的情况发生。

首先介绍一下什么是服务雪崩效应,为了保证微服务其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩” 效应。

为了解决这个问题,业界提出了熔断器模型。Netflix 开源了 Hystrix 组件,实现了熔断器模式,Spring Cloud 对这一组件进行了整合。较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystrix 是 5秒20次) 熔断器将会被打开熔断器打开后,为了避免连锁故障,通过fallback方法可以直接返回一个固定值。

接下来我们以实际的例子来展示熔断器的作用。我们在之前的项目里进行修改,首先是Ribbon中添加熔断器,我们在pom.xml中添加如下代码:

<!-- 添加熔断器hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后我们在Application启动类中添加@EnableHystrix注解,表明开启熔断器应用,代码如下:

package com.chen.hello.spring.cloud.web.admin.ribbon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;

//开启熔断器
@EnableHystrix
@SpringBootApplication
@EnableDiscoveryClient
public class WebAdminRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebAdminRibbonApplication.class,args);
    }
}

接着我们在Service中对其中的方法添加@HystrixCommand注解并指定fallbackMethod熔断方法,当然我们需要编写熔断方法hiError,完整代码如下:

package com.chen.hello.spring.cloud.web.admin.ribbon.service;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class AdminService {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "hiError")
    public String sayHi(String message) {
        return restTemplate.getForObject("http://hello-spring-cloud-service-admin/hi?message="+message,String.class);
    }

    //熔断方法
    public String hiError(String message) {
        return String.format("Hi,your message is: %s but request bad.",message);
    }
}

上述代码写好之后,接下来我们便进行测试了,我们开启8761-8764四个端口,结果和之前Ribbon测试的结果一样,然后关闭8762和8763两个服务提供端口,然后输入网址 http://localhost:8764/hi?message=Ribbon,运行结果如图所示:

接下来我们把熔断器加到Fegin中进行测试,其中Feign 是自带熔断器的,但默认是关闭的。需要在配置文件中配置打开它,所以我们在application.yml文件中添加如下配置信息:

feign:
  hystrix:
    enabled: true

接着我们创建熔断器的类AdminServiceHystrix,我们实现Service接口,其代码如下:

package com.chen.hello.spring.cloud.web.admin.fegin.hystrix;

import com.chen.hello.spring.cloud.web.admin.fegin.service.AdminService;
import org.springframework.stereotype.Component;

//熔断实现类
@Component
public class AdminServiceHystrix implements AdminService {

    @Override
    public String sayHi(String message) {
        return String.format("Hi,your message is: %s but request bad.",message);
    }
}

然后我们需要在接口中添加fallback属性并指定接口实现类,完整代码如下:

package com.chen.hello.spring.cloud.web.admin.fegin.service;

import com.chen.hello.spring.cloud.web.admin.fegin.hystrix.AdminServiceHystrix;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

//fallback参数添加熔断器类
@FeignClient(value = "hello-spring-cloud-service-admin",fallback = AdminServiceHystrix.class)
public interface AdminService {

    @GetMapping(value = "/hi")
    public String sayHi(@RequestParam("message") String message);

}

好了,接下来我们便进行测试了,开启8765端口,当然8762和8763端口依然是处于关闭的状态,我们输入网址http://localhost:8765/hi?message=HelloFeign,运行截图如下:

好了,这次的熔断器Hystrix在Ribbon和Feign中的简单使用就讲解到这里了,我们下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值