全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Gunakan ASMCircuitBreaker untuk mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan antar layanan

更新时间:Jul 02, 2025

Service Mesh (ASM) memungkinkan Anda mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat antara layanan tertentu dan pada rute tertentu. Dengan cara ini, proxy ASM menolak permintaan dari layanan upstream yang mengalami kegagalan, mewujudkan pemutusan sirkuit trafik secara non-intrusif. Topik ini menjelaskan cara menggunakan CustomResourceDefinitions (CRD) ASMCircuitBreaker untuk mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat.

Informasi latar belakang

Pemutusan sirkuit trafik adalah mekanisme perlindungan terhadap beban berlebih, yang utamanya digunakan untuk mencegah sistem runtuh akibat lonjakan trafik dalam periode waktu singkat. Dalam kasus panggilan timur-barat antara layanan cloud-native, kegagalan satu layanan (seperti respons lambat atau peningkatan tingkat kegagalan) dapat menyebabkan kegagalan berantai di seluruh serangkaian layanan dalam jejak.

Anda dapat mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat antar layanan untuk menolak permintaan dari layanan upstream ketika tingkat kegagalan atau jumlah batas waktu respons mencapai ambang batas yang sesuai. Ini melindungi layanan upstream dan secara efektif mencegah kegagalan memengaruhi seluruh jejak dan menyebabkan seluruh sistem runtuh.

Setelah Anda mengonfigurasi aturan pemutusan sirkuit, setiap proxy ASM menghitung tingkat kegagalan atau jumlah batas waktu respons berdasarkan permintaan yang diterimanya. Oleh karena itu, untuk layanan upstream yang sama yang mengalami kegagalan, waktu pemutusan sirkuit yang terjadi pada proxy ASM yang berbeda mungkin sedikit berbeda.

Prasyarat

Langkah 1: Konfigurasikan routing jalur permintaan untuk trafik timur-barat antara layanan sleep dan httpbin

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Gunakan salah satu metode berikut untuk membuat layanan virtual:

    Gunakan Konsol ASM

    1. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > VirtualService. Pada halaman yang muncul, klik Create.

    2. Pilih namespace dari daftar drop-down Namespace dan masukkan nama untuk layanan virtual yang akan dibuat di bidang Name. Di bagian Gateways, aktifkan sakelar di sebelah Apply To All Sidecars.

    3. Di bagian Hosts, klik Add Host untuk menambahkan layanan httpbin.

    4. Di bagian HTTP Route, klik Add Route dan konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.

    image

    image

    image

    Gunakan template YAML

    1. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > VirtualService. Pada halaman yang muncul, klik Create from YAML.

    2. Salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.

      Tampilkan Konten YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: httpbin
        namespace: default
      spec:
        hosts:
          - httpbin.default.svc.cluster.local
        http:
          - match:
              - uri:
                  exact: /status/500
            name: error-route
            route:
              - destination: 
                  host: httpbin.default.svc.cluster.local
          - match:
              - uri:
                  prefix: /delay
            name: delay-route
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
          - name: default-route
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local

    Tabel berikut menjelaskan hubungan antara permintaan dan jalur.

    Jalur Permintaan

    Jenis Pencocokan

    Nama Rute

    Deskripsi

    /status/500

    Pencocokan tepat

    error-route

    Kode status 500 selalu dikembalikan.

    /delay

    Pencocokan awalan

    delay-route

    Kode status 200 dikembalikan setelah waktu yang ditentukan berlalu. Untuk detail tentang cara menggunakan permintaan /delay, lihat delay.

    /*

    Jalur apa pun

    default-route

    Rute default.

Langkah 2: Konfigurasikan aturan pemutusan sirkuit

Bagian ini menjelaskan cara mengonfigurasi pemutusan sirkuit berdasarkan tingkat kesalahan dan jumlah permintaan lambat, serta hasil pengujian.

Konfigurasikan pemutusan sirkuit berdasarkan tingkat kesalahan

Pemutusan sirkuit berbasis tingkat kesalahan berarti bahwa pemutusan sirkuit dipicu ketika tingkat kesalahan respons server yang terdeteksi dalam jendela waktu tertentu melebihi ambang batas yang ditentukan.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > Circuit Breaking and Degradation.

  3. Di halaman yang muncul, klik Buat. Di halaman Create, salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.

    Tampilkan Konten YAML

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMCircuitBreaker
    metadata:
      name: httpbin-error-circuitbreak
      namespace: default
    spec:
      configs:
        - breaker_config:
            break_duration: 60s
            custom_response:
              body: error break!
              header_to_add:
                x-envoy-overload: 'true'
              status_code: 499
            error_percent:
              value: 60
            min_request_amount: 5
            window_size: 10s
          match:
            vhost:
              name: httpbin.default.svc.cluster.local
              port: 8000
              route:
                name_match: error-route
      workloadSelector:
        labels:
          app: sleep
    

    Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.

    Parameter

    Deskripsi

    workloadSelector.labels

    Workload layanan downstream. Dalam contoh ini, workload layanan downstream adalah layanan sleep. Oleh karena itu, label app: sleep digunakan untuk memilih layanan sleep.

    break_duration

    Durasi antara waktu pemutusan sirkuit dipicu dan waktu akses ke layanan httpbin dipulihkan. Dalam contoh ini, nilainya diatur menjadi 60 detik.

    window_size

    Jendela waktu di mana tingkat kesalahan permintaan dideteksi. Dalam contoh ini, nilainya diatur menjadi 10 detik. Ini menunjukkan bahwa jika tingkat kesalahan permintaan pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.

    error_percent

    Tingkat kesalahan permintaan dalam jendela waktu tertentu yang digunakan untuk menentukan apakah pemutusan sirkuit dipicu. Dalam contoh ini, nilainya diatur menjadi 60. Ini menunjukkan bahwa jika tingkat kesalahan permintaan pada rute melebihi 60% dalam jendela waktu 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.

    min_request_amount

    Jumlah minimum permintaan yang diperlukan untuk memicu pemutusan sirkuit dalam jendela waktu. Anda dapat mengonfigurasi parameter ini untuk mencegah pemutusan sirkuit dipicu secara keliru karena jumlah permintaan yang sedikit.

    Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa pemutusan sirkuit hanya dipicu ketika lebih dari lima permintaan dikirim pada rute tertentu dalam jendela waktu 10 detik dan tingkat kesalahan melebihi 60%.

    custom_response

    Konten respons kustom yang dikembalikan ketika proxy ASM menolak permintaan setelah pemutusan sirkuit dipicu.

    • Parameter body diatur ke error break!. Ini menunjukkan bahwa badan respons kustom adalah error break!.

    • Parameter header_to_add diatur ke x-envoy-overload: 'true'. Ini menunjukkan bahwa x-envoy-overload: 'true' ditambahkan ke header respons permintaan yang ditolak setelah pemutusan sirkuit dipicu.

    • Parameter status_code diatur ke 499. Ini menunjukkan bahwa kode respons 499 dikembalikan untuk permintaan setelah pemutusan sirkuit dipicu.

    match.vhost

    Rute. Rute harus cocok dengan rute yang dideklarasikan dalam layanan virtual.

    • name: Harus diatur ke nama domain layanan upstream dalam jejak. Dalam contoh ini, nilainya diatur ke nama domain layanan httpbin, httpbin.default.svc.cluster.local. Layanan httpbin adalah layanan upstream dari layanan sleep.

    • port: Harus diatur ke port layanan layanan upstream. Dalam contoh ini, nilainya diatur ke port layanan layanan httpbin, 8000.

    • route.name_match: Harus diatur ke nama rute yang dikonfigurasi dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute yang sesuai. Dalam contoh ini, nilainya diatur ke error-route yang dikonfigurasi di Langkah 2. Kode status 500 selalu dikembalikan untuk permintaan yang cocok dengan rute ini. Ini memastikan bahwa pemutusan sirkuit dipicu.

  4. Gunakan kubectl untuk terhubung ke kluster ACK dan jalankan perintah berikut:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Output yang Diharapkan:

    Tampilkan Detail

    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    ...

    Output menunjukkan bahwa ketika permintaan keenam dikirim, pemutusan sirkuit dipicu. Setelah pemutusan sirkuit dipicu, kode status 499 dikembalikan untuk permintaan berikutnya. Pemutusan sirkuit berlaku selama 60 detik.

  5. Selama pemutusan sirkuit, Anda dapat menjalankan perintah berikut untuk mengakses jalur lain dari layanan httpbin:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/503 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Output yang Diharapkan:

    Tampilkan Detail

    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    HTTP/1.1 503 Service Unavailable
    
    ...

    Output menunjukkan bahwa permintaan yang dikirim ke jalur lain dari layanan httpbin tidak terpengaruh oleh konfigurasi pemutusan sirkuit untuk rute error-route dan dapat direspons secara normal oleh layanan httpbin.

Konfigurasikan pemutusan sirkuit berdasarkan jumlah permintaan lambat

Pemutusan sirkuit berbasis permintaan lambat berarti bahwa pemutusan sirkuit dipicu ketika jumlah permintaan lambat yang terdeteksi dalam jendela waktu tertentu melebihi ambang batas yang ditentukan. Permintaan yang waktu responsnya melebihi ambang batas dalam jendela waktu tertentu disebut permintaan lambat.

  1. Masuk ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih Traffic Management Center > Circuit Breaking and Degradation.

  3. Di halaman yang muncul, klik Buat. Di halaman Create, salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.

    Tampilkan Konten YAML

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMCircuitBreaker
    metadata:
      name: httpbin-error-circuitbreak
      namespace: default
    spec:
      configs:
        - breaker_config:
            break_duration: 60s
            custom_response:
              body: error break!
              header_to_add:
                x-envoy-overload: 'true'
              status_code: 499
            error_percent:
              value: 60
            min_request_amount: 5
            window_size: 10s
          match:
            vhost:
              name: httpbin.default.svc.cluster.local
              port: 8000
              route:
                name_match: error-route
      workloadSelector:
        labels:
          app: sleep

    Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.

    Parameter

    Deskripsi

    workloadSelector.labels

    Workload layanan downstream. Dalam contoh ini, workload layanan downstream adalah layanan sleep. Oleh karena itu, label app: sleep digunakan untuk memilih layanan sleep.

    break_duration

    Durasi antara waktu pemutusan sirkuit dipicu dan waktu akses ke layanan httpbin dipulihkan. Dalam contoh ini, nilainya diatur menjadi 60 detik.

    window_size

    Jendela waktu di mana tingkat kesalahan permintaan dideteksi. Dalam contoh ini, nilainya diatur menjadi 10 detik. Ini menunjukkan bahwa jika jumlah permintaan lambat pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.

    slow_request_rt

    Waktu respons dasar yang digunakan untuk menentukan permintaan lambat. Dalam contoh ini, nilainya diatur menjadi 0,5 detik. Ini menunjukkan bahwa permintaan dengan waktu respons lebih dari 0,5 detik dianggap sebagai permintaan lambat.

    max_slow_requests

    Jumlah maksimum permintaan lambat yang diizinkan dalam jendela waktu sebelum pemutusan sirkuit dipicu. Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa jika lebih dari lima permintaan lambat terjadi dalam jendela waktu 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.

    min_request_amount

    Jumlah minimum permintaan yang diperlukan untuk memicu pemutusan sirkuit dalam jendela waktu. Anda dapat mengonfigurasi parameter ini untuk mencegah pemutusan sirkuit dipicu secara keliru karena jumlah permintaan yang sedikit.

    Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa pemutusan sirkuit hanya dipicu ketika lebih dari 5 permintaan dikirim pada rute tertentu dalam jendela waktu 10 detik dan jumlah permintaan lambat melebihi 5.

    custom_response

    Konten respons kustom yang dikembalikan ketika proxy ASM menolak permintaan setelah pemutusan sirkuit dipicu.

    • Parameter body diatur ke error break!. Ini menunjukkan bahwa badan respons kustom adalah error break!.

    • Parameter header_to_add diatur ke x-envoy-overload: 'true'. Ini menunjukkan bahwa x-envoy-overload: 'true' ditambahkan ke header respons permintaan yang ditolak setelah pemutusan sirkuit dipicu.

    • Parameter status_code diatur ke 498. Ini menunjukkan bahwa kode respons 498 dikembalikan untuk permintaan setelah pemutusan sirkuit dipicu.

    match.vhost

    Rute. Rute harus cocok dengan rute yang dideklarasikan dalam layanan virtual.

    • name: Harus diatur ke nama domain layanan upstream dalam jejak. Dalam contoh ini, nilainya diatur ke nama domain layanan httpbin, httpbin.default.svc.cluster.local. Layanan httpbin adalah layanan upstream dari layanan sleep.

    • port: Harus diatur ke port layanan layanan upstream. Dalam contoh ini, nilainya diatur ke port layanan layanan httpbin, 8000.

    • route.name_match: Harus diatur ke nama rute yang dikonfigurasi dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute yang sesuai. Dalam contoh ini, nilainya diatur ke delay-route yang dikonfigurasi di Langkah 2. Permintaan yang cocok dengan rute ini dapat dikonfigurasi secara manual untuk merespons lebih dari 0,5 detik. Ini memastikan bahwa pemutusan sirkuit dipicu.

  4. Gunakan kubectl untuk terhubung ke kluster ACK dan jalankan perintah berikut:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/delay/1 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Output yang Diharapkan:

    Tampilkan Detail

    HTTP/1.1 200 OK
    
    HTTP/1.1 200 OK
    
    HTTP/1.1 200 OK
    
    HTTP/1.1 200 OK
    
    HTTP/1.1 200 OK
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    HTTP/1.1 498 Unknown
    
    ...

    Output menunjukkan bahwa ketika permintaan keenam dikirim, pemutusan sirkuit dipicu. Setelah pemutusan sirkuit dipicu, kode status 498 dikembalikan untuk permintaan berikutnya. Pemutusan sirkuit berlaku selama 60 detik.

  5. Selama pemutusan sirkuit, Anda dapat menjalankan perintah berikut untuk menguji pemutusan sirkuit berbasis tingkat kesalahan yang dikonfigurasikan di Langkah 3:

    for i in {1..100};  do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP';  echo ''; sleep 0.1; done;

    Output yang Diharapkan:

    Tampilkan Detail

    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 500 Internal Server Error
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    HTTP/1.1 499 Unknown
    
    ...

    Output di atas menunjukkan bahwa aturan pemutusan sirkuit yang dikonfigurasikan pada rute yang berbeda tidak saling memengaruhi. Anda dapat mengonfigurasi aturan pemutusan sirkuit secara fleksibel untuk trafik panggilan layanan timur-barat dengan karakteristik yang berbeda untuk menerapkan pemutusan sirkuit sesuai dengan kebutuhan bisnis Anda.

Operasi terkait

Lihat metrik terkait pemutusan sirkuit tingkat layanan

Untuk instance ASM versi V1.22.6.28 dan yang lebih baru, Anda dapat melihat metrik terkait pemutusan sirkuit tingkat layanan yang dikonfigurasi menggunakan CRD ASMCircuitBreaker.

Metrik

Tipe

Deskripsi

envoy_asm_circuit_breaker_total_broken_requests

Counter

Jumlah total permintaan yang ditolak karena pemutusan sirkuit

Anda dapat mengonfigurasi proxyStatsMatcher dari proxy sidecar untuk melaporkan metrik terkait.

  1. Setelah Anda memilih proxyStatsMatcher, pilih Pencocokan Ekspresi Reguler dan atur nilainya ke .*circuit_breaker.*. Untuk informasi lebih lanjut, lihat proxyStatsMatcher.

  2. Redeploy layanan httpbin agar konfigurasi proxy baru berlaku. Untuk informasi lebih lanjut, lihat Redeploy Workload.

  3. Lakukan Langkah 1 dan Langkah 2 lagi untuk mengonfigurasi ulang pemutusan sirkuit.

  4. Jalankan perintah berikut untuk melihat metrik pemutusan sirkuit tingkat layanan dari layanan httpbin:

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep asm_circuit_breaker

    Output yang Diharapkan:

    # TYPE envoy_asm_circuit_breaker_total_broken_requests counter
    envoy_asm_circuit_breaker_total_broken_requests{cluster="outbound|8000||httpbin.default.svc.cluster.local",uuid="af7cf7ad-67e8-49c5-b5fe-xxxxxxxxx"} 1430
    # TYPE envoy_total_asm_circuit_breakers gauge
    envoy_total_asm_circuit_breakers{} 1

Konfigurasikan pengumpulan metrik dan peringatan untuk pemutusan sirkuit tingkat layanan

Setelah Anda mengonfigurasi metrik terkait pemutusan sirkuit tingkat layanan, Anda dapat mengonfigurasi pengaturan untuk mengumpulkan metrik ke Prometheus dan mengonfigurasi aturan peringatan berdasarkan metrik utama. Dengan cara ini, peringatan dapat dihasilkan ketika pemutusan sirkuit terjadi. Bagian berikut menunjukkan cara mengonfigurasi pengumpulan metrik dan peringatan untuk pemutusan sirkuit tingkat layanan. Dalam contoh ini, Managed Service for Prometheus digunakan.

  1. Di Managed Service for Prometheus, Anda dapat menghubungkan kluster pada bidang data ke komponen Alibaba Cloud ASM atau meningkatkan komponen Alibaba Cloud ASM ke versi terbaru. Ini memastikan bahwa metrik terkait pemutusan sirkuit yang diekspos dapat dikumpulkan oleh Managed Service for Prometheus. Untuk informasi lebih lanjut tentang cara mengintegrasikan komponen ke ARMS, lihat Manajemen Komponen. (Jika Anda telah mengonfigurasi pengaturan untuk menggunakan instance Prometheus yang dikelola sendiri untuk mengumpulkan metrik instance ASM dengan merujuk ke Pantau Instance ASM Menggunakan Instance Prometheus yang Dikelola Sendiri, Anda tidak perlu melakukan langkah ini.)

  2. Buat aturan peringatan untuk pemutusan sirkuit tingkat layanan. Untuk informasi lebih lanjut, lihat Gunakan Pernyataan PromQL Kustom untuk Membuat Aturan Peringatan. Contoh berikut menunjukkan cara menentukan parameter utama untuk mengonfigurasi aturan peringatan. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter lainnya, lihat dokumentasi sebelumnya.

    Parameter

    Contoh

    Deskripsi

    Pernyataan PromQL Kustom

    (sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 0

    Pernyataan increase menanyakan jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit terakhir. Jumlah permintaan dikelompokkan berdasarkan namespace dan nama layanan yang memicu pemutusan sirkuit. Peringatan dilaporkan ketika jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit lebih besar dari 0.

    Pesan Peringatan

    Pemutusan sirkuit tingkat layanan terjadi. Namespace: {{$labels.namespace}}, Layanan yang memicu pemutusan sirkuit: {{$labels.cluster}}. Jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit saat ini: {{ $value }}

    Informasi peringatan menunjukkan namespace layanan yang memicu pemutusan sirkuit, nama layanan, dan jumlah permintaan yang dikirim ke layanan tetapi ditolak karena pemutusan sirkuit dalam satu menit terakhir.