基于Spring扩展点服务调用预热

在这里插入图片描述

背景

Spring Cloud 服务默认在web server(如tomcat embedded sever)启动后立即进行服务注册,接入流量。启动后初始的服务请求执行较慢,可达到数秒,造成服务消费者超时出错或其它问题。

在这里插入图片描述

可以看到请求第一次很慢,因为需要初始化RibbonClient,这个是延迟加载。

饥饿加载

### Ribbon 配置
ribbon:
  # 饥饿加载
  eager-load:
    # 是否开启饥饿加载
    enabled: true
    # 饥饿加载的服务
    clients: service-hi

再看下结果,可以看到在启动时,就会初始化。

在这里插入图片描述
在这里插入图片描述

接下来做下简单分析。

可以看到RibbonAutoConfiguration#ribbonApplicationContextInitializer会用于初始化Ribbon的上下文。
在这里插入图片描述
来到RibbonApplicationContextInitializer,初始化ribbon的上线文是在spring上下文准备好的时候。
在这里插入图片描述

这个时候会有什么问题么,上次说到服务注册是在WebServerInitialized event,这个event是在ApplicationReadyEnvent之前的,ribbon client创建时,仍然可能有请求发过来,不能及时处理。服务调用还涉及到连接池、线程池的初始化,无法在实际请求之前预热处理。

改造

  • 思路

通过改进Spring Cloud服务注册机制,提供服务预热扩展点,方便业务根据自身服务特点进行预热处理,预热完成后,再进行服务注册,接入流量。保证服务发布期间服务响应时间稳定,服务消费者不受影响。

Created with Raphaël 2.3.0 开始 服务启动 Spring Cloud WebServerInitialized SpringApplicationReadyEvent WarmUp 服务注册 接入请求 结束

代码

代码已放到github

核心代码如下:

  1. 复写了NacosAutoServiceRegistration方法,调用start方法为空方法,默认不去做初始化,即服务注册。
    在这里插入图片描述

在这里插入图片描述

测试

  1. 加一个配置

在这里插入图片描述
2. 启动项目,可以看到做了初始化,访问之后时间变短了。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值