范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringCloud升级之路2020。0。x版30。FeignClient实现重试

  本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 需要重试的场景
  微服务系统中,会遇到 在线发布 ,一般的发布更新策略是:启动一个新的,启动成功之后,关闭一个旧的,直到所有的旧的都被关闭。Spring Boot 具有优雅关闭的功能,可以保证请求处理完再关闭,同时会拒绝新的请求。对于这些拒绝的请求,为了保证用户体验不受影响,是需要重试的。
  云上部署的微服务,对于同一个服务,同一个请求,很可能不会所有实例都同时异常,例如: Kubernetes 集群部署的实例,可能同一个虚拟机 Node 在闲时部署了多个不同微服务实例,当压力变大时,就需要迁移和扩容。这时候由于不同的微服务压力不同,当时处于哪一个 Node 也说不定,有的可能处于压力大的,有的可能处于压力小的。对于同一个微服务,可能并不会所有实例位于的 Node 压力都大。 云上部署一般会跨可用区部署,如果有一个可用区异常,另一个可用区还可以继续提供服务。 某个业务触发了 Bug,导致实例一直在 GC,但是这种请求一般很不常见,不会发到所有实例上。
  这时候,就需要我们对请求进行无感知的重试。 重试需要考虑的问题重试需要重试与 之前不同的实例 ,甚至是不处于同一个虚拟机 Node 的实例,这个主要通过 LoadBalancer 实现,可以参考之前的 LoadBalancer 部分。后面的文章,我们还会改进 LoadBalancer 重试需要考虑到底什么请求能重试,以及什么异常能重试: 假设我们有查询接口,和没有做幂等性的扣款接口,那么很直观的就能感觉出 查询接口是可以重试的,没有做幂等性的扣款接口是不能重试的 。 业务上不能重试的接口,对于特殊的异常(其实是表示请求并没有发出去的异常),我们是可以重试的。虽然是没有做幂等性的扣款接口,但是如果抛出的是原因是 Connect Timeout 的 IOException, 这样的异常代表请求还没有发出去,是可以重试的 。 重试策略 :重试几次,重试间隔。类比多处理器编程模式中的 Busy Spin 策略会造成很大的总线通量从而降低性能这个现象,如果失败立刻重试,那么在某一个实例异常导致超时的时候,会在同一时间有很多请求重试到其他实例。最好加上一定延迟。 使用 resilience4j 实现 FeignClient 重试
  FeignClient 本身带重试,但是重试策略相对比较简单,同时我们还想使用断路器以及限流器还有线程隔离,resilience4j 就包含这些组件。 原理简介
  Resilience4J 提供了 Retryer 重试器,官方文档地址:https://resilience4j.readme.io/docs/retry
  从配置上就能理解其中的原理,但是 官方文档配置并不全面 ,如果想看所有的配置,最好还是通过源码:
  RetryConfigurationProperties.java //重试间隔,默认 500ms @Nullable private Duration waitDuration;  //重试间隔时间函数,和 waitDuration 只能设置一个,默认就是 waitDuration @Nullable private Class<? extends IntervalBiFunction> intervalBiFunction;  //最大重试次数,包括本身那次调用 @Nullable private Integer maxAttempts;  //通过抛出的异常判断是否重试,默认是只要有异常就会重试 @Nullable private Class<? extends Predicate> retryExceptionPredicate;  //通过结果判断是否重试,默认是只要获取到结果就不重试 @Nullable private Class<? extends Predicate> resultPredicate;  //配置抛出这些异常以及子类则会重试 @SuppressWarnings("unchecked") @Nullable private Class<? extends Throwable>[] retryExceptions;  //配置抛出这些异常以及子类则不会重试 @SuppressWarnings("unchecked") @Nullable private Class<? extends Throwable>[] ignoreExceptions;  //启用 ExponentialBackoff 延迟算法,初次重试延迟时间为 waitDuration,之后每次重试延迟时间都乘以 exponentialBackoffMultiplier,直到 exponentialMaxWaitDuration @Nullable private Boolean enableExponentialBackoff;  private Double exponentialBackoffMultiplier;  private Duration exponentialMaxWaitDuration;  //启用随机延迟算法,范围是 waitDuration - randomizedWaitFactor*waitDuration ~ waitDuration + randomizedWaitFactor*waitDuration @Nullable private Boolean enableRandomizedWait;  private Double randomizedWaitFactor;  @Nullable private Boolean failAfterMaxAttempts;
  引入 resilience4j-spring-boot2 的依赖 ,就可以通过 Properties 配置的方式去配置 Retryer 等所有 resilience4j 组件,例如:
  application.yml resilience4j.retry:   configs:     default:       ## 最大重试次数,包括第一次调用       maxRetryAttempts: 2       ## 重试等待时间       waitDuration: 500ms       ## 启用随机等待时间,范围是 waitDuration - randomizedWaitFactor*waitDuration ~ waitDuration + randomizedWaitFactor*waitDuration       enableRandomizedWait: true       randomizedWaitFactor: 0.5     test-client1:       ## 最大重试次数,包括第一次调用       maxRetryAttempts: 3       ## 重试等待时间       waitDuration: 800ms       ## 启用随机等待时间,范围是 waitDuration - randomizedWaitFactor*waitDuration ~ waitDuration + randomizedWaitFactor*waitDuration       enableRandomizedWait: true       randomizedWaitFactor: 0.5
  这样,我们就可以通过如下代码,获取到配置对应的 Retryer: @Autowired RetryRegistry retryRegistry; //读取 resilience4j.retry.configs.test-client1 下的配置,构建 Retry,这个 Retry 命名为 retry1 Retry retry1 = retryRegistry.retry("retry1", "test-client1"); //读取 resilience4j.retry.configs.default 下的配置,构建 Retry,这个 Retry 命名为 retry1 //不指定配置名称即使用默认的 default 下的配置 Retry retry2 = retryRegistry.retry("retry2");
  引入 resilience4j-spring-cloud2 的依赖,就相当于引入了 resilience4j-spring-boot2 的依赖 。并在其基础上,针对 spring-cloud-config 的动态刷新 RefreshScope 机制,增加了兼容。      io.github.resilience4j     resilience4j-spring-cloud2  使用 resilience4j-feign 给 OpenFeign 添加重试
  官方提供了粘合 OpenFeign 的依赖库,即 resilience4j-feign      io.github.resilience4j     resilience4j-feign 
  接下来,我们使用这个依赖,给 OpenFeign 添加重试,首先启用 OpenFeign Client 并指定默认配置:
  OpenFeignAutoConfiguration @EnableFeignClients(value = "com.github.jojotech", defaultConfiguration = DefaultOpenFeignConfiguration.class)
  在这个默认配置中,通过覆盖默认的 Feign.Builder 的方式粘合 resilience4j 添加重试: @Bean public Feign.Builder resilience4jFeignBuilder(         List feignDecoratorBuilderInterceptors,         FeignDecorators.Builder builder ) {     feignDecoratorBuilderInterceptors.forEach(feignDecoratorBuilderInterceptor -> feignDecoratorBuilderInterceptor.intercept(builder));     return Resilience4jFeign.builder(builder.build()); }  @Bean public FeignDecorators.Builder defaultBuilder(         Environment environment,         RetryRegistry retryRegistry ) {     String name = environment.getProperty("feign.client.name");     Retry retry = null;     try {         retry = retryRegistry.retry(name, name);     } catch (ConfigurationNotFoundException e) {         retry = retryRegistry.retry(name);     }      //覆盖其中的异常判断,只针对 feign.RetryableException 进行重试,所有需要重试的异常我们都在 DefaultErrorDecoder 以及 Resilience4jFeignClient 中封装成了 RetryableException     retry = Retry.of(name, RetryConfig.from(retry.getRetryConfig()).retryOnException(throwable -> {         return throwable instanceof feign.RetryableException;     }).build());      return FeignDecorators.builder().withRetry(             retry     ); }
盒马再成小众生鲜伯乐,水果莲子已扩产10倍每天上午8点,和姐妹们结伴步行到不远处的工坊剥水果莲子,是戴红香老人近一个月来的日常。我今年70岁了。戴红香对现在的生活很是满意,每天在家待着实在很无聊,在这里嘛有事做,剥莲子又很PHA马上要开始挖矿了!关于PHA项目你需要了解这些今天,我们不谈以太坊也不谈比特币,小编要为大家介绍的是最近关注度颇高的PHA项目。为何今天会提到PHA项目呢?那是因为近期有个消息传出PHA马上要开始挖矿了!作为目前波卡生态里实力2020年7月EATX平台配置推荐(英特尔)EATX平台,指主机中包含EATX主板的平台,一般价格较高,扩展性强。EATX平台的分类HEDT(HighEndDesktop,高端桌面)平台,Server(服务器)平台和Work周末复盘段永平买苹果股票9年9倍的逻辑截止周五美股收盘,苹果股价以微涨0。23收于310。33美元,市值1。36万亿美元,再次突破历史新高,市值稳坐全宇宙第一。本部落是段永平的老粉丝了,从以前的网易博客时代一直追到现在矿视界译文以太坊离权益证明还有多远?随着NFT和DeFi的持续升温,以太坊2。0开发者迫切希望权益证明网络可以尽快上线。自主网上线以来,以太坊就开始使用与比特币相同的工作量证明机制,不过这几年间,以太坊开发者却一直在太攀之后有它亦是幸,雷蛇锐蝮蛇开箱图赏在太攀皇蛇下市之后,在300400元价位上雷蛇打出了锐蝮蛇,设计感更强的它和巴塞利斯成为MOBA游戏时代的纯右手和对称式的两把利器。而在巴塞利斯往下覆盖199价位的时候,锐蝮蛇则往告诉你最新的棱镜轴长什么样子(拆解)什么是棱镜轴?Flaretech棱镜轴,严格来说是光轴的一种,但和传统光轴的直线光路导通不同,它利用了三棱镜折射的原理,这么折一次后再实现导通。这其实并非刻意的炫技和标新立异,而是高阶自动驾驶的量产车型摩卡预售17。984月19日,WEY品牌全球代言人WEY摩卡首席智能体验官姚安娜,空降上海车展智动WEY来摩卡专属日,携手全球首款智能汽车人WEY摩卡,为现场粉丝呈现了车展史上自动驾驶走秀,书写了其WEY玛奇朵诠释传承与创新日前,新一代混动SUVWEY玛奇朵正式发布官图,预示着WEY品牌智能混动时代即将到来。玛奇朵基于WEY品牌家族先锋张力美学概念,塑造未来科技感,同时又以敏锐青春的产品设计理念标签,高阶自动驾驶的量产车型摩卡预售17。984月19日,WEY品牌全球代言人WEY摩卡首席智能体验官姚安娜,空降上海车展智动WEY来摩卡专属日,携手全球首款智能汽车人WEY摩卡,为现场粉丝呈现了车展史上自动驾驶走秀,书写了其秉持传统的电竞鼠标,ZOWIE卓威EC1B拆解除了引擎性能的提升,近几年游戏鼠标的进步更多的在体验细节上,尤其是中高端鼠标。在电竞市场的刺激下,一线厂商还需在RGB灯光系统超轻量化设计和极致按键手感等方面有更高的追求。所以,不
65英寸OLED电视都跌至6699元了!还在买液晶电视?在买电视的时候,很多人都面临这一个问题,买LCD电视,还是OLED电视?LCD电视也就是我们常说的液晶电视,从画质表现来看,OLED电视的画质远在液晶电视之上,这是由于液晶电视都是三星S22Ultra使用分享,不如小米12Pro表现出色,让人又爱又恨使用三星已经有好几年了,屏幕不用说,大家都知道三星的屏幕非常不错。但是这次入手点三星S22Ultra拍照和续航并没有预期的那么好,我觉得还不如小米12Pro表现出色。不知道是不是我IT之家评测室雷鸟Air智能眼镜体验轻巧高颜值,移动电影院这两年,元宇宙概念火爆全网,其基础技术XR扩展现实及相关产业也迎来巨大的增长空间。XR是ARVRMR等多种技术的统称,其中尤其以ARVR为概念主体。综合华创证券等机构的数据可以看到海王星好冷!凉了8度最近,科学研究人员表示,对海王星的最新观察表明,这颗行星正在变冷。一个国际天文学家小组使用夏威夷和智利的地面望远镜来估计海王星的大气温度。该团队研究了2003年至2020年望远镜拍苹果iOSiPadOS15。5开发者预览版Beta2发布你更新了吗?苹果今日向iPhone和iPad用户推送了iOSiPadOS15。5开发者预览版Beta2更新(内部版本号19F5057e),本次更新距离上次发布隔了2周时间。与之前的iOS15版选购指南便携无线防水应有尽有!2022年最值得推荐的14款户外音箱很显然,这是个并不适合郊游的春季。好在许多人家中会有花园露台或者是阳台,依然有机会享受户外的阳光。此时,一款便携支持无线连接的户外音箱就能成为慢生活里的绝佳伴侣。以下,我们参考英国外贸出口B2B独立站应该怎么做?B2B独立站当下,不仅仅是跨境电商卖家,包括传统外贸工厂线下零售商等也在不断加入独立站的行列,也就是独立站也开始向B端发展。据相关数据统计,到2025年,全球分销市场规模预计将达到Filecoin的价格走势,理性看待Filecoin的价格走势,理性看待!Filecoin是基于IPFS协议建立起来的一个分布式存储网络,同时也是IPFS(星际文件系统)唯一的激励层。IPFS是一个点对点的版本化内容你可能错过的新鲜事01马斯克报价410亿美元收购Twitter,受到毒丸计划反击当地时间4月14日,Twitter最大个人股东特斯拉CEO马斯克在监管文件中披露,拟以每股54。20美元总计410亿美港股开盘恒生指数跌1。92,招商银行跌超10,美团跌5。61金融界4月19日消息今日香港恒生指数开盘跌1。92,报21106点,国企指数跌2。12,报7228。98点,红筹指数跌0。5,报4094。53点,恒生科技指数跌2。41,报4215台积电据悉为员工提供约15买股补助中时新闻网4月19日消息,台积电预计今年招募员工超过8000人,并将对超5万名员工全面实施买股补助,员工每月可从薪资扣除一定额度买公司股票,公司将提供一部分补助,据悉补助比重约在1