发布稳定性-优雅上线

简介: 之前的文章讲了优雅下线,今天讲优雅上线

之前的文章讲了优雅下线发布稳定性-优雅下线,今天讲优雅上线

优雅上线也叫:「无损上线」,「延迟发布」,「延迟暴露」。与之对立的自然是:「有损上线」,「直接发布」

什么是优雅上线

先说说什么情况不是优雅上线

  • 应用启动时,Service还没加载完,系统就开始对外提供服务,导致失败调用。

  • 应用启动时,没有检查系统健康状态,导致失败调用

这些情况都会影响到用户,即不优雅的上线。

对于任何一个线上应用来说,发布、扩容、缩容、重启等操作不可避免,这时候服务不可用,就必须把流量弄走,比如分批发布时,放到别的机器上。等到应用恢复正常后,再把流量弄回来,让应用继续提供服务,这就是优雅上线。

无论是HTTP应用还是RPC应用,在发布上线时,优雅上线逻辑都是一样的,如下图,服务发布过程中不可用,进行摘流。待到服务发布完成,重新分配流量

1_1.png

Dubbo的优雅上线

Dubbo的优雅上线有2种方式:延迟发布 和 Qos命令

1.延迟发布

即延迟暴露Dubbo服务,比如你的服务需要一些初始化操作后才能对外提供服务,如初始化缓存,redis连接池等相关资源就位,可以使用 delay 进行延迟暴露。 Dubbo 2.6.5 之后的版本中所有的Dubbo服务都会在Spring初始化完成后进行暴露,可自行配置延迟暴露的时间,配置如下:

Dubbo官方文档的延迟暴露:延迟暴露

# 延迟暴露5s
dubbo.provider.delay=5000

源码分析

Dubbo实现了Spring的ApplicationListener接口,监听ContextRefreshedEvent事件,即在Spring容器启动完毕后再开始暴露服务,源码分析如下:

ServiceBean:

//监听ContextRefreshedEvent事件,再执行export暴露服务    
        @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
   
   
        if (!isExported() && !isUnexported()) {
   
   
            if (logger.isInfoEnabled()) {
   
   
                logger.info("The service ready on spring started. service: " + getInterface());
            }
            export();
        }
    }

ServiceConfig类:

  //暴露Service
  public synchronized void export() {
   
   
        checkAndUpdateSubConfigs();

        if (!shouldExport()) {
   
   
            return;
        }
                //判断是否配置了延迟发布时间,如有,则单起一个线程,等待相应时间后再执行doExport方法
        if (shouldDelay()) {
   
   
            DELAY_EXPORT_EXECUTOR.schedule(this::doExport, getDelay(), TimeUnit.MILLISECONDS);
        } else {
   
   
            doExport();
        }
    }

    private boolean shouldExport() {
   
   
        Boolean export = getExport();
        // default value is true
        return export == null ? true : export;
    }


    @Override
    public Boolean getExport() {
   
   
        return (export == null && provider != null) ? provider.getExport() : export;
    }
    //判断是否需要延迟暴露
    private boolean shouldDelay() {
   
   
        Integer delay = getDelay();
        return delay != null && delay > 0;
    }
    //获取配置的延迟暴露时间
    @Override
    public Integer getDelay() {
   
   
        return (delay == null && provider != null) ? provider.getDelay() : delay;
    }

2. QOS命令上线

Dubbo官方文档QOS命令操作手册:QOS操作手册

配置以下,启动时不向注册中心发布服务

# 延迟暴露5s
dubbo.provider.delay=5000
# provider服务启动后不注册到注册中心
#dubbo.registry.register=false
#dubbo.registry.default=false
dubbo.provider.register=false

dubbo.application.qos-port=22223
dubbo.application.qos-enable=true
dubbo.application.qos-accept-foreign-ip-compatible=true

这里配置的时候遇到个问题:

按网上的方法配置dubbo.registry.register=false就能让服务不发布到注册中心,但是Qos命令也用不了了。按我上面的配置,Qos还是可用的啊

因为此时服务未发布,就不会有请求过来。我们可以在服务健康检查完之后在手动发布Service,可通过telnet命令或是http请求方式online

HTTP方式发布所有服务

curl localhost:22223/online

过程如下图

1_2.png

最佳实践

本文介绍了两种 Dubbo 优雅上线的方法:

  • 延迟发布(delay=5000)
  • 不发布 + QOS 指令发布(register=false)

在实际的企业应用中,需要结合具体场景使用。大型应用Service较多时,通常可用QOS命令分层发布Service,即每次发布一定数量的接口,而不是一次全发。

总结:服务发布的稳定性已讲了优雅上下线,但是实际工作中不是做好这两样就行了,具体情况需要具体分析,下篇文章继续讲稳定性的内容:流量预热。

相关文章
|
SQL 监控 搜索推荐
自动化测试平台V1.0版本正式上线啦!
自动化测试平台V1.0版本正式上线啦!
248 0
|
1月前
|
存储 消息中间件 运维
架构升级的救星!流量回放自动化测试的必备指南
大家好,我是小米,一名29岁的技术宅。今天分享一个物联网领域的实用技能——流量回放自动化测试。系统重构后,测试工作量巨大,本文介绍如何通过日志收集和数据回放进行自动化测试,包括离线、实时和并行回放模式,帮助快速定位Bug,提升测试效率和系统稳定性。欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
39 3
|
4月前
|
Java 中间件 Spring
开发与运维应用问题之应用启动提速如何解决
开发与运维应用问题之应用启动提速如何解决
|
3月前
|
Java
软件交付质量问题之要提升发布成功率,如何实现
软件交付质量问题之要提升发布成功率,如何实现
|
6月前
上线需求范围不明确该怎么办?
上线需求范围不明确该怎么办?
|
XML JSON JavaScript
版本升级 | v1.0.13发布,传下去:更好用了
本次更新主要聚焦兼容性的提升及结果报告格式的增加,另外对部分解析逻辑及使用体验进行了优化。特别鸣谢@Hugo-X的PR贡献~
122 0
版本升级 | v1.0.13发布,传下去:更好用了
|
监控 安全 数据库
如何持续、正确、安全的发布?
如何持续、正确、安全的发布?
82 0
|
Prometheus Kubernetes Cloud Native
上线控制台,降低使用门槛|Higress 1.0.0 RC 版本发布
一个遵循开源Ingress/Gateway API标准,提供流量调度、服务治理、安全防护三合一的高集成、易使用、易扩展、热更新的下一代云原生网关。
上线控制台,降低使用门槛|Higress 1.0.0 RC 版本发布
|
Dubbo Java 应用服务中间件
发布稳定性-优雅下线
最近负责的项目已经到达10万 QPS的大关了,这么高的QPS,对系统的稳定性要求也更高了。之前QPS小的时候,系统更新部署很简单,现在不行了,一部署起来,上游应用方就找过来了,说你这应用咋回事,怎么突然抖动厉害了。。。
249 0
发布稳定性-优雅下线
|
Kubernetes Cloud Native Dubbo
应用发布新版本如何保障流量无损
业务的发展需要应用系统不断的迭代,我们无法避免应用频繁变更发版,但是我们可以提升应用升级过程中的稳定性和高可用。
应用发布新版本如何保障流量无损