All Products
Search
Document Center

Microservices Engine:Implementasi start dan shutdown graceful aplikasi microservice menggunakan MSE

Last Updated:Jul 06, 2025

Jika sebuah aplikasi perlu memproses sejumlah besar permintaan secara bersamaan, versi baru biasanya dirilis di luar jam puncak untuk mencegah kehilangan trafik. Namun, pendekatan ini meningkatkan biaya operasional karena situasi tak terduga. Untuk mengatasi masalah ini, Microservices Engine (MSE) menyediakan teknologi yang mendukung start dan shutdown graceful selama rilis aplikasi. Shutdown graceful memastikan aplikasi hanya dimatikan setelah semua permintaan diproses, sementara start graceful menggunakan readiness probe untuk menyelaraskan tahapan manajemen siklus hidup aplikasi mikro.

Prasyarat

Arsitektur Demo

Dalam contoh ini, arsitektur aplikasi terdiri dari gateway Zuul dan aplikasi Spring Cloud backend. Panggilan layanan backend melibatkan tiga aplikasi: keranjang belanja (Aplikasi A), pusat transaksi (Aplikasi B), dan pusat inventaris (Aplikasi C). Instance Nacos MSE digunakan untuk registrasi layanan dan penemuan aplikasi.

Deploy aplikasi demo dan aktifkan Tata Kelola Mikroservis untuk aplikasi tersebut

Penting

Demo ini menggunakan Cron Horizontal Pod Autoscaler (CronHPA). Pastikan komponen ack-kubernetes-cronhpa-controller telah diinstal di kluster sebelum menerapkan aplikasi demo. Untuk informasi lebih lanjut, lihat bagian "Langkah 1: Instal Komponen CronHPA" dalam Gunakan CronHPA untuk Penskalaan Horizontal Terjadwal.

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

  2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel kiri, pilih Workloads > Deployments.

  3. Di halaman Deployments, klik Create from YAML.

  4. Pilih Custom dari daftar drop-down Sample Template, masukkan kode YAML berikut di Template, dan klik Create.

    File demo dalam contoh ini bernama mse-demo.yaml. Gateway Zuul dan Aplikasi A, B, dan C diterapkan. Versi dasar dan versi canary diterapkan untuk Aplikasi A dan Aplikasi B. Fitur shutdown graceful dinonaktifkan untuk versi dasar Aplikasi B dan diaktifkan untuk versi canary. Untuk Aplikasi C, fitur prefetching layanan diaktifkan dengan durasi 120 detik.

    Tampilkan Kode YAML

    # 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
    
    # Konfigurasi layanan nacos-server.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-server
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: ClusterIP
    
    # Aplikasi spring-cloud-zuul.
    ---
    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
    
    # Aktifkan pass-through end-to-end di tingkat mesin untuk versi dasar Aplikasi A. 
    ---
    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
    
    # Aktifkan pass-through end-to-end di tingkat mesin untuk versi canary Aplikasi A. 
    ---
    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
    
    # Nonaktifkan shutdown graceful untuk versi dasar Aplikasi B. 
    ---
    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
    
    # Secara default, shutdown graceful diaktifkan untuk versi canary Aplikasi B. 
    ---
    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
    
    # Versi dasar Aplikasi C.
    ---
    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
    
    # Konfigurasi 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
    
    
    # Buat instance Server Load Balancer (SLB) untuk aplikasi spring-cloud-zuul.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: zuul-slb
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 20000
      selector:
        app: spring-cloud-zuul
      type: ClusterIP
    
    # Gunakan Aplikasi A untuk mengekspos layanan Kubernetes.
    ---
    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
    
    # Konfigurasi layanan nacos-slb.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nacos-slb
    spec:
      ports:
      - port: 8848
        protocol: TCP
        targetPort: 8848
      selector:
        app: nacos-server
      type: LoadBalancer
  5. Aktifkan Tata Kelola Mikroservis untuk aplikasi. Untuk informasi lebih lanjut, lihat Aktifkan Tata Kelola Mikroservis untuk Aplikasi Mikro Java dalam Kluster ACK atau ACS.

Lihat data visibilitas

CronHPA diaktifkan untuk spring-cloud-b dan spring-cloud-b-gray untuk mensimulasikan penskalaan terjadwal dengan interval 5 menit. Klik nama aplikasi dan pilih tab Pod Scaling untuk melihat informasi terkait.

  • spring-cloud-b

    image

  • spring-cloud-b-gray

    image

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

  2. Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Pada halaman yang muncul, klik kartu sumber daya aplikasi spring-cloud-a.

  3. Di halaman Application overview, lihat data visibilitas terkait aplikasi tersebut.

    Informasi berikut diperoleh dari data:

    • Tidak ada kesalahan permintaan yang dikembalikan untuk versi spring-cloud-a-gray selama penyesuaian pod. Dalam hal ini, tidak ada kehilangan trafik yang terjadi.

    • Fitur shutdown graceful dinonaktifkan untuk versi spring-cloud-a. Kesalahan dikembalikan untuk 20 permintaan yang dikirim dari spring-cloud-a ke spring-cloud-b selama penyesuaian pod, sehingga menyebabkan kehilangan trafik.

Aktifkan start graceful

Aktifkan CronHPA untuk spring-cloud-c untuk mensimulasikan startup aplikasi. Lakukan penskalaan dengan interval 5 menit. Biarkan satu node tersedia pada detik ke-60 dan dua node tersedia pada detik ke-70.image

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

  2. Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Pada halaman yang muncul, klik kartu sumber daya aplikasi spring-cloud-c.

  3. Di panel navigasi kiri, klik Traffic management. Pada tab Graceful Start/Shutdown, aktifkan Graceful Start. Di Prompt message yang muncul, klik OK. Durasi prefetching default adalah 120 detik.

    Trafik perlahan meningkat seiring waktu setelah aplikasi dengan fitur prefetching layanan diaktifkan dimulai ulang. Dalam skenario startup aplikasi lambat di mana sumber daya seperti connection pool dan cache harus disediakan sebelumnya, Anda dapat mengaktifkan fitur prefetching layanan untuk memastikan aplikasi dimulai dengan aman tanpa kehilangan trafik.