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

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     ); }
起亚与道达尔签约战略合作协议,向新能源等项目投入更多研发资源新京报贝壳财经讯(记者白昊天)3月9日,贝壳财经记者自江苏悦达起亚官方了解到,江苏悦达起亚与全球能源公司道达尔润滑油签署了战略合作协议。道达尔润滑油(中国)有限公司董事总经理Ste不出国门也可感受海岛风情,菲律宾海岛乐园项目正式启动!3月10日,由菲律宾国家旅游局北京办事处与闻旅联合主办,蔚蓝海岸大力支持的欢乐可期菲律宾海岛乐园项目启动仪式在北京成功举办。本次活动正值出境游恢复的重要时期,获得了业内的关注和聚焦阿里巴巴推广企业融易收升级步骤流程详解阿里巴巴平台新规则,企业做阿里巴巴推广开通的企业融易收必须升级,方才可享受对公转账和大额资金收款服务。今天米可就来给大家讲解一下企业融易收升级的步骤流程。1登入1688卖家中心交易上海大学尹鑫茂首创光谱学方法,打开量子材料基础研究新篇章做科研一是天赋要好,二是要有运气,三是要能长久坚持。三个条件缺一不可。上海市高温超导重点实验室教授上海大学物理系副主任超导与凝聚态物理所所长尹鑫茂2004年,英国物理学家安德烈海姆企业没钱转数字化?全国人大代表马奎建议前置补贴降低成本在今年的政府工作报告上,科技是一个重点。科技创新一词不仅连续九年在报告中出现,数字化智能化的表述也被连提三年。报告指出,要支持工业互联网发展,有力促进制造业数字化智能化,同时强调加2022年营收纯电动销量双增长,2023年宝马集团将发力电动化近日,宝马集团公布2022年财报,总体形势利好。数据显示宝马集团2022年全年总营收超1,426亿欧元,同比增长28。2。具体到汽车销量层面,2022年宝马集团汽车产品总销量达2,企业所得税年度汇缴网上申报已上线!请注意查收哦!2022年度企业所得税汇算清缴网上申报已经上线大家赶紧登录电子税务局吧!5月31日截止哦!纳税人请通过国家税务总局江苏省电子税务局登录。(httpsetax。jiangsu。chi话销量12月车企集团合计下降近4成,仅比亚迪实现正增长中国汽车工业协会发布了2023年2月汽车工业产销情况。今年2月汽车产销分别完成203。2万辆和197。6万辆,同比分别增长11。9和13。5。中汽协指出,由于去年同期及今年1月均为亿田2023年度大商定盘大会暨大商俱乐部启动会圆满举行!2023年2月28日3月1日,亿田2023年度大商定盘大会暨大商俱乐部启动会于嵊州隆重举办。亿田智能总裁孙吉营销副总裁刘伟等公司高层携总部营销人员,与来自全国各地核心大商云集于此,股市终极测试哪一种图形容易出连板主升浪?把答案打在下方评论区A624B095C609D373E588F927G777问题以上7张图最新日期313你认为谁能够走出连板主升浪行情?问题以上7张图能否通过我的图文拆解看得懂我上宁德时代拯救福特汽车?必须防止美国下黑手28年前,中国求着美国技术换市场28年后,轮到美国求着中国技术换市场。宁德时代向福特技术输出,说明在电动汽车领域,中美地位开始扭转。但宁德时代必须万分小心,无论如何都要留一手,防止
影响胎儿智力发育的几种水,孕妇要注意,能不喝就不喝孕期喝水有讲究,几种水孕期一滴也别碰,会影响胎儿智力发育很多孕妇在怀孕前有喝咖啡喝饮料的习惯,但怀孕后明知这些水不好,可是又戒不掉。有些妈妈不喜欢喝白开水,再加上孕吐的影响,一喝白班级群里错打一个公字引起误会,老师信以为真,要懂得节制在以前家长想要和老师进行沟通是非常困难的,但是如今随着社会的发展,网络已经快速地蔓延到生活中,家长群便是家长和老师沟通的主要桥梁。但是这两年家长群却是饱受争议,从最开始家长在群里面混血宝宝就一定比原生态的美?别被幻想所蒙蔽所有的混血宝宝都很美,很可爱吗?作者奶爸导言很多年轻人看到混血宝宝就走不动道,甚至会激发自己想要孩子的欲望。混血宝宝确实是很有代表性的孩子,大家在网上短视频中看到的混血宝宝确实是太宝妈宝爸注意,新生儿出生,切记要尽早参加医保,办理指南来了为人父母的人也曾是孩子,不是天生就掌握了如何为人父母。第一个小孩出生之后,很多新晋宝爸宝妈们除了沉浸在为人父母的喜悦中之外,很多与孩子的第一次都会让他们手足无措,比如给孩子换尿布喂小朋友的房间格局应该怎么布置呢?儿童房是孩子的卧室游戏和学习空间,科学合理地装潢儿童居室,对于儿童健康成长,培养儿童独立生活能力,启迪他们的智慧具有重要的意义。儿童书桌椅摆放1不要放在门边在学校里,坐在靠门位置的新生儿重点护理事项,合格爸妈必须要知道的事舒月母婴的月嫂用心整理的新生儿护理重点事项,字字都是干货!无私分享给准妈妈们,收藏备用哦日常护理1。新生儿黄疸高,黄疸值12以下,无需人为干预黄疸,多晒太阳,不超过20分钟(避开脸大渡口有条蔷薇大道雨晴香拂醉人头大渡口发布消息,朵朵精神叶叶柔,雨晴香拂醉人头。公园大渡口多彩艺术湾。大渡口区城市管理局持续打造城市景观,拓展绿化空间,在钢花路中央隔离带栽种了蔷薇三角梅等植物,扮靓城市颜值。在4人生不只是一场旅行,活就要活出精彩人生就像一场旅行,不必在乎目的地,在乎的是沿途的风景和看风景的心情。这是我印象之中最为经典的一句广告词,而自从踏入大学校园以来,我便在长三角各大城市之间尝试不同的旅游体验。但相比人护肤品,凝胶型和乳液型,用哪种好?白天和晚上的答案不一样护肤品,从形态来看,目前的主流有2种凝胶型和乳液型。用哪种类型效果更好?白天和晚上不能一概而论。从化学成分机理看白天用乳液型,晚上用凝胶型,这样的护肤效果会好很多。具体化学成分机理江苏姑娘第3次修复上睑下垂,术后7天双眼对称有神,双眼皮也自然小姑娘来自江苏,自幼大小眼明显(右眼小),属于先天性的上睑下垂,7年前在韩国做了双眼皮手术,术后右眼依然小,睁不开,双眼皮宽。6年前又在一家机构做了全切双眼皮修复手术,术后右眼的问小米众筹小白刀星智能前门包装3D人脸ID中国科技巨头小米为其创新的小白刀星智能前门在中国发起了众筹活动。小白刀星采用3D人脸识别技术和六种方案解锁智能门。该设备目前可预订7,999元(1,255美元),而首批交付时间为6