Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >发布稳定性-优雅上线

发布稳定性-优雅上线

作者头像
卷福同学
发布于 2023-04-28 03:59:03
发布于 2023-04-28 03:59:03
50600
代码可运行
举报
文章被收录于专栏:奶奶看了都会奶奶看了都会
运行总次数:0
代码可运行

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

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

什么是优雅上线

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

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

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

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

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

Dubbo的优雅上线

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

1.延迟发布

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 延迟暴露5s
dubbo.provider.delay=5000

源码分析

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

ServiceBean:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//监听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类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  //暴露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操作手册

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 延迟暴露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方式发布所有服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl localhost:22223/online

过程如下图

最佳实践

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卷福同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
dubbo源码学习笔记----结合Spring
dubbo结合spring public class ServiceBean<T> extends ServiceConfig<T> implements InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>, BeanNameAware { private static final long serialVersionUID = 21319549415
春哥大魔王
2018/04/16
6930
Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)
前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程。 以源码中dubbo-demo模块作为切入口一步步走进Dubbo源码。
YGingko
2017/12/28
2K0
一文聊透 Dubbo 优雅上线
在此文之前,我写过一篇 《一文聊透 Dubbo 优雅停机》,这篇文章算是一个续集,优雅停机和优雅上线两者都是微服务生命周期中,开发者必须关心的环节。
kirito-moe
2019/11/25
1.9K0
Dubbo——服务发布原理
在使用Dubbo的时候你一定会好奇它是怎么实现RPC的,而要了解它的调用过程,必然需要先了解其服务发布/订阅的过程,本篇将详细讨论Dubbo的发布过程。
夜勿语
2020/09/07
6200
Dubbo服务暴露注册原理
dubbo是java领域应用最广泛的rpc框架之一,服务端启动时把服务注册到注册中心,客户端启动时向注册中心订阅服务,然后通过客户端的负载和路由机器选择对应的服务进行连接调用。
叔牙
2022/03/28
9171
Dubbo服务暴露注册原理
dubbo源码——服务提供者的服务暴露过程(一)
<dubbo:xxx/>标签是Spring的自定义标签,可以查看dubbo.jar包下的META-INF->spring.handlers
冰枫
2018/06/10
2.7K0
源码分析Dubbo服务提供者启动流程-上篇
本节将详细分析Dubbo服务提供者的启动流程,请带着如下几个疑问进行本节的阅读,因为这几个问题将是接下来几篇文章分析的重点内容。
丁威
2019/06/10
1.3K0
源码分析Dubbo服务提供者启动流程-上篇
dubbo源码学习二
昨天我们已经知道dubbo的入口可以通过自定义标签找到DubboNamespaceHandler找到解析自定义标签的相关类了。还有4个我们需要关注:ConfigCenterBean、ServiceBean、ReferenceBean、new AnnotationBeanDefintionParser()。
路行的亚洲
2020/07/17
8520
dubbo源码学习二
Dubbo源码学习-服务发布
我们一般会把服务的信息放在spring的配置文件中,供dubbo解析调用。那么这些配置文件是怎么起作用的呢?
周同学
2020/03/20
9290
Dubbo源码学习-服务发布
源码分析--dubbo服务端暴露
服务暴露的入口方法是 ServiceBean 的 onApplicationEvent。onApplicationEvent 是一个事件响应方法,该方法会在收到 Spring 上下文刷新事件后执行服务导出操作。方法代码如下:
luozhiyun
2019/08/28
3570
源码分析--dubbo服务端暴露
Dubbo系列讲解之服务注册【3万字长文分享】
  在实际的开发过程中,Dubbo大部分情况都是与Spring的生态进行整合使用的,所以在真正进入Dubbo的服务注册之前,我们需要先了解Dubbo是怎么将自己的环境嵌入到Spring生态中的。
用户4919348
2021/09/08
6530
Dubbo系列讲解之服务注册【3万字长文分享】
[dubbo 源码之 ]1. 服务提供方如何发布服务
服务提供方在启动部署时,dubbo会调用ServiceConfig#export来激活服务发布流程,如下所示:
Isaac Zhang
2020/03/19
4800
dubbo源码学习(四)初始化过程细节:解析服务
今天将真正去看dubbo内部的实现过程,看dubbo的源码前我先把dubbo的用户指南和开发指指南大概的看了一遍,这样再看dubbo源码比较轻松。从用户指南和开发指指南可以找到相应的切入点,今天将介绍的是dubbo的初始化解析bean的过程:
BUG弄潮儿
2022/06/30
3460
Dubbo服务暴露过程
dubbo暴露服务有两种情况,一种是设置了延迟暴露(比如delay=”5000”),另外一种是没有设置延迟暴露或者延迟设置为-1(delay=”-1”):
用户5325874
2020/01/16
1.2K0
微服务的优雅上下线,你学废了吗?
对于微服务来说,服务的优雅上下线是必要的。就上线来说,如果组件或者容器没有启动成功,就不应该对外暴露服务,对于下线来说,如果机器已经停机了,就应该保证服务已下线,如此可避免上游流量进入不健康的机器。
二哥聊运营工具
2021/12/17
5450
微服务的优雅上下线,你学废了吗?
发布稳定性-优雅下线
最近负责的项目已经到达10万 QPS的大关了,这么高的QPS,对系统的稳定性要求也更高了。之前QPS小的时候,系统更新部署很简单,现在不行了,一部署起来,上游应用方就找过来了,说你这应用咋回事,怎么突然抖动厉害了。。。
卷福同学
2023/04/20
6000
发布稳定性-优雅下线
微服务架构之服务框架Dubbo-服务暴露
上篇文章说到ServiceBean监听了ContextRefreshedEvent然后export服务,我们接着谈这个话题
公众号_松华说
2019/07/16
1.7K0
微服务架构之服务框架Dubbo-服务暴露
Dubbo 源码分析 - 服务导出全过程解析
本篇文章,我们来研究一下 Dubbo 导出服务的过程。Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一是前置工作,主要用于检查参数,组装 URL。第二是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析,在分析之前,我们先来了解一下服务的导出过程。
田小波
2018/12/05
7010
Dubbo 源码分析 - 服务导出全过程解析
4. 源码分析---SOFARPC服务端暴露
从示例入手我们设置好ServerConfig和ProviderConfig之后调用ProviderConfig的export方法进行暴露 ProviderConfig#export
luozhiyun
2019/09/10
5140
Dubbo原理何源码解析之服务暴露
从文章《Dubbo原理和源码解析之标签解析》中我们知道,<dubbo:service> 标签会被解析成 ServiceBean。
烂猪皮
2018/08/03
4170
Dubbo原理何源码解析之服务暴露
相关推荐
dubbo源码学习笔记----结合Spring
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验