简介:本文是阿里云微服务引擎MSE在利用公布时提供的无损高低线和服务预热能力最佳实际介绍。

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

前提条件

开启 MSE 微服务治理

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

背景信息

很多用户量大并发度高的利用零碎为了防止公布过程中的流量有损个别抉择在流量较小的中午公布,尽管这样做有成果,但不可控导致背地的研发运维人员常常因为公布问题时常搞得中午胆战心惊,心力疲乏。基于此,阿里云微服务引擎MSE通过在利用公布过程中,通过利用下线被动实时登记,利用上线衰弱就绪查看与生命周期对齐以及服务预热等技术手段所提供的微服务利用无损高低线公布性能,让研发运维人员即便是在白天公布利用,也能风轻云淡。

筹备工作

留神,本实际所应用的 Agent 目前还在灰度中,须要对利用 Agent 进行灰度降级,降级文档:https://help.aliyun.com/docum...

利用部署在不同的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.os...

利用部署流量架构图

流量压力起源

在 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/v1kind: Deploymentmetadata:  labels:    app: nacos-server  name: nacos-serverspec:  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: v1kind: Servicemetadata:  name: nacos-serverspec:  ports:  - port: 8848    protocol: TCP    targetPort: 8848  selector:    app: nacos-server  type: ClusterIP#入口 zuul 利用---apiVersion: apps/v1kind: Deploymentmetadata:  name: spring-cloud-zuulspec:  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/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-a  name: spring-cloud-aspec:  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/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-a-gray  name: spring-cloud-a-grayspec:  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/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-b  name: spring-cloud-bspec:  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/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-b-gray  name: spring-cloud-b-grayspec:  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/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-c  name: spring-cloud-cspec:  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/v1beta1kind: CronHorizontalPodAutoscalermetadata:  labels:    controller-tools.k8s.io: "1.0"  name: spring-cloud-bspec:   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/v1beta1kind: CronHorizontalPodAutoscalermetadata:  labels:    controller-tools.k8s.io: "1.0"  name: spring-cloud-b-grayspec:   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/v1beta1kind: CronHorizontalPodAutoscalermetadata:  labels:    controller-tools.k8s.io: "1.0"  name: spring-cloud-cspec:   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: v1kind: Servicemetadata:  name: zuul-slbspec:  ports:    - port: 80      protocol: TCP      targetPort: 20000  selector:    app: spring-cloud-zuul  type: ClusterIP# a 利用裸露 k8s service---apiVersion: v1kind: Servicemetadata:  name: spring-cloud-a-basespec:  ports:    - name: http      port: 20001      protocol: TCP      targetPort: 20001  selector:    app: spring-cloud-a---apiVersion: v1kind: Servicemetadata:  name: spring-cloud-a-grayspec:  ports:    - name: http      port: 20001      protocol: TCP      targetPort: 20001  selector:    app: spring-cloud-a-gray# Nacos Server SLB Service 配置---apiVersion: v1kind: Servicemetadata:  name: nacos-slbspec:  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 秒。

察看节点的流量,发现节点流量迟缓回升。并且能看到节点的预热开始和完结工夫,以及相干的事件。

从上图能够看到开启预热性能的利用重启后的流量会随工夫迟缓减少,在一些利用启动过程中须要预建连接池和缓存等资源的慢启动场景,开启服务预热能无效爱护利用启动过程中缓存资源有序创立保障利用平安启动并做到流量无损。

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