服务优雅上下线实现方案-运维

news2024/9/21 2:35:44

     1、前言

        前一篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查,基于这篇文章介绍一下服务优雅上下线的实现方案。

        对于微服务来说,服务的优雅上下线是必要的。对于上线来说,如果服务没有启动成功,就不应该对外暴露。对于下线来说,如果服务已经停止了,就应该保证已下线,避免上游流量进入不健康的机器。

        在项目升级的时候,绝大部分采用滚动升级的方式,需要停止一个旧的服务,然后启动一个新的服务,在这个过程中往往会出现服务的中断,那如何最大限度的做到发布的优雅,尽可能让升级的这个过程不影响到线上正在运行的业务,这时就需要实现服务的优雅上下线。

        服务的优雅上下线就是保证服务的稳定可用,避免流量中断,导致业务不可用。优雅上线其实就是等服务启动完全就绪后,对外提供服务,也叫无损发布,延迟暴露,服务预热。优雅下线其实就是在服务收到停机指令后,要先到注册中心注销,拒绝新的请求后,将旧的业务处理完成。

2、nginx作为服务的流量入口

        对于传统架构来说,后端服务常用nginx来做服务的入口或系统之间的交互。

3、应用服务使用注册中心

        同一个项目系统之间内部调用,使用注册中心的方式。如:zk、consul、eureka、nacos等。

4、服务优雅上线-运维

应用服务上线流程介绍:

① 执行启动脚本如:【sh server.sh start】,启动服务以java为例:【java -jar app.jar】

② 服务启动需要时间,先等待n秒,然后调用上线接口【http://127.0.0.1:port/ops/v1/on】,接口用来检测服务是否启动成功,若满足上线要求:如果涉及注册中心,则将服务注册到注册中心。

③ 更新接口【http://127.0.0.1:port/ops/v1/check】状态码,若第②部启动成功则更新成【200】,否则保持默认【599】。

④ 若【check】接口状态码非【200】,等待10秒,从新执行【on】接口,最多循环5次。

⑤ 若【check】接口状态码【200】,nginx根据【nginx_upstream_check_module】检查机制自动将服务上线,转发流量到此节点。

5、服务优雅下线-运维

应用服务下线流程介绍:

① 执行停止脚本【sh server.sh stop】,执行下线接口【http://127.0.0.1:port/ops/v1/down】,若服务涉及注册中心,则【down】接口自动调用相关接口将服务从注册中心下线。

② 下线接口执行成功后,同时更新【check】接口状态码为【404】,否则保持不变【200】

③ 当【check】接口状态码是非【200】时,nginx根据【nginx_upstream_check_module】检查机制自动从upstream中摘除,不再分发流量到此节点。

④ 当【check】接口状态码还是【200】时,从新执行第①步进行下线,最多循环10次。

⑤ 等待n秒(根据实际情况定),若有注册中心,虽然从注册中心摘除了节点,但是注册中心刷新列表需要时间,naocs:30s,以及让服务在这n秒内将之前进来的请求执行完毕(若执行不完,分析原因优化接口)。然后开始执行kill命令,先kill pid结束服务进程,n次kill不了服务,再kill -9 强制终止。

6、k8s 上下线思路

        基于上面的介绍,在k8s当中可以结合钩子函数探针资源对象实现pod的上下线。

        钩子函数:postStart 、 preStop

        k8s在主容器的启动之后和停止之前提供了两个钩子函数,钩子函数能够感知自身生命周期中的事件,并在相应的时刻运行用户指定的指令。

        探针

  • livenessProbe:存活性探针
  • readinessProbe:就绪性探针
  • startupProbe:启动探针

7、示例演示demo

1、下面是两个docker服务,端口:9091,9092

# docker ps -a | grep health
15cadf1009a6   registry.cn-beijing.aliyuncs.com/wl_666/app:health-check-v2   "/bin/bash start.sh"     2 weeks ago      Up 4 seconds                  0.0.0.0:9092->3000/tcp, :::9092->3000/tcp   tender_meninsky
2c691a9985bf   registry.cn-beijing.aliyuncs.com/wl_666/app:health-check-v1   "/bin/bash start.sh"     2 weeks ago      Up 4 seconds                  0.0.0.0:9091->3000/tcp, :::9091->3000/tcp   funny_diffie

2、服务接口信息如下:

# curl -s http://192.168.100.210:9091 | jq
{
  "/info": "服务运行信息",
  "/ops/v1/check": "健康检查接口状态",
  "/ops/v1/down": "服务下线",
  "/ops/v1/on": "服务上线",
  "describe": "请调用一下接口"
}

3、nginx配置如下:

# cat nginx_upstream_check.conf
upstream cluster{
    server 192.168.100.210:9091;
    server 192.168.100.210:9092;
    check interval=3000 rise=2 fall=2 timeout=3000 type=http;
    check_http_send "GET /ops/v1/check HTTP/1.0\r\n\r\n ";
    check_http_expect_alive http_2xx http_3xx;
}


server {
    listen       8888;
    server_name  localhost;
    #charset koi8-r;
    access_log  logs/nginx_upstream_check.log  main;

    location / {
        root   html;
        index  index.html;
    }

    location ^~ /nginxServer/ {
        proxy_pass http://cluster/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass_request_body on;
        proxy_set_header   Cookie $http_cookie;
        real_ip_header X-Real-IP;
    }

    location /nginx_status {
        check_status;
        access_log off;
    }
}

8、上线演示

1、服务刚启动还未调用上线接口时,nginx状态如下,通过nginx调用后端接口502。

# curl http://192.168.100.210:8888/nginxServer/info
<html>
<head><title>502 Bad Gateway</title></head>
<body>
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>

# curl -I http://192.168.100.210:8888/nginxServer/info
HTTP/1.1 502 Bad Gateway
Server:
Date: Wed, 07 Aug 2024 13:00:09 GMT
Content-Type: text/html
Content-Length: 150
Connection: keep-alive

2、将第一个服务上线后:

查看上线前的chek接口状态码
# curl -s http://192.168.100.210:9091/ops/v1/check  | jq
{
  "url": "/ops/v1/check",
  "url_code": "599",
  "time": "2024-08-07 21:03:13"
}
调用上线接口
[root@node-210 ~]# curl -s http://192.168.100.210:9091/ops/v1/on  | jq
{
  "url": "/ops/v1/on",
  "url_code": "200",
  "time": "2024-08-07 21:03:18"
}
调用上线后的check接口状态码
[root@node-210 ~]# curl -s http://192.168.100.210:9091/ops/v1/check  | jq
{
  "url": "/ops/v1/check",
  "url_code": "200",
  "time": "2024-08-07 21:03:21"
}

通过nginx调用后端接口
# curl -s http://192.168.100.210:8888/nginxServer/info | jq
{
  "time": "2024-08-07 21:05:27",
  "hostname": "2c691a9985bf",
  "ipaddress": "172.17.0.3",
  "version": "v1"
}

3、第二个服务同样方式上线

# curl -s http://192.168.100.210:9092/ops/v1/on  | jq
{
  "url": "/ops/v1/on",
  "url_code": "200",
  "time": "2024-08-07 21:06:42"
}

[root@node-210 ~]# curl -s http://192.168.100.210:9092/ops/v1/check  | jq
{
  "url": "/ops/v1/check",
  "url_code": "200",
  "time": "2024-08-07 21:06:52"
}

通过nginx调用后端接口:都会调用到了,注意返回version字段

[root@node-210 ~]# curl -s http://192.168.100.210:8888/nginxServer/info | jq
{
  "time": "2024-08-07 21:07:48",
  "hostname": "2c691a9985bf",
  "ipaddress": "172.17.0.3",
  "version": "v1"
}
[root@node-210 ~]# curl -s http://192.168.100.210:8888/nginxServer/info | jq
{
  "time": "2024-08-07 21:07:50",
  "hostname": "15cadf1009a6",
  "ipaddress": "172.17.0.2",
  "version": "v2"
}

9、下线演示

1、下线一个服务

下线前check接口状态码:200
[root@node-210 ~]# curl -s http://192.168.100.210:9092/ops/v1/check  | jq
{
  "url": "/ops/v1/check",
  "url_code": "200",
  "time": "2024-08-07 21:11:00"
}

调用下线接口
[root@node-210 ~]# curl -s http://192.168.100.210:9092/ops/v1/down  | jq
{
  "url": "/ops/v1/down",
  "url_code": "404",
  "time": "2024-08-07 21:11:08"
}
下线后check接口状态码:404
[root@node-210 ~]# curl -s http://192.168.100.210:9092/ops/v1/check  | jq
{
  "url": "/ops/v1/check",
  "url_code": "404",
  "time": "2024-08-07 21:11:12"
}

nginx已经从upstream中将此节点摘除了

文章多多少少会有不足的地方,请多多见谅!ღ ღ ღ ღ ღ

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

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

相关文章

sqli-labs-master 25-30关

sqli-labs第25关 由本题意可得过滤and和or&#xff0c;我用双写进行绕过&#xff0c;例如&#xff1a;infoorrmation,aandnd 数据库名 http://127.0.0.1/sqli-labs-master/Less-25/?id-1%27%20union%20select%201,2,database()-- 表名 127.0.0.1/sqli-labs-master/Less-25…

24/8/7算法笔记 决策树分类

决策树是一种常用的机器学习算法&#xff0c;用于分类和回归任务。它通过学习简单的决策规则从数据特征中推断出目标值。以下是决策树的一些关键特点&#xff1a; 树形结构&#xff1a;决策树由一系列的问题组成&#xff0c;每个问题对应一个特征和可能的取值。这些问题按照树状…

orcad和allegro无法交互的解决方案

当Orcad和Allegro无法交互时&#xff0c;可能是由于多种原因导致的。以下是一些常见的解决方案&#xff0c;旨在帮助用户解决这一问题&#xff1a; 1. 检查并设置Enable Intertool Communication选项 首先&#xff0c;确保在Orcad Capture CIS中启用了“Enable Intertool Com…

ORM工具之SQLAlchemy

SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;使用MIT许可证发行。 SQLAlchemy“采用简单的Python语言&#xff0c;为高效和高性能的数据库访问设计&#xff0c;实现了完整的企业级持久模型”。SQL…

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

这段代码中出现的异常 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection 通常是因为客户端尝试通过非加密连接发起 HTTPS 请求&#xff0c;而服务器期望的是加密的 SSL/TLS 连接。 这个异常可能是因为以下几种情况之一&#xff1a; HTTPS 服务配置…

Element-Plus组件Tree树形控件时,传输失去父节点和回显父节点下的子节点全选问题解决

使用环境 Vue 3 in Vite Element-Plus JS语法&#xff08;非TS&#xff09; 问题描述&#xff1a; 在使用Element-Plus组件Tree树形控件时&#xff0c;会出现如下问题&#xff1a; 1、子节点未全选时&#xff0c;往后端传输的选中节点没有包含父节点。 如下图&#xff0c;…

学习大数据DAY33 Flask 库 API 开发介绍,OS 库,pandas 库和简单爬虫

目录 Python API 接口开发用法介绍 Postman 调试接口 OS 库 pandas Pandas 数据结构 - Series Pandas 处理数据方法 Pandas CSV 文件 Pandas JSON Pandas excel 文件 上机练习 11 爬虫 爬取所有数据 pandas 分析处理数据 导入到 mysql 上机练习 12---使用爬虫pan…

Ubuntu 24.04 LTS安装elasticsearch-8.14.3+Kibana

1.安装Elasticsearch 1.1 下载Elasticsearch # 1. 更新包索引 sudo apt update# 2. 升级已安装的软件包 sudo apt upgrade -y# 3. 进入 /opt 目录 cd /opt# 4. 下载Elasticsearch压缩包 sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.…

国产化飞腾D2000独显可插拔式OPS电脑主板,应用于信创教育、信创会议、信创办公等领域

国产化飞腾D2000 主板规格书 产品概述 XM-F611是我司自主研发设计的一款独显可插拔式OPS电脑主板&#xff0c;符合Intel OPS(Open Pluggable Specification)标准规范。采用飞腾腾锐D2000八核处理器加国产独立显卡&#xff0c;搭配国产银河麒麟或统信操作系统&#xff0c;能够…

sparkhive--练习2

需求&#xff1a; 在hive中创建对应表&#xff0c;并且导入数据&#xff0c;使用spark完成对应的查询 stu_name course score 张三 语文 98 张三 数学 95 张三 英语 89 李四 语文 97 李四 数学…

【天数计算】输入某年某月某日,判断这一天是这一年的第几天

要求&#xff1a;输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff0c;使用C语言实现 #include<stdio.h>int dayYear(int year,int month,int day){int days_in_month[] {0,31,28,31,30,31,30,31,31,30,31,30,31};int i,days0;for(i1;i<month;i){da…

分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost

分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost 文章目录 前言分类预测|基于粒子群优化核极限学习机的Adaboost集成模型数据分类预测Matlab程序 PSO-KELM-Adaboost 一、PSO-KELM-Adaboost模型1. 核化极限学习机 (KELM)2. 粒子…

5G边缘计算网关应用

在信息技术浪潮的推动下&#xff0c;5G网络与边缘计算的结合正快速地推动着人们步入一个前所未有的智能生活新纪元。5G边缘计算网关作为两者融合的重要枢纽&#xff0c;其应用领域的拓展和优势表现越来越受到企业和行业的重视。      5G边缘计算网关的技术背景   5G网络为…

WEB应用(十三)---RCE

什么是RCE&#xff1f; Remote Command/Code Execute&#xff0c;远程命令或代码执行。通过构造特殊的字符串&#xff0c;将数据提交至Web应用程序&#xff0c;并利用该方式执行外部程序或系统命令实施攻击&#xff0c;类似于SQL注入。 Web应用程序使用了一些可以执行系统命令或…

多变量时间序列生成模型GAN介绍与实现

目录 1. 模型介绍2. 问题提出3. 模型具体实现3.1 数据预处理3.2 生成对抗网络&#xff08;GAN&#xff09;结构3.3 模式崩溃解决3.4 合成数据验证 4. 代码实现参考文献 1. 模型介绍 在大数据时代&#xff0c;生成逼真的时间序列数据对于负载平衡、负载预测和智能资源配置等方面…

openwrt 性能工具perf和cpu占用查看工具sysstat编译及使用

代码使用的lean源码&#xff0c;只需要用make menuconfig打开perf对应的编译选项即可 1.第一步选择Global build settings 2.第二步选择Kernel build options 3.第三步选择Enable kernel cgroups 4.第四步选择Enable perf_event per-cpu per-container group (cgroup) monitor…

计算机网络-CSP初赛知识点整理

历年真题 [2016-NOIP-普及-第3题] 以下不属于无线通信技术的是( ) A. 蓝牙 B. Wifi C. GPRS D. 以太网 [2015-NOIP-普及-第10题] FTP 可以用于( )。 A. 远程传输文件 B. 发送电子邮件 C. 浏览网页 D. 网上聊天 [2019-CSP-J-第1题] 中国的国家顶级域名是( ). A. .cn B. .ch C.…

国内自闭症学校指南:了解孩子的康复需求和解决方案

在国内&#xff0c;自闭症儿童的数量逐年增加&#xff0c;为他们提供专业的教育和康复支持变得至关重要。对于家长来说&#xff0c;选择一所合适的自闭症学校是帮助孩子走向康复的关键一步。在众多的选择中&#xff0c;星贝育园以其独特的优势和全面的服务脱颖而出。 当孩子被诊…

android系统中data下的xml乱码无法查看问题剖析及解决方法

背景&#xff1a; Android12高版本以后系统生成的很多data路径下的xml都变成了二进制类型&#xff0c;根本没办法看xml的内容具体如下&#xff1a; 比如想要看当前系统的widget的相关数据 ./system/users/0/appwidgets.xml 以前老版本都是可以直接看的&#xff0c;这些syste…

Cxx primer-chap13-Copy Control

copy控制涉及类的五个成员函数&#xff1a;&#xff0c;这五个成员函数被显式或隐式的被调用&#xff0c;各司其职&#xff1a;我们必须根据类的实际情况来确定是否需要显式定义这些成员函数&#xff1a;什么是拷贝构造函数呢&#xff1f;简单讲就是该函数的第一个形参是refere…