All Products
Search
Document Center

Microservices Engine:Gunakan MSE untuk mencapai mulai mulus dan shutdown yang mulus pada aplikasi layanan mikro

Last Updated:Jun 21, 2026

Untuk menghindari kehilangan traffic selama penerapan, banyak aplikasi berkonkurensi tinggi hanya melakukan deployment pada jam sepi. Meskipun pendekatan ini membantu mengurangi masalah, biaya operasional tetap tinggi karena faktor-faktor yang tidak dapat diprediksi. MSE melakukan optimasi mendalam terhadap proses startup dan shutdown aplikasi. Saat shutdown, MSE menggunakan mekanisme penantian adaptif dan notifikasi proaktif untuk memastikan semua permintaan yang tertunda selesai sebelum layanan offline, sehingga mencegah gangguan layanan yang tiba-tiba. Saat startup, MSE menyelaraskan manajemen siklus hidup layanan mikro secara tepat dengan setiap fase deployment menggunakan readiness probe, memastikan peluncuran versi layanan baru yang stabil.

Prasyarat

Ikhtisar arsitektur demo

Asumsikan arsitektur aplikasi terdiri dari gerbang Zuul dan instans aplikasi layanan mikro backend (Spring Cloud). Rantai panggilan backend mencakup aplikasi keranjang belanja A, aplikasi pusat transaksi B, dan aplikasi pusat inventaris C. Aplikasi-aplikasi ini menggunakan Pusat Registrasi Nacos untuk registrasi dan penemuan layanan.

Pada aplikasi spring-cloud-zuul, seperti yang ditunjukkan pada gambar berikut, aplikasi tersebut secara bersamaan memanggil versi rilis canary dan versi normal spring-cloud-a dengan laju 100 permintaan per detik (QPS).应用部署流量架构图

Deploy aplikasi dan aktifkan governance layanan mikro

Penting

Karena demo ini mencakup tugas CronHPA, instal terlebih dahulu komponen ack-kubernetes-cronhpa-controller di kluster Anda. Untuk detailnya, lihat Langkah 1: Instal komponen CronHPA.

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.

  3. Pada halaman Deployments, klik Create from YAML.

  4. Untuk Sample Template, pilih Custom. Tempel YAML berikut ke dalam bidang Template, lalu klik Create.

    File demo ini bernama mse-demo.yaml. File tersebut mendeploy gerbang Zuul dan tiga aplikasi (A, B, dan C). Aplikasi A dan B masing-masing memiliki versi garis dasar dan versi rilis canary. Versi garis dasar aplikasi B menonaktifkan graceful shutdown, sedangkan versi canary-nya mengaktifkan graceful shutdown. Aplikasi C mengaktifkan warmup layanan dengan durasi warmup 120 detik.

    Expand to view the YAML file

    # 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
            msePilotCreateAppName: nacos-server
            msePilotAutoEnable: "on"
        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 configuration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    # Zuul gateway application
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-zuul
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-cloud-zuul
      template:
        metadata:
          labels:
            app: spring-cloud-zuul
            msePilotCreateAppName: spring-cloud-zuul
            msePilotAutoEnable: "on"
        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
    # Application A baseline version, with full-link pass-through enabled by machine dimension.
    ---
    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: 
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        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
    # Application A canary version, with full-link pass-through enabled by machine dimension.
    ---
    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:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: "on"
        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
    # Application B baseline version, with graceful shutdown disabled.
    ---
    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:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        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
    # Application B canary version, with graceful shutdown enabled by default.
    ---
    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:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-b-gray
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: "on"
        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
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 10
              periodSeconds: 30
    # Application C baseline version
    ---
    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:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: "on"
        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 configuration
    ---
    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
    # Expose Zuul gateway via SLB for demonstration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zuul-slb
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 20000
      selector:
        app: spring-cloud-zuul
      type: ClusterIP
    # Expose Application A as a Kubernetes 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 configuration
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-slb
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: LoadBalancer
  5. Aktifkan governance layanan mikro untuk aplikasi yang telah Anda deploy. Untuk detailnya, lihat Aktifkan governance MSE untuk aplikasi layanan mikro ACK dan ACS (Java).

Melihat data yang dapat diamati

Kedua aplikasi spring-cloud-b dan spring-cloud-b-gray telah mengaktifkan CronHPA, mensimulasikan penjadwalan penskalaan setiap 5 menit. Klik nama aplikasi, lalu klik tab Scaling untuk melihat detailnya.

  • Aplikasi spring-cloud-b:

    Pada halaman CronHPA, spring-cloud-b memiliki dua tugas penjadwalan penskalaan, keduanya berhasil dieksekusi (status: Succeed). Tugas scale-down dijalankan sesuai jadwal 0 0/5 * * * * dengan jumlah replika target 1. Tugas scale-up dijalankan sesuai jadwal 10 0/5 * * * * dengan jumlah replika target 2.

  • Aplikasi spring-cloud-b-gray:

    Halaman CronHPA menampilkan dua tugas terjadwal: scale-down (jadwal 0 0/5 * * * *, jumlah replika target 1) dan scale-up (jadwal 10 0/5 * * * *, jumlah replika target 2), keduanya dengan status Succeed.

  1. Masuk ke Konsol MSE, dan pilih Wilayah di bilah navigasi atas.

  2. Di panel navigasi kiri, pilih Microservices Governance > Application Governance, lalu klik kartu aplikasi spring-cloud-a.

  3. Halaman Application Overview menampilkan data observabilitas untuk aplikasi ini.

    Data menunjukkan:

    • Versi spring-cloud-a-gray tidak mengalami error permintaan selama penskalaan Pod, menandakan tidak ada kehilangan traffic.

    • Versi spring-cloud-a, yang menonaktifkan graceful shutdown, mengalami 20 permintaan gagal dari spring-cloud-a ke spring-cloud-b selama penskalaan Pod, sehingga menyebabkan kehilangan traffic.

Aktifkan mulai mulus

Aplikasi spring-cloud-c menggunakan CronHPA untuk mensimulasikan perilaku startup, melakukan penskalaan setiap 5 menit—menurunkan skala menjadi satu node pada detik ke-0 menit ke-2, dan meningkatkan skala menjadi dua node pada detik ke-10 menit ke-2. Pada halaman CronHPA, CronHPA spring-cloud-c memiliki dua tugas: scale-down (jadwal 0 2/5 * * * *, jumlah replika target 1, status Succeed) dan scale-up (jadwal 10 2/5 * * * *, jumlah replika target 2, status Succeed).

  1. Masuk ke Konsol MSE, dan pilih Wilayah di bilah navigasi atas.

  2. Di panel navigasi kiri, pilih Microservices Governance > Application Governance, lalu klik kartu aplikasi spring-cloud-c.

  3. Di panel navigasi kiri, pilih Traffic management, lalu pilih tab Graceful Start/Shutdown. Aktifkan Graceful Start. Pada kotak dialog Prompt message, klik OK. Durasi warmup default adalah 120 detik.

    Setelah mengaktifkan warmup, traffic ke aplikasi yang direstart akan meningkat secara bertahap seiring waktu. Dalam skenario slow-start—seperti ketika aplikasi perlu membangun kolam koneksi atau cache terlebih dahulu saat startup—mengaktifkan service warmup memastikan inisialisasi resource yang teratur dan startup yang aman tanpa kehilangan traffic.