文章目录

  • 背景
  • 问题
  • 问题定位
  • 问题解决
    • Unexpected end of file from server executing GET xxx
    • feign.RetryableException: connect timed out executing GET
      • Ribbon
      • Spring Cloud Load Balancer
  • 总结

这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

最近在做微服务拆分,最终选用的RPC框架为 openfeign。本以为使用是非常简单的,毕竟网上和官网的demo使用起来很简单,无非就是加几个注解。但是在实际落地的时候还是遇到了很多问题,这里就先说服务上下线问题吧

问题

在服务拆分上线后,服务上线重启经常会发现其他服务报这个两个错

feign.RetryableException: connect timed out executing GET

服务连接超时

Unexpected end of file from server executing GET xxx

xxx 接口不可用

问题定位

其实这个问题相对来说是非常好定位的,因为每次报这个错都是由于服务重启才会出现的。
比如A服务重启, B服务就会报这个错

首先 xxx接口不可用这个主要原因是在服务A调用服务B的时候,由于服务B接口还没响应,突然服务B被 kill -9 强杀了,就会报这个错

feign.RetryableException: connect timed out executing GET 这个错误主要是由于Feign客户端的负载均衡导致的,客户端会从注册中心拉取服务列表的地址,本地会缓存一份。导致的问题是服务下线后注册中心是能感知的,但是由于客户端缓存问题,导致了客户端这边调用的还是原先已经下线的服务,从而报错

问题解决

Unexpected end of file from server executing GET xxx

这个问题比较好解决,我们要解决的就是服务不要直接被强制杀死,要求服务处理完正在运行的请求,再停机。在Spring Boot 2.3之后就添加了优雅停机。

使用方式也非常简单,添加如下配置

server:shutdown: graceful #开启优雅停机
spring:lifecycle:timeout-per-shutdown-phase: 20s #设置缓冲时间 默认30s

如果Spring Boot 版本小于2.3,官方没有提供相应的功能,但是我们可以自己实现一个。代码如下

public class SpringStopListener implements ApplicationListener<ContextClosedEvent>, TomcatConnectorCustomizer {private volatile Connector connector;@Overridepublic void customize(Connector connector) {this.connector = connector;}@Overridepublic void onApplicationEvent(ContextClosedEvent contextClosedEvent) {this.connector.pause();Executor executor = this.connector.getProtocolHandler().getExecutor();if (executor instanceof ThreadPoolExecutor) {try {ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;// 将状态设置为shutdown,不再接收新的请求,正在跑的任务会执行完threadPoolExecutor.shutdown();if (!threadPoolExecutor.awaitTermination(waitTime, TimeUnit.SECONDS)) {log.warn("Tomcat thread pool did not shut down gracefully within " + waitTime + " seconds. Proceeding with forceful shutdown");}} catch (InterruptedException ex) {Thread.currentThread().interrupt();}}}

feign.RetryableException: connect timed out executing GET

这个问题相对来说不是特别好处理,主要原因是由于客户端缓存了注册中心实例元数据导致的,如果禁用客户端缓存又会导致性能不佳,每次都需要去注册中心拉取服务数据,如果不禁用服务上线的时候就会出现这个报错。
首先Spring Cloud Feign的负载均衡在不同版本又有负载均衡处理器,老版本使用的Ribbon,新版本的Spring Cloud已经将Ribbon替换成Spring Cloud Load Balancer,毕竟Netfix 已经不在维护了Ribbon

Ribbon

如果你使用的负载均衡器是Ribbon,你可以使用如下配置

ribbon:ServerListRefreshInterval: 2000 # 客户端缓存元数据时间ReadTimeout: 5000 # 读取数据超时时间ConnectTimeout: 2000 # 连接超时时间

这个ServerListRefreshInterval值是一点要改的,默认的客户端缓存注册中心服务数据时间为30s


这个时间是真的坑。我们这里折中改为2s

Spring Cloud Load Balancer

Spring Cloud Load Balancer 目前来说网上的资料较少,想要配置还需要自己去官网找资料
目前禁用的配置是如下

spring:cloud:loadbalancer:cache:enabled: false

总结

目前的解决方式大致是 优雅停机+减少客户端缓存时间。后续还是需要有更好的优化方案

Spring Cloud之openfeign 处理服务平滑上下线相关推荐

  1. 用Spring Cloud Alibaba开发微服务会更香吗?

    关注DD,除了前沿消息,还有每周福利哦 Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案,它是Spring Cloud组件被植入Alibaba元素之后的产物. 利用Spri ...

  2. 流量暴增,掌门教育如何基于 Spring Cloud Alibaba 构建微服务体系?

    作者 | 童子龙  掌门教育基础架构部架构师 **导读:**本文整理自作者于 2020 年云原生微服务大会上的分享<掌门教育云原生落地实践>,本文主要介绍了掌门教育云原生落地实践,主要围绕 ...

  3. 微服务等于 Spring Cloud?了解微服务架构和框架

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  4. Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)

    文章目录 Spring Cloud入门系列汇总 摘要 Sentinel简介 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 ...

  5. Spring Cloud(一)服务的注册与发现(Eureka)

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集 ...

  6. Spring Cloud第二篇:服务消费者RestTemplate+Ribbon

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  7. 【福利】赠书:Spring Cloud与Docker微服务架构实战(第2版)

    本次福利送出好友周立的第二版书籍! 正在关注和使用Spring Cloud的朋友们不要错过哦! 内容提要 <Spring Cloud与Docker微服务架构实战(第2版)>基于Spring ...

  8. java什么是服务治理平台_Java | Spring Cloud 是如何实现服务治理的

    Spring Cloud 是如何实现服务治理的 Table of Contents 建议提前阅读 Spring Cloud Commons 之服务治理浅析 Spring 在设计的时候,通常会考虑方便扩 ...

  9. 进击的 Spring Cloud Alibaba —— 框架与服务

    作者 | 陈曦(良名)  Spring Cloud Alibaba 项目成员,start.aliyun.com 负责人. 导读:本文整理自作者于 2020 年云原生微服务大会上的分享<进击的 S ...

  10. spring cloud整合OpenFeign

    spring cloud整合OpenFeign pom.xml配置 <!-- https://mvnrepository.com/artifact/org.springframework.clo ...

最新文章

  1. java随机生成6位随机数 5位随机数 4位随机数
  2. asp.net学习资源列表
  3. SharedPreference Demo
  4. ETL异构数据源Datax_数据准备_03
  5. TVM:交叉编译和RPC
  6. Oracle数据库游标数总结
  7. 豆瓣上线应急防护模式 防护时间最长可设置14天
  8. ES6新特性_Promise介绍与基本使用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记024
  9. html中font size默认值,HTML basefont size 属性
  10. java中GC的基本概念
  11. nodejs首个框架开发(先只发个连接,有空再写)
  12. 计算机自带输入法在哪里设置方法,电脑输入法设置在哪里_电脑输入法在哪里删除...
  13. 房贷利率有没有套路?用Python版解读!
  14. 在线JS编辑器,可运行保存简单JS代码(已开源)
  15. Android中Toast的简单使用
  16. 怎么增加淘宝店铺标签权重
  17. 我的世界java版地狱_我的世界怎么去地狱_Minecraft地狱门建造教程 - 我的世界中文站...
  18. stirling formula prove
  19. 「津津乐道播客」#380 津津有味:厨房重地举目皆是刚需,将就不得
  20. 【NLP】第10章 使用基于 BERT 的 Transformer 进行语义角色标记

热门文章

  1. 魔兽对战平台官网地图《小兵合成》 最强攻略+合成表+隐藏合成+隐藏英雄+
  2. 训练创新思维的方法:曼陀罗思考法
  3. linux下smbd服务,Linux下资源共享服务之samba 的讲解!
  4. 如何通过iPhone或Android手机制作自己的QR码
  5. 在京东工作是一种什么样的体验
  6. nginx最简单的旧域名跳转新域名
  7. 今天QQ被盗,异常情况调查与反思
  8. 编码器如何推流给虎牙直播平台
  9. 华为S5700交换机开启Telnet和SSH服务
  10. 【华为社招OD笔试题】输入一串数字,给出他们的最小的和的绝对值,输出a,b和a+b的绝对值 其中数字范围为[-63500,63500]