Spring Cloud之openfeign 处理服务平滑上下线
文章目录
- 背景
- 问题
- 问题定位
- 问题解决
- 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 处理服务平滑上下线相关推荐
- 用Spring Cloud Alibaba开发微服务会更香吗?
关注DD,除了前沿消息,还有每周福利哦 Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案,它是Spring Cloud组件被植入Alibaba元素之后的产物. 利用Spri ...
- 流量暴增,掌门教育如何基于 Spring Cloud Alibaba 构建微服务体系?
作者 | 童子龙 掌门教育基础架构部架构师 **导读:**本文整理自作者于 2020 年云原生微服务大会上的分享<掌门教育云原生落地实践>,本文主要介绍了掌门教育云原生落地实践,主要围绕 ...
- 微服务等于 Spring Cloud?了解微服务架构和框架
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)
文章目录 Spring Cloud入门系列汇总 摘要 Sentinel简介 安装Sentinel控制台 创建sentinel-service模块 限流功能 创建RateLimitController类 ...
- Spring Cloud(一)服务的注册与发现(Eureka)
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集 ...
- Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...
- 【福利】赠书:Spring Cloud与Docker微服务架构实战(第2版)
本次福利送出好友周立的第二版书籍! 正在关注和使用Spring Cloud的朋友们不要错过哦! 内容提要 <Spring Cloud与Docker微服务架构实战(第2版)>基于Spring ...
- java什么是服务治理平台_Java | Spring Cloud 是如何实现服务治理的
Spring Cloud 是如何实现服务治理的 Table of Contents 建议提前阅读 Spring Cloud Commons 之服务治理浅析 Spring 在设计的时候,通常会考虑方便扩 ...
- 进击的 Spring Cloud Alibaba —— 框架与服务
作者 | 陈曦(良名) Spring Cloud Alibaba 项目成员,start.aliyun.com 负责人. 导读:本文整理自作者于 2020 年云原生微服务大会上的分享<进击的 S ...
- spring cloud整合OpenFeign
spring cloud整合OpenFeign pom.xml配置 <!-- https://mvnrepository.com/artifact/org.springframework.clo ...
最新文章
- java随机生成6位随机数 5位随机数 4位随机数
- asp.net学习资源列表
- SharedPreference Demo
- ETL异构数据源Datax_数据准备_03
- TVM:交叉编译和RPC
- Oracle数据库游标数总结
- 豆瓣上线应急防护模式 防护时间最长可设置14天
- ES6新特性_Promise介绍与基本使用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记024
- html中font size默认值,HTML basefont size 属性
- java中GC的基本概念
- nodejs首个框架开发(先只发个连接,有空再写)
- 计算机自带输入法在哪里设置方法,电脑输入法设置在哪里_电脑输入法在哪里删除...
- 房贷利率有没有套路?用Python版解读!
- 在线JS编辑器,可运行保存简单JS代码(已开源)
- Android中Toast的简单使用
- 怎么增加淘宝店铺标签权重
- 我的世界java版地狱_我的世界怎么去地狱_Minecraft地狱门建造教程 - 我的世界中文站...
- stirling formula prove
- 「津津乐道播客」#380 津津有味:厨房重地举目皆是刚需,将就不得
- 【NLP】第10章 使用基于 BERT 的 Transformer 进行语义角色标记
热门文章
- 魔兽对战平台官网地图《小兵合成》 最强攻略+合成表+隐藏合成+隐藏英雄+
- 训练创新思维的方法:曼陀罗思考法
- linux下smbd服务,Linux下资源共享服务之samba 的讲解!
- 如何通过iPhone或Android手机制作自己的QR码
- 在京东工作是一种什么样的体验
- nginx最简单的旧域名跳转新域名
- 今天QQ被盗,异常情况调查与反思
- 编码器如何推流给虎牙直播平台
- 华为S5700交换机开启Telnet和SSH服务
- 【华为社招OD笔试题】输入一串数字,给出他们的最小的和的绝对值,输出a,b和a+b的绝对值 其中数字范围为[-63500,63500]