iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >Spring Cloud Feign怎么实现自动降级
  • 243
分享到

Spring Cloud Feign怎么实现自动降级

2024-04-02 19:04:59 243人浏览 独家记忆
摘要

这篇文章主要讲解了“spring cloud Feign怎么实现自动降级”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring Cloud Feign怎

这篇文章主要讲解了“spring cloud Feign怎么实现自动降级”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring Cloud Feign怎么实现自动降级”吧!

自动降级目的

在Spring Cloud 使用feign 的时候,需要明确指定fallback 策略,不然会提示错误。先来看默认的feign service 是要求怎么做的。feign service 定义一个 factory 和 fallback 的类

@FeignClient(value =ServiceNameConstants.UMPS_SERVICE, fallbackFactory =RemoteLogServiceFallbackFactory.class)

publicinterfaceRemoteLogService{}

但是我们大多数情况的feign 降级策略为了保证幂等都会很简单,输出错误日志即可。类似如下代码,在企业中开发非常不方便

@Slf4j

@Component

publicclassRemoteLogServiceFallbackImplimplementsRemoteLogService{

@Setter

privateThrowable cause;

@Override

public R<Boolean> saveLog(SysLog sysLog,Stringfrom){

log.error("feign 插入日志失败", cause);

returnnull;

}

}

自动降级效果

@FeignClient(value =ServiceNameConstants.UMPS_SERVICE)

publicinterfaceRemoteLogService{}

Feign Service 完成同样的降级错误输出

FeignClient 中无需定义无用的fallbackFactory

FallbackFactory 也无需注册到Spring 容器

代码变化,去掉FeignClient 指定的降级工厂

代码变化,删除降级相关的代码

核心源码

1. 注入我们个性化后的Feign

@Configuration

@ConditionalOnClass({HystrixCommand.class,HystrixFeign.class})

protectedstaticclasshystrixFeignConfiguration{

@Bean

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@ConditionalOnProperty("feign.hystrix.enabled")

publicFeign.Builder feignHystrixBuilder(FeignContext feignContext){

returnPigxHystrixFeign.builder(feignContext)

.decode404()

.errorDecoder(newPigxFeignErrorDecoder());

}

}

2. PigxHystrixFeign.target 方法是根据@FeignClient 注解生成代理类的过程,注意注释

@Override

public<T> T target(Target<T> target){

Class<T> targetType = target.type();

FeignClient feignClient =AnnotatedElementUtils.getMergedAnnotation(targetType,FeignClient.class);

String factoryName = feignClient.name();

SetterFactory setterFactoryBean =this.getOptional(factoryName, feignContext,SetterFactory.class);

if(setterFactoryBean !=null){

this.setterFactory(setterFactoryBean);

}

// 以下为获取降级策略代码,构建降级,这里去掉了降级非空的非空的校验

Class<?> fallback = feignClient.fallback();

if(fallback !=void.class){

return targetWithFallback(factoryName, feignContext, target,this, fallback);

}

Class<?> fallbackFactory = feignClient.fallbackFactory();

if(fallbackFactory !=void.class){

return targetWithFallbackFactory(factoryName, feignContext, target,this, fallbackFactory);

}

return build().newInstance(target);

}

3. 构建feign 客户端执行PigxHystrixInvocationHandler的增强

Feign build(@NullablefinalFallbackFactory<?> nullableFallbackFactory){

super.invocationHandlerFactory((target, dispatch)->

newPigxHystrixInvocationHandler(target, dispatch, setterFactory, nullableFallbackFactory));

super.contract(newHystrixDelegatinGContract(contract));

returnsuper.build();

}

4. PigxHystrixInvocationHandler.getFallback() 获取降级策略

@Override

@Nullable

@SuppressWarnings("unchecked")

protectedObject getFallback(){

// 如果 @FeignClient 没有配置降级策略,使用动态代理创建一个

if(fallbackFactory ==null){

fallback =PigxFeignFallbackFactory.INSTANCE.create(target.type(), getExecutionException());

}else{

// 如果 @FeignClient配置降级策略,使用配置的

fallback = fallbackFactory.create(getExecutionException());

}

}

5. PigxFeignFallbackFactory.create 动态代理逻辑

public T create(finalClass<?> type,finalThrowable cause){

return(T) FALLBACK_MAP.computeIfAbsent(type, key ->{

Enhancer enhancer =newEnhancer();

enhancer.setSuperclass(key);

enhancer.setCallback(newPigxFeignFallbackMethod(type, cause));

return enhancer.create();

});

}

6. PigxFeignFallbackMethod.intercept, 默认的降级逻辑,输出降级方法信息和错误信息,并且把错误格式

publicObject intercept(Object o,Method method,Object[] objects,MethodProxy methodProxy){

log.error("Fallback class:[{}] method:[{}] message:[{}]",

type.getName(), method.getName(), cause.getMessage());

if(R.class== method.getReturnType()){

final R result = cause instanceofPigxFeignException?

((PigxFeignException) cause).getResult(): R.builder()

.code(CommonConstants.FaiL)

.msg(cause.getMessage()).build();

return result;

}

returnnull;

}

感谢各位的阅读,以上就是“Spring Cloud Feign怎么实现自动降级”的内容了,经过本文的学习后,相信大家对Spring Cloud Feign怎么实现自动降级这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Spring Cloud Feign怎么实现自动降级

本文链接: https://www.lsjlt.com/news/93646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Cloud Feign怎么实现自动降级
    这篇文章主要讲解了“Spring Cloud Feign怎么实现自动降级”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Feign怎...
    99+
    2024-04-02
  • Spring Cloud Feign怎么实现动态URL
    这篇“Spring Cloud Feign怎么实现动态URL”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-06-29
  • Spring Cloud中Feign怎么使用
    本篇内容主要讲解“Spring Cloud中Feign怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Feign怎么使用”吧!创建公共接口首先我们来创建一个普通的...
    99+
    2023-06-19
  • Spring Cloud中怎么配置Feign
    这期内容当中小编将会给大家带来有关Spring Cloud中怎么配置Feign,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Ribbon配置ribbon的配置其实非常简单,直接在application.p...
    99+
    2023-06-19
  • 怎么用Spring Cloud Feign实现文件上传下载
    这篇“怎么用Spring Cloud Feign实现文件上传下载”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-06-29
  • Spring Cloud中Feign的实现原理是什么
    本篇内容主要讲解“Spring Cloud中Feign的实现原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Feign的实现原理是什么”吧!目录一、什么是Fei...
    99+
    2023-06-20
  • Spring Cloud Feign内部实现代码细节
    1. 概述 Feign用于服务间调用,它的内部实现是一个包含Ribbon(负载均衡)的**JDK-HttpURLConnection(Http)**调用。虽然调用形式是类似于RPC,...
    99+
    2024-04-02
  • Spring Cloud中Feign怎么自定义配置与使用
    这篇文章主要介绍了Spring Cloud中Feign怎么自定义配置与使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Cloud中Feign怎么自定义配置与使用文章都会有所收...
    99+
    2023-07-02
  • Spring Cloud如何实现服务消费者Feign
    小编给大家分享一下Spring Cloud如何实现服务消费者Feign,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Feign简介Feign是一个声明式的伪H...
    99+
    2023-06-19
  • Spring Cloud中如何使用Feign 实现负载均衡
    Spring Cloud中如何使用Feign 实现负载均衡,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面来介绍一下使用 Feign 负载均衡。在介绍之前,我们先来对 Fei...
    99+
    2023-06-04
  • spring cloud oauth2 feign遇到的坑怎么解决
    本篇内容主要讲解“spring cloud oauth2 feign遇到的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud...
    99+
    2023-06-29
  • spring cloud config和bus组件怎么实现自动刷新功能
    本篇内容主要讲解“spring cloud config和bus组件怎么实现自动刷新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring cloud config和bus组件怎么实现自...
    99+
    2023-06-25
  • Spring Cloud中怎么使用 Feign上传文件
    Spring Cloud中怎么使用 Feign上传文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。加依赖<dependency> <groupId...
    99+
    2023-05-30
    springcloud feign
  • Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断
    这篇文章主要讲解了“Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Alib...
    99+
    2023-06-14
  • spring cloud config和bus组件实现自动刷新功能
    1.启动RabbitMQ 2.修改config服务端 依赖:(boot和cloud版本不要太高,不然刷新配置的请求不能用) <dependencies> &l...
    99+
    2024-04-02
  • spring怎么实现自动配置
    Spring通过@EnableAutoConfiguration注解实现自动配置。@EnableAutoConfiguration注...
    99+
    2023-08-23
    spring
  • Spring Cloud gateway自定义错误处理Handler怎么实现
    本文小编为大家详细介绍“Spring Cloud gateway自定义错误处理Handler怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Cloud gateway自定义错误处...
    99+
    2023-07-05
  • Spring Cloud OAuth2怎么实现自定义token返回格式
    这篇“Spring Cloud OAuth2怎么实现自定义token返回格式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我...
    99+
    2023-07-02
  • Spring Cloud中的动态路由怎么利用 Zuul实现
    今天就跟大家聊聊有关Spring Cloud中的动态路由怎么利用 Zuul实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Zuul 是提供动态路由,监控,弹性,安全等的边缘服务。Z...
    99+
    2023-05-31
    springcloud zuul 动态路由
  • Spring Cloud Zuul自定义过滤器的实现
    构建Zuul自定义过滤器,限制ip频繁请求 自定义zuul过滤器其实很简单 1. 首先pom文件得先引入zuul依赖 <dependency> <gr...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作