微服务应用实现无损上下线实践

简介:本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。

本文是阿里云微服务引擎MSE在应用发布时提供的无损上下线和服务预热能力最佳实践介绍。假设应用的架构由Zuul网关以及后端的微服务应用实例(Spring Cloud)构成。具体的后端调用链路有购物车应用A,交易中心应用B,库存中心应用C,这些应用中的服务之间通过Nacos注册中心实现服务注册与发现。

前提条件

开启 MSE 微服务治理

  • 已创建Kubernetes集群,请参见创建Kubernetes托管版集群。
  • 已开通MSE微服务治理专业版,请参见开通MSE微服务治理。

背景信息

很多用户量大并发度高的应用系统为了避免发布过程中的流量有损一般选择在流量较小的半夜发布,虽然这样做有效果,但不可控导致背后的研发运维人员经常因为发布问题时常搞得半夜胆战心惊,心力疲惫。基于此,阿里云微服务引擎MSE通过在应用发布过程中,通过应用下线主动实时注销,应用上线健康就绪检查与生命周期对齐以及服务预热等技术手段所提供的微服务应用无损上下线发布功能,让研发运维人员即使是在白天发布应用,也能风轻云淡。

准备工作

注意,本实践所使用的 Agent 目前还在灰度中,需要对应用 Agent 进行灰度升级,升级文档:灰度升级微服务治理Agent - 微服务引擎MSE - 阿里云

应用部署在不同的Region(暂时仅支持国内region)请使用对应的Agent下载地址:http://arms-apm-cn-[regionId].oss-cn-[regionId].aliyuncs.com/2.7.1.3-mse-beta/,注意替换地址中的[regionId],regionId是阿里云regionId,

例如Region北京Agent 地址为:http://arms-apm-cn-beijing.oss-cn-beijing.aliyuncs.com/2.7.1.3-mse-beta/

应用部署流量架构图

流量压力来源

spring-cloud-zuul应用中,每个 pod 具备并发为 10 的访问本地 zuul 端口的 127.0.0.1:20000:/A/a 的http请求流量。可以通过环境变量 demo.qps 配置并发数。

部署 Demo 应用程序

将下面的内容保存到一个文件中,假设取名为 mse-demo.yaml,并执行 kubectl apply -f mse-demo.yaml 以部署应用到提前创建好的Kubernetes集群中(注意因为demo中有CronHPA任务,所以请先在集群中安装 ack-kubernetes-cronhpa-controller 组件,具体在容器服务-Kubernetes->市场->应用目录中搜索组件在测试集群中进行安装),这里我们将要部署 Zuul,A, B 和 C 三个应用,其中 A、B 两个应用分别部署一个基线版本和一个灰度版本,B应用的基线版本关闭了无损下线能力,灰度版本开启了无损下线能力。C应用开启了服务预热能力,其中预热时长为120秒。

# Nacos Server

---

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: nacos-server

 name: nacos-server

spec:

 replicas: 1

 selector:

   matchLabels:

     app: nacos-server

 template:

   metadata:

     labels:

       app: nacos-server

   spec:

     containers:

     - env:

       - name: MODE

         value: standalone

       image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest

       imagePullPolicy: Always

       name: nacos-server

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

     dnsPolicy: ClusterFirst

     restartPolicy: Always

# Nacos Server Service 配置

---

apiVersion: v1

kind: Service

metadata:

 name: nacos-server

spec:

 ports:

 - port: 8848

   protocol: TCP

   targetPort: 8848

 selector:

   app: nacos-server

 type: ClusterIP

#入口 zuul 应用

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: spring-cloud-zuul

spec:

 replicas: 1

 selector:

   matchLabels:

     app: spring-cloud-zuul

 template:

   metadata:

     annotations:

       msePilotCreateAppName: spring-cloud-zuul

     labels:

       app: spring-cloud-zuul

   spec:

     containers:

       - env:

           - name: JAVA_HOME

             value: /usr/lib/jvm/java-1.8-openjdk/jre

           - name: LANG

             value: C.UTF-8

         image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.1

         imagePullPolicy: Always

         name: spring-cloud-zuul

         ports:

           - containerPort: 20000

# A 应用 base 版本,开启按照机器纬度全链路透传

---

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: spring-cloud-a

 name: spring-cloud-a

spec:

 replicas: 2

 selector:

   matchLabels:

     app: spring-cloud-a

 template:

   metadata:

     annotations:

       msePilotCreateAppName: spring-cloud-a

       msePilotAutoEnable: "on"

     labels:

       app: spring-cloud-a

   spec:

     containers:

     - env:

       - name: LANG

         value: C.UTF-8

       - name: JAVA_HOME

         value: /usr/lib/jvm/java-1.8-openjdk/jre

       - name: profiler.micro.service.tag.trace.enable

         value: "true"

       image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT

       imagePullPolicy: Always

       name: spring-cloud-a

       ports:

       - containerPort: 20001

         protocol: TCP

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

       livenessProbe:

         tcpSocket:

           port: 20001

         initialDelaySeconds: 10

         periodSeconds: 30

     

# A 应用 gray 版本,开启按照机器纬度全链路透传

---            

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: spring-cloud-a-gray

 name: spring-cloud-a-gray

spec:

 replicas: 2

 selector:

   matchLabels:

     app: spring-cloud-a-gray

 strategy:

 template:

   metadata:

     annotations:

       alicloud.service.tag: gray

       msePilotCreateAppName: spring-cloud-a

       msePilotAutoEnable: "on"

     labels:

       app: spring-cloud-a-gray

   spec:

     containers:

     - env:

       - name: LANG

         value: C.UTF-8

       - name: JAVA_HOME

         value: /usr/lib/jvm/java-1.8-openjdk/jre

       - name: profiler.micro.service.tag.trace.enable

         value: "true"

       image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT

       imagePullPolicy: Always

       name: spring-cloud-a-gray

       ports:

       - containerPort: 20001

         protocol: TCP

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

       livenessProbe:

         tcpSocket:

           port: 20001

         initialDelaySeconds: 10

         periodSeconds: 30

           

# B 应用 base 版本,关闭无损下线能力

---

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: spring-cloud-b

 name: spring-cloud-b

spec:

 replicas: 2

 selector:

   matchLabels:

     app: spring-cloud-b

 strategy:

 template:

   metadata:

     annotations:

       msePilotCreateAppName: spring-cloud-b

       msePilotAutoEnable: "on"

     labels:

       app: spring-cloud-b

   spec:

     containers:

     - env:

       - name: LANG

         value: C.UTF-8

       - name: JAVA_HOME

         value: /usr/lib/jvm/java-1.8-openjdk/jre

       - name: micro.service.shutdown.server.enable

         value: "false"

       - name: profiler.micro.service.http.server.enable

         value: "false"

       image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT

       imagePullPolicy: Always

       name: spring-cloud-b

       ports:

       - containerPort: 8080

         protocol: TCP

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

       livenessProbe:

         tcpSocket:

           port: 20002

         initialDelaySeconds: 10

         periodSeconds: 30

           

# B 应用 gray 版本,默认开启无损下线功能

---

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: spring-cloud-b-gray

 name: spring-cloud-b-gray

spec:

 replicas: 2

 selector:

   matchLabels:

     app: spring-cloud-b-gray

 template:

   metadata:

     annotations:

       alicloud.service.tag: gray

       msePilotCreateAppName: spring-cloud-b

       msePilotAutoEnable: "on"

     labels:

       app: spring-cloud-b-gray

   spec:

     containers:

     - env:

       - name: LANG

         value: C.UTF-8

       - name: JAVA_HOME

         value: /usr/lib/jvm/java-1.8-openjdk/jre

       image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT

       imagePullPolicy: Always

       name: spring-cloud-b-gray

       ports:

       - containerPort: 8080

         protocol: TCP

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

       lifecycle:

           preStop:

             exec:

               command:

                 - /bin/sh

                 - '-c'

                 - >-

                   wget http://127.0.0.1:54199/offline 2>/tmp/null;sleep

                   30;exit 0

       livenessProbe:

         tcpSocket:

           port: 20002

         initialDelaySeconds: 10

         periodSeconds: 30

           

# C 应用 base 版本

---

apiVersion: apps/v1

kind: Deployment

metadata:

 labels:

   app: spring-cloud-c

 name: spring-cloud-c

spec:

 replicas: 2

 selector:

   matchLabels:

     app: spring-cloud-c

 template:

   metadata:

     annotations:

       msePilotCreateAppName: spring-cloud-c

       msePilotAutoEnable: "on"

     labels:

       app: spring-cloud-c

   spec:

     containers:

     - env:

       - name: LANG

         value: C.UTF-8

       - name: JAVA_HOME

         value: /usr/lib/jvm/java-1.8-openjdk/jre

       image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT

       imagePullPolicy: Always

       name: spring-cloud-c

       ports:

       - containerPort: 8080

         protocol: TCP

       resources:

         requests:

           cpu: 250m

           memory: 512Mi

       livenessProbe:

         tcpSocket:

           port: 20003

         initialDelaySeconds: 10

         periodSeconds: 30

#HPA 配置

---

apiVersion: autoscaling.alibabacloud.com/v1beta1

kind: CronHorizontalPodAutoscaler

metadata:

 labels:

   controller-tools.k8s.io: "1.0"

 name: spring-cloud-b

spec:

  scaleTargetRef:

     apiVersion: apps/v1beta2

     kind: Deployment

     name: spring-cloud-b

  jobs:

  - name: "scale-down"

    schedule: "0 0/5 * * * *"

    targetSize: 1

  - name: "scale-up"

    schedule: "10 0/5 * * * *"

    targetSize: 2

---

apiVersion: autoscaling.alibabacloud.com/v1beta1

kind: CronHorizontalPodAutoscaler

metadata:

 labels:

   controller-tools.k8s.io: "1.0"

 name: spring-cloud-b-gray

spec:

  scaleTargetRef:

     apiVersion: apps/v1beta2

     kind: Deployment

     name: spring-cloud-b-gray

  jobs:

  - name: "scale-down"

    schedule: "0 0/5 * * * *"

    targetSize: 1

  - name: "scale-up"

    schedule: "10 0/5 * * * *"

    targetSize: 2

---

apiVersion: autoscaling.alibabacloud.com/v1beta1

kind: CronHorizontalPodAutoscaler

metadata:

 labels:

   controller-tools.k8s.io: "1.0"

 name: spring-cloud-c

spec:

  scaleTargetRef:

     apiVersion: apps/v1beta2

     kind: Deployment

     name: spring-cloud-c

  jobs:

  - name: "scale-down"

    schedule: "0 2/5 * * * *"

    targetSize: 1

  - name: "scale-up"

    schedule: "10 2/5 * * * *"

    targetSize: 2

# zuul 网关开启 SLB 暴露展示页面  

---    

apiVersion: v1

kind: Service

metadata:

 name: zuul-slb

spec:

 ports:

   - port: 80

     protocol: TCP

     targetPort: 20000

 selector:

   app: spring-cloud-zuul

 type: ClusterIP

# a 应用暴露 k8s service

---

apiVersion: v1

kind: Service

metadata:

 name: spring-cloud-a-base

spec:

 ports:

   - name: http

     port: 20001

     protocol: TCP

     targetPort: 20001

 selector:

   app: spring-cloud-a

---

apiVersion: v1

kind: Service

metadata:

 name: spring-cloud-a-gray

spec:

 ports:

   - name: http

     port: 20001

     protocol: TCP

     targetPort: 20001

 selector:

   app: spring-cloud-a-gray

# Nacos Server SLB Service 配置

---

apiVersion: v1

kind: Service

metadata:

 name: nacos-slb

spec:

 ports:

 - port: 8848

   protocol: TCP

   targetPort: 8848

 selector:

   app: nacos-server

 type: LoadBalancer

结果验证一:无损下线功能

由于我们对spring-cloud-b跟spring-cloud-b-gray应用均开启了定时HPA,模拟每5分钟进行一次定时的扩缩容。

登录MSE控制台,进入微服务治理中心->应用列表->spring-cloud-a->应用详情,从应用监控曲线,我们可以看到spring-cloud-a应用的流量数据:

gray版本的流量在pod扩缩容的过程中请求错误数为0,无流量损失。未打标的版本由于关闭了无损下线功能,在pod扩缩容的过程中有20个从spring-cloud-a发到spring-cloud-b的请求出现报错,发生了请求流量损耗。

结果验证二:服务预热功能

我们在 spring-cloud-c 应用开启了定时HPA 模拟应用启动的过程,每隔5分钟做一次伸缩,在第2分钟第0秒缩容到1个节点,在第2分钟第10秒扩容到2个节点。

在预热应用的消费端 spring-cloud-b开启服务预热功能。

在预热应用的服务提供端 spring-cloud-c开启服务预热功能。预热时长配置为 120 秒。

观察节点的流量,发现节点流量缓慢上升。并且能看到节点的预热开始和结束时间,以及相关的事件。

从上图可以看到开启预热功能的应用重启后的流量会随时间缓慢增加,在一些应用启动过程中需要预建连接池和缓存等资源的慢启动场景,开启服务预热能有效保护应用启动过程中缓存资源有序创建保障应用安全启动并做到流量无损。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

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

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

相关文章

计算机策划知识竞赛有创意的主题,【社团活动】首届创意·科技文化节--第八届计算机趣味知识竞赛决赛...

就21世纪而言,计算机莫过于是至今最成功的创新,作为计算机科学系的学子们担当着社会的前行者,从语言不和的英文代码,到逻辑化的函数循环,甚至有人开玩笑高呼着“c从入门到放弃”。谁又忍心让大家始终学习在枯燥中呢&am…

3月2日,阿里云开源 PolarDB 企业级架构即将发布

简介:2022年3月2日,开源 PolarDB 企业级架构将迎来重磅发布!本次发布会将首次公开开源 PolarDB 的总体结构设计和企业级特性,对 PolarDB for PostgreSQL 的存储计算分离架构、HTAP架构、三节点高可用架构进行全面介绍。 2021年&a…

产学研专家共议中国金融机构数字化转型,“守正创新”成主基调

《中国金融机构数字化转型》白皮书同期发布。 7月12日,由华为云与《清华金融评论》联合主办,清华五道口“数字中国”企业家课程项目提供学术支持的《中国金融机构数字化转型》专题研讨会在线上举办,并在央视财经等平台直播。研讨会邀请到多位…

极速生成缩略图,Serverless 支撑赛事转播锁定冬奥亮点

简介:阿里云函数计算(FC)支撑用户开发赛事视频截图的核心业务代码,实现了弹性高可用免运维的直播视频截图服务,满足用户开发成本低、一键部署的业务需求,比赛期间完美支撑视频转播实时锁定冬奥亮点。 作者…

html拼接日期,html日期加减

//显示某年某月某日function getForecastTime(date) {date new Date(date);var nDate date.getFullYear() "年";nDatedate.getMonth() 1 "月" date.getDate() "日";return nDate;}//日期加减function dateChange(num, date) {debugger;if…

“电信级”运行多年,亚信科技推出核心交易数据库AntDB7.0

亚信科技AntDB数据库为全国24个省份的10亿多用户提供7*24小时实时在线服务,已在通信运营商核心系统持续稳定运行多年。同时,AntDB在金融、交通、能源、公共服务等多个领域商用落地。 数字化浪潮和信创的趋势下,国产数据库市场迎来了快速发展期…

关于质量标准化的思考和实践

简介:最近部门在推质量标准化,通过质量标准化,推动质量内建,从而提高研发部门的交付质量,作者深度参与其中,并在推进过程中总结了一些经验以及思考,在此通过以下定义、共识、实践三个大方向和大…

计算机科学与因果关系,计算机科学与技术

摘要:In order to improve the detection reliability of effective connectivity in brain network, an fMRI (Functional Magnetic Resonance Imaging) analytical approach of effective connectivity is proposed based on the Granger causality (GC) and the …

看懂这5幅图,研发效能分析和改进就容易了

简介:作为 CTO 或企业管理者,我们如何去了解和衡量研发团队的研发效能呢?作为 PMO 和效能负责人,我们该从哪几个维度来回答关于研发效能的问题呢?如何通过效能数据分析,帮助企业管理者透明化研发效能水平和…

关于挂载存储的这个小细节,值得你关注一下

作者 | 江小南来源 | 江小南和他的小伙伴们引言前两天,公司有个同事跑过来问我一件事:我在制作镜像的时候明明把文件已经放到镜像里面去了,为什么kubernetes部署应用的时候文件没有了?听完这话,我看了看Dockerfile是这…

PolarDB 并行查询的前世今生

简介:本文会深入介绍PolarDB MySQL在并行查询这一企业级查询加速特性上做的技术探索、形态演进和相关组件的实现原理,所涉及功能随PolarDB MySQL 8.0.2版本上线。 作者 | 遥凌 来源 | 阿里技术公众号 本文会深入介绍PolarDB MySQL在并行查询这一企业级查…

上海音乐学院计算机基础,上海音乐学院

2018年(第11届)中国大学生计算机设计大赛计算机音乐创作类决赛于8月26日—30日在浙江音乐学院举行,上海音乐学院音乐工程系大二学生蔡岳均作品《埙钹革》、大四学生赵子仪作品《踏风》(指导老师均为刘灏副教授)在决赛中分别获得计算机音乐创作专业组二、三等奖。中国…

从技术到管理,程序员如何实现螺旋上升?

作者 | 李昊 出品 | 《新程序员》编辑部从开发者到技术管理者应该如何提升能力?在李昊看来,开发和管理之间的“鸿沟”并非很难跨越,他将从“深入理解基层技术管理岗位角色、纠偏对技术管理者的认识误区,以及通过日常执行层真正…

80%的软件环境管理问题,根因都在这里

简介:80%的软件环境管理问题,根因都在这里,云效云原生应用管理平台AppStack正是基于OAM的应用交付平台,企业在云效AppStack,可以通过应用编排、占位符、变量等声明式定义,实现一套编排多环境差异化部署&…

用计算机算小学题目,小学计算机入编考试考试试题.doc

先给你一份吧文昌一小学教师计算机考试试题小教师计算机考试试题?(答题时间150分钟,满分100分)学校_________________????姓名_________________?????成绩_________________一、填空题(?30分)⒈Windows?XP中的“XP”应解释为:体验。Windows?…

开发之痛:稳定的测试环境,怎么就那么难

简介:开发之痛:稳定的测试环境,怎么就那么难。对于生产环境,准确、稳定最重要,我们推荐以应用为中心的基于OAM和IaC的实践方式;对于测试环境,隔离、低成本和稳定的依赖是最重要的,我…

天腾动力携Motinova 和 Welling E-bike电驱新品亮相EUROBIKE 2022

【德国法兰克福】2022年7月13日,欧洲国际自行车贸易博览会(EUROBIKE 2022)在法兰克福开展迎客。作为欧洲三大自行车展之一,EUROBIKE 2022被誉为行业潮流的风向标,吸引着品牌商、贸易商、采购商以及众多自行车爱好者的目…

阿里云能耗宝发布,助力中小企业绿色升级,参与碳中和万亿市场

阿里云战略级产品“能耗宝”新品发布会由阿里云-企业云服务-能耗云团队主办,于2022年2月23号举行。本期发布的新产品“能耗宝”,依托阿里云沉淀多年的大数据、人工智能技术、行业数字化经验,与第三方认证机构、金融机构、碳交易中心等主体实现…

清华计算机系和交叉信息学院,清华大学交叉信息研究院与计算机科学与技术系哪个..._考研_帮考网...

写在前面,不单是信息工程专业,对于每一个专业,我都认为它们的存在必然有它们所对应的价值, 冷门热门优势弱势 之说其实只是相对而言的 ,只能说哪一个专业更符合所在服务区域,学生个人兴趣等等,我…

阿里云云原生一体化数仓正式发布 助力企业数据驱动业务创新

简介:云原生一体化数仓是集阿里云大数据产品MaxCompute、DataWorks、Hologres三种产品能力于一体的一站式大数据处理平台。核心是3个一体化和全链路数据治理能力,包括离线实时一体、湖仓一体、分析服务一体、全链路数据治理。 2月16日,阿里云…