SpringCloud配置hystrix熔断机制

3 篇文章 0 订阅
1 篇文章 0 订阅

hystrix是Netflix提供的一个开源组件,它可以在分布式系统起到一个保护作用,比如当访问量过大,服务宕机等情况。
了解hystrix需要了解什么是服务雪崩,雪崩的造成原因,以及hystrix保护系统的原理和措施:服务熔断,服务降级,服务隔离,缓存和合并请求等。

1,服务雪崩
如果有大量请求超过系统承受,被黑客攻击或者网络延迟,服务异常等情况造成线程阻塞(一个线程池),一个接口大量的占用线程,会使得其他接口访问被等待,随着访问增加,资源又得不到释放,任务越积越多,造成整个系统的崩溃。常见场景如秒杀,抢票等。

2,服务熔断
像家庭中的电路保险丝一样,当电压过大,及时断电来保护我们的线路,防止电线损坏和火灾。熔断机制也是一样,当请求量过大或者接口错误造成线程阻塞,系统忙不过来的时候,及时返回错误,防止系统崩溃,它利用服务降级来完成这一动作,熔断机制还能自动检测接口状态,接口恢复后打开“电路”,使接口正常访问。

3,服务降级
服务降级利用fallback实现,例如在fegin中接口实现fallback指定的错误请求方法,使得这次请求不进入正常系统的处理逻辑,而去执行指定的fallback方法,返回error操作,就比如常见的错误友好页面,让它不去卡你的系统。

4,服务隔离
不想因为一个接口造成其他接口的阻塞,我们可以对一些比较特殊的接口进行服务隔离,比如秒杀接口,单独创建一个线程池,它自己的请求不占用其他接口的资源,即使挂掉,也不会影响其他接口。隔离太多也会耗费cpu更多资源,所以应该更可能的用于一些高并发的接口。

5,缓存
就像redis缓存一样,已经被请求过的缓存后的数据,比如相同接口中参数也一样,就没有必要再去走一遍程序,直接返回请求结果就好了。

6,请求合并
比如用户一次操作产生了多次请求,每次请求都有一次数据查询,这样可以把这些请求“合并”,对数据库进行一次调用,比每次请求都要查询一次数据省了不少资源。

这次笔记先记录熔断机制:前提先配置好eureka和ribbon,fegin,项目结构如下:
在这里插入图片描述
用到的有demo1:注册中心,demo2,demo3:测试客户端,ribbon和fegin:已经实现客户端负载,前两篇有实现步骤。

一,Ribbon实现hystrix熔断

pom.xml引入jar包,老版本artifactId没有拼“netflix”,新版的加上了,特别注意。

      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

ribbon启动类添加@EnableCircuitBreaker注解,表示打开断路器功能
在这里插入图片描述
RibbonService中具体接口处添加@HystrixCommand注解,并指定错误执行方法,如图所示:指定方法名为:helloback;并添加hellobak方法,返回error。
在这里插入图片描述
启动demo1,ribbon,demo2,demo3测试:
访问ribbon http://localhost:9999/hello,刷新页面,发现轮询了demo2,demo3接口返回数据
关闭demo3,
在这里插入图片描述
发现demo2正常返回,demo3接口因为异常,断路器直接返回了error;再继续多次刷新,发现error数据已经不反回了,说明断路器已经跳过了demo3接口。
同理,再次启动demo3,发现demo2,demo3接口再次交替返回数据,一个简单的断路器就完成了。
有条件可以试试高并发测试,设置超时时间等方法查看结果。

二,Fegin实现hystrix熔断

fegin中包含ribbon+hystrix,所以引入了fegin相关依赖后就不用再引hystrix依赖。
要在fegin配置文件中打开hystrix开关
写入 feign.hystrix.enabled=true即可,如图所示:
在这里插入图片描述
在fegin接口service中添加fallbak指定类,这个类是当接口出现错误后执行的方法,所以这个类需要实现fegin的service
在这里插入图片描述
创建类FeginClientError并实现FeignClients接口,添加@component的注解成为Controller使用

package com.example.fegin;

import com.example.fegin.service.FeignClients;
import org.springframework.stereotype.Component;

@Component
public class FeginClientError implements FeignClients {

    @Override
    public String hello() {
        return "error";
    }

    @Override
    public String hello(String name) {
        return "error";
    }
}

分别启动demo1,fegin,demo2,demo3测试,测试结果和ribbon测试结果一样,说明配置成功。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值