【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级

这篇具有很好参考价值的文章主要介绍了【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenFeign可以与Hystrix和Sentinel结合使用,实现降级和熔断。

OpenFeign与Hystrix结合使用

使用OpenFeign需要引入OpenFeign的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

spring-cloud-starter-openfeign引入的依赖如下:

[INFO] +- org.springframework.cloud:spring-cloud-starter-openfeign:jar:2.2.6.RELEASE:compile
[INFO] |  +- org.springframework.cloud:spring-cloud-openfeign-core:jar:2.2.6.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-aop:jar:2.3.2.RELEASE:compile
[INFO] |  |  |  \- org.aspectj:aspectjweaver:jar:1.9.6:compile
[INFO] |  |  \- io.github.openfeign.form:feign-form-spring:jar:3.8.0:compile
[INFO] |  |     +- io.github.openfeign.form:feign-form:jar:3.8.0:compile
[INFO] |  |     \- commons-fileupload:commons-fileupload:jar:1.4:compile
[INFO] |  +- io.github.openfeign:feign-core:jar:10.10.1:compile
[INFO] |  +- io.github.openfeign:feign-slf4j:jar:10.10.1:compile
[INFO] |  \- io.github.openfeign:feign-hystrix:jar:10.10.1:compile
[INFO] |     +- com.netflix.archaius:archaius-core:jar:0.7.6:compile
[INFO] |     \- com.netflix.hystrix:hystrix-core:jar:1.5.18:compile
[INFO] |        \- org.hdrhistogram:HdrHistogram:jar:2.1.9:compile

默认已经自动引入了hystrix的依赖,不再需要单独再引入hystrix了。

使用fallback实现降级方法

降级方法的类需要实现FeignClient的接口,同时这个类需要注入到Spring容器中:

package com.morris.user.client;

import com.morris.user.entity.Order;
import com.morris.user.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class OrderFeignService implements OrderClient {

    @Override
    public List<Order> findOrderByUserId(Long userId) {
        log.error("findOrderByUserIdFall error {}", userId);
        return Collections.emptyList();
    }
}

@FeignClient注解中指定fallback属性:

@FeignClient(value = "order-service", path = "/order", fallback = OrderFeignService.class)
public interface OrderClient {
... ...

在配置文件中开启hystrix:

feign:
  hystrix:
    enabled: true

使用fallbackFactory实现降级方法

使用fallback实现降级方法无法获取到异常信息,而使用fallbackFactory实现降级方法可以获取到异常信息。

降级方法的工厂类需要实现FallbackFactory的接口,同时这个类需要注入到Spring容器中:

package com.morris.user.client;

import com.morris.user.entity.Order;
import com.morris.user.entity.User;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class OrderFeignFactory implements FallbackFactory {

    @Override
    public Object create(Throwable throwable) {
        log.error("OrderFeignFactory ", throwable);
        return new OrderClient() {
            @Override
            public List<Order> findOrderByUserId(Long userId) {
                return Collections.emptyList();
            }
        }
    }
}

@FeignClient注解中指定fallback属性:

@FeignClient(value = "order-service", path = "/order", fallbackFactory = OrderFeignFactory.class)
public interface OrderClient {
... ...

在配置文件中开启hystrix:

feign:
  hystrix:
    enabled: true

Hystrix熔断的使用

Hystrix熔断的功能是默认开启的,commandKey为类名#方法名(参数类型),例如上面的方法对应的commandKey为OrderClient#findOrderByUserId(Long)

可以在配置文件中根据commandKey对熔断的一些参数进行设置:

hystrix:
  command:
    OrderClient#findOrderByUserId(Long):
      circuitBreaker:
        enabled: false
        requestVolumeThreshold: 2
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            #设置请求超时时间,默认1秒,超过指定的时间后,触发服务熔断
            timeoutInMilliseconds: 10000

OpenFeign与Sentinel结合使用

引入Sentinel的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

并开启Sentinel的熔断降级功能:

spring:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080

feign:
  sentinel:
    enabled: true

降级的使用还是跟前面的一样,使用fallback和fallbackFactory实现。

Sentinel熔断的使用

虽然熔断的功能开启了,但是需要配置熔断规则,没有配置规则是不会触发熔断的。

配置如下降级规则测试熔断:

[
     {
          "count": 0.5,
          "grade": 1,
          "limitApp": "default",
          "minRequestAmount": 5,
          "resource": "GET:http://order-service/order/findOrderByUserId",
          "slowRatioThreshold": 1,
          "statIntervalMs": 5000,
          "timeWindow": 5000
     }
]

自定义全局异常

OpenFeign可以配置一个全局异常,来对请求过程中的其他异常进行包装,这样在fallbackFactory中获取到的是自定义的全局异常,而不是原始的异常。文章来源地址https://www.toymoban.com/news/detail-678698.html

package com.morris.user.config;

import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import feign.form.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.io.Reader;
import java.text.MessageFormat;

@Configuration
@Slf4j
public class FeignErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        Reader reader = null;
        try {
            reader = response.body().asReader(CharsetUtil.UTF_8);
            String errMsg = Util.toString(reader);
            log.error("FeignErrorDecoder {}", errMsg);
            return new RuntimeException(errMsg);
        } catch (IOException e) {
            return new RuntimeException(MessageFormat.format("自定义Feign错误信息出错:{0}", e.getMessage()));
        } finally {
            if (null != reader) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

到了这里,关于【OpenFeign】OpenFeign结合Hystrix和Sentinel实现熔断降级的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Springcloud】Sentinel熔断和降级

    服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、

    2024年02月09日
    浏览(47)
  • springcloud alibaba sentinel熔断降级

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从 流量控制、熔断降级、系统负载保护 等多个维度保护服务的稳定性。 sentinel相当于hystrix的升级版,加入了web界面,能够实时在线的改变流量策略。 Sentinel 分为两个部分: 核心库(J

    2024年01月23日
    浏览(55)
  • 熔断、限流、降级 —— SpringCloud Alibaba Sentinel

    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性 Sentinel 提供了两个服务组件: Sentinel 用来实现微服务系统中服务熔断

    2024年02月08日
    浏览(71)
  • SpringCloud.04.熔断器Hystrix( Spring Cloud Alibaba 熔断(Sentinel))

    目录 熔断器概述 使用Sentinel工具 什么是Sentinel 微服务集成Sentinel 配置provider文件,在里面加入有关控制台的配置 实现一个接口的限流 基本概念 重要功能 Sentinel规则 流控规则 简单配置 配置流控模式 配置流控效果 降级规则 @SentinelResource的使用 Feign整合Sentinel 由于Hystrix已经停

    2024年01月19日
    浏览(44)
  • SpringCloud-Hystrix服务熔断与降级工作原理&源码 | 京东物流技术团队

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这

    2024年02月14日
    浏览(39)
  • 微服务springcloud 06.feign框架,配合ribbon 负载均衡和重试,配合hystrix 降级,监控和熔断测试

    feign是ribbon +hystrix 的整合 01.新建 sp09-feign 项目 第一步: 第二步:选择依赖: pom.xml 需要添加 sp01-commons 依赖: 第三步:修改sp09-feign项目的application.yml 第四步:sp09-feign的主程序添加 @EnableDiscoveryClient 和 @EnableFeignClients 02.feign 声明式客户端 第一步:声明三个代理接口 这里的

    2024年02月10日
    浏览(56)
  • SpringCloud学习6(Spring Cloud Alibaba)断路器Sentinel熔断降级

    SpringCloud、SpringCloudAlibaba、SpringBoot版本选择。为了避免各种千奇百怪的bug,我们还是采用官方推荐的毕业版本。 修改tomcat配置最大线程数 引入测试依赖 编写测试代码 这里同时我们在浏览器去请求该地址,响应会变得很慢 测试结论:此时会发现由于thread接口囤积大量请求,

    2023年04月08日
    浏览(51)
  • Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月11日
    浏览(47)
  • 微服务:Springboot集成Hystrix实现熔断、降级、隔离

    在分布式微服务的项目中,常常会有多个服务复用,产生多个服务调用的情况。比如A服务调用B服务,B服务调用C服务。服务调用链路长了必然会增加服务超时的概率,服务的超时阻塞会一直占用线程资源,大量的阻塞会直接消耗完服务线程,严重情况下会导致服务直接宕机从

    2024年02月12日
    浏览(47)
  • 【从0到1设计一个网关】基于Hystrix实现熔断降级

    上文我们已经成功实现了请求重试与请求限流,接下来我们开始实现熔断与服务降级。 熔断与服务降级,在SpringCloud中设计到的就是我们的hystrix,这里我们也将会考虑配合hystrix来实现熔断与服务降级。 如果不了解hystix的可以先进行一下了解。 由于这里我是用的是基于hystr

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包