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.
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.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel kiri, pilih .
Di halaman Deployments, klik Create from YAML.
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
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
spring-cloud-b-gray
Masuk ke Konsol MSE, dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Pada halaman yang muncul, klik kartu sumber daya aplikasi spring-cloud-a.
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.
Masuk ke Konsol MSE, dan pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Pada halaman yang muncul, klik kartu sumber daya aplikasi spring-cloud-c.
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.