RateLimitingPolicy memungkinkan Anda menetapkan kebijakan dalam suite penjadwalan lalu lintas Service Mesh (ASM). Anda dapat mengonfigurasi pembatasan secara deklaratif untuk lalu lintas global layanan di instance ASM. Topik ini menjelaskan bidang-bidang RateLimitingPolicy.
Contoh
Konfigurasi berikut menunjukkan bahwa pembatasan diterapkan pada layanan HTTPBin dalam kluster Kubernetes. Ember token yang digunakan untuk pembatasan diisi dengan dua token setiap 30 detik, artinya dua permintaan diperbolehkan setiap 30 detik. Jumlah maksimum token dalam ember adalah dua, yang menunjukkan bahwa lalu lintas burst tidak diperbolehkan. Permintaan dikelompokkan berdasarkan header permintaan user_id. Sistem menentukan apakah akan melakukan pembatasan pada permintaan dengan header permintaan user_id yang berbeda secara terpisah, dan permintaan dengan header user_id yang berbeda mengonsumsi token dari ember token mereka masing-masing.
apiVersion: istio.alibabacloud.com/v1
kind: RateLimitingPolicy
metadata:
name: ratelimit
namespace: istio-system
spec:
rate_limiter:
bucket_capacity: 2
fill_amount: 2
parameters:
interval: 30s
limit_by_label_key: http.request.header.user_id
selectors:
- agent_group: default
control_point: ingress
service: httpbin.default.svc.cluster.localDeskripsi bidang RateLimitingPolicy
RateLimitingPolicy mendefinisikan kebijakan pembatasan global dalam suite penjadwalan lalu lintas ASM. Ini menentukan layanan tempat pembatasan berlaku, parameter waktu proses dari kebijakan pembatasan, serta atribut ember token yang digunakan untuk pembatasan.
RateLimitingPolicySpec
RateLimitingPolicySpec adalah konfigurasi inti dari RateLimitingPolicy dan sesuai dengan bidang spec.
Bidang | Tipe | Diperlukan | Deskripsi |
rate_limiter | Ya | Konfigurasi limiter yang mengeksekusi kebijakan pembatasan. |
RateLimiter
RateLimiter menentukan parameter limiter dan ember token yang digunakan oleh limiter.
Bidang | Tipe | Diperlukan | Deskripsi |
fill_amount | double | Ya | Jumlah token yang diisi ke dalam ember token setiap kali. Bidang ini dapat digunakan bersama dengan bidang interval dalam RateLimiterParameters untuk menerapkan pembatasan pada permintaan. |
bucket_capacity | double | Ya | Kapasitas maksimum ember token yang digunakan oleh limiter. Ketika laju permintaan lebih rendah daripada laju pengisian ember token, jumlah token dalam ember token akan terus bertambah hingga mencapai kapasitas maksimum |
parameters | Ya | Parameter konfigurasi limiter. | |
request_parameters | Tidak | Konfigurasi operasi yang akan dilakukan oleh limiter pada permintaan. | |
selectors | []Selector | Ya | Permintaan spesifik tempat pembatasan berlaku. |
RateLimiterParameters
RateLimiterParameters menentukan parameter konfigurasi limiter.
Bidang | Tipe | Diperlukan | Deskripsi |
interval | Duration | Ya | Interval di mana limiter mengisi ember token setiap kali. Contohnya, nilai |
limit_by_label_key | string | Tidak | Label permintaan yang digunakan oleh kebijakan pembatasan untuk mengelompokkan permintaan. Setelah Anda menentukan bidang ini, pembatasan dilakukan secara terpisah pada permintaan dengan label yang berbeda, dan permintaan dengan label yang berbeda menggunakan ember token mereka sendiri. Untuk informasi lebih lanjut tentang cara menentukan label untuk permintaan, lihat Deskripsi label permintaan. |
continuous_fill | bool | Tidak | Menentukan apakah limiter mengisi ember token secara halus. Jika bidang ini disetel ke true, limiter akan terus mengisi ember token dengan sejumlah token tertentu dalam periode waktu yang ditentukan oleh bidang interval, bukan mengisi ember token dengan sejumlah token tertentu sekaligus segera setelah periode waktu yang ditentukan oleh bidang interval berakhir. Jumlah token yang akan diisi ditentukan oleh bidang fill_amount. Nilai default: true. |
delay_initial_fill | bool | Tidak | Menentukan apakah akan menunda pengisian ember token ketika kebijakan pembatasan mulai berlaku. Jika bidang ini disetel ke |
lazy_sync | Tidak | Konfigurasi kemampuan sinkronisasi tertunda limiter. | |
max_idle_time | Duration | Tidak | Bidang ini berlaku ketika |
RateLimiterRequestParameters
RateLimiterRequestParameters menentukan konfigurasi kustom untuk limiter saat melakukan operasi pada permintaan.
Bidang | Tipe | Diperlukan | Deskripsi |
denied_response_status_code | int | Tidak | Anda dapat menggunakan bidang ini untuk menimpa kode status HTTP 429 default yang dikembalikan saat pembatasan terjadi. |
tokens_label_key | string | Tidak | Anda dapat menggunakan bidang ini untuk menimpa jumlah token yang dikonsumsi oleh permintaan. Jika permintaan membawa label yang ditentukan, angka dalam label menunjukkan jumlah token yang harus dikonsumsi. |
RateLimiterParametersLazySync
RateLimiterParametersLazySync menentukan parameter konfigurasi terkait kemampuan sinkronisasi tertunda limiter. Sinkronisasi tertunda adalah kemampuan limiter dalam suite penjadwalan lalu lintas ASM. Jika sinkronisasi tertunda tidak diaktifkan, Envoy menyinkronkan dengan agen jarak jauh untuk setiap permintaan guna menentukan apakah pembatasan diperlukan. Hal ini memungkinkan pembatasan yang akurat untuk layanan tunggal. Jika sinkronisasi tertunda diaktifkan, Envoy membuat keputusan pembatasan secara lokal dan secara berkala menyinkronkan dengan agen jarak jauh. Hal ini mengurangi akurasi pembatasan tetapi mempercepat keputusan pembatasan dan mengurangi latensi permintaan.
Bidang | Tipe | Diperlukan | Deskripsi |
enabled | bool | Tidak | Menentukan apakah akan mengaktifkan sinkronisasi tertunda. Nilai default: false. |
num_sync | int | Tidak | Jumlah kali Envoy menyinkronkan jumlah permintaan yang dibatasi dengan agen jarak jauh dalam periode waktu yang ditentukan oleh bidang interval. Nilai default: 4. |
Deskripsi label permintaan
Dalam suite penjadwalan lalu lintas ASM, label permintaan adalah pasangan kunci-nilai yang menunjukkan karakteristik atau klasifikasi permintaan. Penjadwalan dapat dilakukan pada permintaan yang berbeda berdasarkan label mereka. Misalnya, permintaan dapat dikelompokkan menurut label permintaan tertentu, dan ember token terpisah digunakan untuk membatasi setiap kelompok permintaan. Label permintaan dapat diperoleh dari beberapa sumber, seperti metadata permintaan dan header Baggage.
Metadata permintaan
Metadata dasar setiap permintaan HTTP secara otomatis dikonversi menjadi serangkaian label permintaan. Pemetaan antara metadata permintaan HTTP dan label permintaan:
http.method: metode permintaan HTTP. Contoh:
POST.http.flavor: versi protokol permintaan HTTP. Contoh:
1.1.http.host: host permintaan HTTP. Contoh:
httpbin.default.svc.cluster.local.http.target: nama path permintaan HTTP. Contoh:
/get.http.request_content_length: ukuran badan permintaan HTTP. Contoh:
431.http.request.header.header_name: header permintaan bernama
header_namedalam header permintaan HTTP. Sebagai contoh, http.request.header.user_agent menunjukkan header permintaanuser_agent.
Baggage
Baggage adalah mekanisme standar yang dikembangkan oleh OpenTelemetry untuk mentransfer informasi konteks di seluruh proses dalam rantai panggilan sistem terdistribusi. Anda dapat menambahkan header HTTP bernama baggage ke header HTTP. Nilai header baggage berada dalam format pasangan kunci-nilai. Anda dapat menggunakan header baggage untuk mentransfer data konteks seperti ID penyewa, ID jejak, dan kredensial keamanan. Dengan cara ini, Anda dapat menggunakan fitur analisis jejak dan asosiasi log tanpa perlu memodifikasi kode. Contoh:
baggage: userId=alice,isProduction=falseJika permintaan membawa header Baggage, setiap pasangan kunci-nilai dalam header Baggage secara otomatis dikonversi menjadi label permintaan dengan nama yang sama. Sebagai contoh, header Baggage dalam contoh sebelumnya dikonversi menjadi dua label permintaan: userId: alice dan isProduction: false.