有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

使用场景

微服务发布过程中,可能会因为服务的变更造成流量的错误或中断。Spring Cloud Tencent 提供了插件来实现无损上下线,其原理为:
无损上线:在服务启动后,等待服务完全就绪后再注册到注册中心(无配置健康探测接口时为延迟注册),并对外提供服务。然后再结合 K8s 生命周期,滚动更新下一个节点。
无损下线:在服务停止前,先从注册中心注销,拒绝新的请求,等待旧的请求处理完毕后再下线服务。

无损上线

TSE 北极星支持以下 2 种方式支持服务无损上线:服务就绪/延迟注册服务注册就绪检查

方案一:服务就绪/延迟注册

在一些场景下,服务支持延迟加载,启动后异步加载一些资源,例如:服务需要从文件存储 COS 获取数据或者文件,待数据或者文件拉取完成后才能对外提供服务。如果在应用启动后直接注册服务,会导致服务实际没有就绪而调用失败。因此通过确保服务就绪之后,再进行注册从而对外提供服务,可以确保服务平滑、无损上线。
TSE 北极星支持以下两种服务就绪/延迟注册场景:
场景一:业务暴露健康检查接口,接口探测成功后,服务注册。
场景二:业务没有暴露健康检查接口,则延迟一段时间服务注册,默认延迟注册时长30s,可通过配置自定义延迟注册的时长。




操作步骤

步骤1:服务通过 Spring Cloud Tencent 接入北极星服务注册与发现能力。具体步骤请参见:Spring Cloud Tencent 接入北极星
步骤2:引入 spring cloud tencent 无损上下线插件依赖。
在 pom.xml 中添加依赖:
<dependencies>
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-tencent-lossless-plugin</artifactId>
</dependency>
</dependencies>
步骤3:在应用北极星配置文件中添加无损上下线相关配置项。具体参数如下:
配置项 Key
默认值
是否必填
配置项说明
spring.cloud.polaris.lossless.enabled
true
无损上下线开关
spring.cloud.polaris.lossless.health-check-path
业务程序健康探测接口
spring.cloud.polaris.lossless.delay-register-interval
30000
无配置业务程序健康探测接口,延迟注册时间。默认 30000(单位ms)
spring.cloud.polaris.lossless.health-check-interval
5000
配置业务程序健康探测接口后,健康探测间隔。默认 5000(单位ms)
配置示例:
在项目的 main/resources 目录下 bootstrap.yml 文件配置:
spring:
application:
name: ${application.name}
cloud:
polaris:
address: grpc://${修改为Polaris 服务地址}:8091
namespace: default
# 以下为无损上下线的配置
lossless:
enabled: true
port: 28080
health-check-path: /
delay-register-interval: 300000
health-check-interval: 10000

方案二:服务注册就绪检查

通常 K8s 提供就绪检查机制来对实例在就绪前进行健康检查,它一般会简单地认为端口起来了应用即处于就绪状态。但是实际上,应用端口起来了和服务成功注册之间存在 gap,这样会造成服务没有成功注册,旧的应用实例就被下线,下一个节点开始部署。最终导致消费端调用异常。
TSE 北极星提供服务注册状态的接口和端口,以配合 K8s 就绪检查,当应用注册完成返回200状态码,帮助 K8s 判定应用已就绪;未完成注册返回500状态码,帮助 K8s 判定应用未就绪。尤其在实例滚动更新的过程中,等实例就绪后才滚动更新下一个节点。

操作步骤:

步骤1:服务通过 Spring Cloud Tencent 接入北极星服务注册与发现能力。具体步骤参见:Spring Cloud Tencent 接入北极星
步骤2:引入 spring cloud tencent 无损上下线插件依赖,并添加无损上下线相关配置。具体参见 方案一
步骤3:在容器服务 TKE 等 K8s 应用部署平台中配置就绪检查,如下图所示。
路径:/online。
端口:28080。




无损下线

应用在滚动发布或者下线过程中,被调方服务实例向注册中心发起反注册,主调方从注册中心更新 IP 的过程中,存在时间 gap,导致依然有可能调用到已经下线的实例,从而调用失败。
TSE 北极星提供服务无损下线的接口:/offline,结合 K8s 的生命周期,实现服务无损下线。整体流程如下:




操作步骤:

步骤1:服务通过 Spring Cloud Tencent 接入北极星服务注册与发现能力。具体步骤参见:Spring Cloud Tencent 接入北极星
步骤2:引入 spring cloud tencent 无损上下线插件依赖,并添加无损上下线相关配置。具体参见 方案一
步骤3:在容器服务 TKE 等 K8s 应用部署平台中配置 preStop 生命周期检查。
preStop 配置检查指令:curl -X PUT http://localhost:28080/offline && sleep 20