K8S下微服务平滑发布的一些思考与总结

目录

0. 平滑发布的概念解释

1. k8s的下一些知识点

2. Springboot 健康检查

3. ribbon的客户端负载均衡机制

4. 实现方案一

5. 实现方案二

6. 参考


0. 平滑发布的概念解释

在发布工程中,老的版本所有的请求处理完毕,新的请求正确的请求到新的节点上这里会涉及到新的几个问题;

a. 老服务能否将请求都出完成; 包括线程池正常的关闭,已经拉取mq正常都处理完成等

b. 新的请求不会请求到老的节点上

发布系统包括k8s如何下线一个应用,再销毁这个容器呢?

kill SIGTERM pid

kill SIGTERM 会做什么呢 ? 

系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情

  1. 程序立刻停止
  2. 当程序释放相应资源后再停止
  3. 程序可能仍然继续运行

      大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以

      配置的。如果程序正在等待IO,可能就不会立马做出相应。

  也就是说,SIGTERM多半是会被阻塞的、忽略。

1. k8s的下一些知识点

livenessProbe: 用于探测pod节点是否存活一个endpoint

readinessProbe: 用于探测pod 节点是否ready 的endpoint

terminationGracePeriodSeconds: deployment 中设置停止pod前等待时间(默认30s)

k8s pod lifecycle生命周期相关:

可以设置 preStop 与 preStart

lifecycle:postStartEnabled: falsepreStop:exec:command:- "/bin/sh"- "-cx"- "curl http://127.0.0.1:8080/springboot-demo/offline"- "sleep 20s"preStopEnabled: true

2. Springboot 健康检查

添加actuator依赖,默认会暴露health 相关接口
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

访问/actuator/health 可以查看详细的信息,结合k8s 的readinessProbe ,可以做到等到服务启动成功,再将流量请求到该pod; 

{"status": "UP","details": {"diskSpace": {"status": "UP","details": {"total": 2945792487424,"free": 2424665210880,"threshold": 10485760}},"mongo": {"status": "UP","details": {"version": "4.0.22"}},"db": {"status": "UP","details": {"ouserDataSource": {"status": "UP","details": {"database": "MySQL","hello": 1}},"readDataSource": {"status": "UP","details": {"database": "MySQL","hello": 1}},"writeDataSource": {"status": "UP","details": {"database": "MySQL","hello": 1}},"oscDataSourceRead": {"status": "UP","details": {"database": "MySQL","hello": 1}},"oscDataSourceWrite": {"status": "UP","details": {"database": "MySQL","hello": 1}},"ouserFilterDataSourceRead": {"status": "UP","details": {"database": "MySQL","hello": 1}},"ouserFilterDataSourceWrite": {"status": "UP","details": {"database": "MySQL","hello": 1}},"miscDataSource": {"status": "UP","details": {"database": "MySQL","hello": 1}}}},"refreshScope": {"status": "UP"},"discoveryComposite": {"status": "UP","details": {"discoveryClient": {"description": "Discovery Client not initialized","status": "UNKNOWN"},"zookeeper": Object{...}}},"zookeeper": {"status": "UP","details": {"connectionString": "127.0.0.1:2181","state": "STARTED"}},"redis": {"status": "UP","details": {"version": "4.0.14"}}}
}

3. ribbon的客户端负载均衡机制

ribbon 客户端缓存所有的生产者服务的节点信息;源码分析见本人的另外一篇博客: https://caicongyang.blog.csdn.net/article/details/125954437?spm=1001.2014.3001.5502

springboot3.x 版本的loadbalan客户端原理也类似;

可以通过配置ribbon.ServerListRefreshInterval = 5000 修改ribbon去nacos 或者eurka 等注册中心的刷新频率

4. 实现方案一

在eurka 或者zookeeper作为注册中心的过程中,可以结合k8s 的lifecycle,在prestop 的时候,提前讲微服务从注册中心提前下线,并且设置terminationGracePeriodSeconds 大于ribbon.ServerListRefreshInterval 的时间,从而保证服务下线之前,各个调用该服务的调用方的缓存已经更新;

5. 实现方案二

nacos作为注册中心时,可以通过监听Subscriber<InstancesChangeEvent> 实例变更事件,来更新ribbon 的客户端缓存,从而保证新的请求不会请求到老的节点;

import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.client.naming.event.InstancesChangeEvent;
import com.alibaba.nacos.common.notify.Event;
import com.alibaba.nacos.common.notify.NotifyCenter;
import com.alibaba.nacos.common.notify.listener.Subscriber;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
import lombok.extern.slf4j.Slf4j;import org.springframework.cloud.netflix.ribbon.SpringClientFactory;import java.util.Optional;@Slf4j
public class RibbonServiceChangeNotifier extends Subscriber<InstancesChangeEvent> {@Resourceprivate SpringClientFactory springClientFactory;@PostConstructpublic void init() {// 注册当前自定义的订阅者以获取通知NotifyCenter.registerSubscriber(this);}@Overridepublic void onEvent(InstancesChangeEvent event) {String serviceName = event.getServiceName();// 使用 dubbo 时包含 rpc 服务类会注册以 providers: 或者 consumers: 开头的服务// 由于不是正式的服务, 这里需要进行排除, 如果未使用 dubbo 则不需要该处理if (serviceName.contains(":")) {return;}// serviceName 格式为 groupName@@nameString split = Constants.SERVICE_INFO_SPLITER;if (serviceName.contains(split)) {serviceName = serviceName.substring(serviceName.indexOf(split) + split.length());}log.info("服务上下线: {}", serviceName);// 针对服务进行后续更新操作// 如果自定义负载均衡方式则将默认的 ZoneAwareLoadBalancer 替换为自己的实现即可Optional.ofNullable(springClientFactory.getLoadBalancer(serviceName)).ifPresent(loadBalancer ->((ZoneAwareLoadBalancer<?>) loadBalancer).updateListOfServers());}@Overridepublic Class<? extends Event> subscribeType() {return InstancesChangeEvent.class;}}

6. 参考

Nacos 实现服务平滑上下线(Ribbon 和 LB)-WinFrom控件库|.net开源控件库|HZHControls官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot打造企业级进销存储系统 第五讲

package com.java1234.repository;import com.java1234.entity.Menu; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;import java.util.List;/*** 菜单Repository接口*/ public interface MenuReposit…

第二百零五回

文章目录 概念介绍响应方法滑动事件点击事件 经验总结 我们在上一章回中介绍了如何给ListView添加分隔线,本章回中将介绍ListView响应事件相关的知识.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的ListView响应事件主要分两种类型&#xff0c;一种…

【深度学习模型移植】用torch普通算子组合替代torch.einsum方法

首先不得不佩服大模型的强大之处&#xff0c;在算法移植过程中遇到einsum算子在ONNX中不支持&#xff0c;因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法&#xff0c;但是该方法会…

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备&#xff0c;主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作&#xff1a;防火墙配置若干条防火墙规则&#xff0c;当IP包到来&#xff0c;防火墙根据包的五元组属性&#xff08;协…

Python学习笔记之math库的使用

一、平方&#xff0c;m的n次方 math.pow(x, y)是返回x的y次幂 语法 import matha math.pow(3, 2)print(3的2次方, a)# 输出结果为3的2次幂&#xff0c;为9二、开平方 math.sqrt(x)返回x的算术平方根 语法 import mathb 100print(math.sqrt(b)) # 输出结果为10 三、弧度制与…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

【MatLab】之:Simulink安装

一、内容简介 本文介绍如何在 MatLab 中安装 Simulink 仿真工具包。 二、所需原材料 MatLab R2020b&#xff08;教学使用&#xff09; 三、安装步骤 1. 点击菜单中的“附加功能”&#xff0c;进入附加功能管理器&#xff1a; 2. 在左侧的“按类别筛选”下选择Using Simulin…

Linux网络编程: IP协议详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

购票小程序有哪些功能

​通过小程序购买电子票&#xff0c;然后在使用时&#xff0c;出示电子票二维码&#xff0c;由商家进行验证/核销。通过小程序购票和核销&#xff0c;使得整个流程非常顺利&#xff0c;免去了线下购票的繁琐&#xff0c;而且还容易遗失。下面我们就来具体看一下小程序如何进行购…

3月16日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 广汽传祺官宣加入华为鸿蒙生态 &#x1f30d; 国家数据局&#xff1a;加快构建全国一体化算力网 推动建设中国式现代化数字基座 &#x1f30b; 中国首个超深气田累产天然气突破800亿立方米 &#x1f381; 东方甄选客服回…

Postman进行Websocket接口测试

Postman进行Websocket接口测试 前言下载地址使用1、new一个一个WebSocket Request2、填写内容和需要请求头携带的参数3、表示成功 网页请求101表示握手成功 前言 有些较低版本postman不支持websocket接口测试&#xff0c;如果根据此文未找到创建websocket接口测试的目录&#…

c语言:于龙加

于龙加 任务描述 于龙同学设计了一个特别的加法规则&#xff0c;加法被重新定义了&#xff0c;我们称为于龙加。 两个非负整数的于龙加的意义是将两个整数按前后顺序连接合并形成一个新整数。 于龙想编程解决于龙加问题&#xff0c;可是对下面的程序他没有思路&#xff01; …

面向对象(C# )

面向对象&#xff08;C# &#xff09; 文章目录 面向对象&#xff08;C# &#xff09;ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…

Qt 鼠标滚轮示例

1.声明 void wheelEvent(QWheelEvent *event) override;2.实现&#xff08;方便复制、测试起见用静态变量&#xff09; #include <mutex> void MainWindow::wheelEvent(QWheelEvent *event) {static QLabel *label new QLabel("Zoom Level: 100%", this);st…

elementUi中表格超出一行省略,鼠标放入显示完整提示

一、想要的效果 二、代码&#xff0c;加入show-overflow-tooltip即可 <el-table-column min-width"220" prop"content" show-overflow-tooltip> </el-table-column>

在Windows电脑上跑linux用双系统、虚拟机还是WSL?

文章目录 1. Main2. 总结Reference 1. Main 在windows上升级Docker desktop, 升级完之后提示支持WSL。WSL是指windows subsystem for linux, 那么它和虚拟机上的linux有什么区别和优劣势呢&#xff1f; 在没有虚拟化技术出现之前&#xff0c;如果用户想在同一台电脑上使用lin…

PCB设计中的MARKER

今天在给板子布局的时候发现了一个这样的东西&#xff0c;名叫MARKER&#xff0c;查了一下这个东西分享一下&#xff1a; 目录 MARKER是什么样的&#xff1f; MARKER的用途&#xff1a; MARKER是必须的吗&#xff1f; MARKER是什么样的&#xff1f; 他在PCB中是这样的&…

记一下mysql安装过程中遇到的报错解决

执行mysql8.0.34安装过程中的&#xff1a;bin/mysqld --initialize --usermysql 步骤时报错。 报错1&#xff1a;bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory 解决&#xff1a; centos&…

web 课程

文章目录 格式图片超链接书签链接表格例子横跨束跨 格式 <br /> <br/> #换行图片 <img> 标签是用于在网页中嵌入图像的 HTML 标签&#xff0c;它有一些属性可以用来控制图像的加载、显示和交互。以下是对 <img> 标签常用属性的详细介绍&#xff1a;…

MySQL基础架构

文章目录 MySQL基础架构一、连接器 - 建立连接&#xff0c;权限认证二、查缓存 - 提高效率三、分析器 - 做什么四、优化器 - 怎么做五、执行器 - 执行语句六、存储引擎1、存储引擎的概述2、存储引擎的对比3、存储引擎的命令4、存储引擎的选择 MySQL基础架构 大体来说&#xff…