Konteks panggilan membawa properti panggilan dan data kustom yang ditransmisikan selain parameter spesifik antarmuka. Properti panggilan mencakup alamat IP pemanggil, nama aplikasi, dan periode timeout. Anda juga dapat mentransmisikan pasangan kunci-nilai kustom antara konsumen dan penyedia tanpa mengubah antarmuka layanan.
HSF menyediakan dua kelas untuk bekerja dengan konteks panggilan:
| Kelas | Tujuan |
|---|---|
com.taobao.hsf.util.RequestCtxUtil | Mendapatkan dan menetapkan properti panggilan bawaan seperti timeout, routing IP, dan informasi pemanggil |
RPCContext | Meneruskan data pasangan kunci-nilai kustom antara konsumen dan penyedia |
Cara Kerja RequestCtxUtil
RequestCtxUtil menyimpan properti panggilan dalam variabel ThreadLocal. Setiap properti terikat pada thread saat ini dan dihapus setelah satu panggilan RPC selesai.
Setiap panggilan getXxx menghapus properti tersebut dari ThreadLocal.
Metode Konsumen
Panggil metode-metode ini di sisi konsumen sebelum atau setelah panggilan RPC.
| Metode | Deskripsi |
|---|---|
setRequestTimeout() | Menetapkan timeout untuk panggilan berikutnya. |
setUserId() | Menetapkan ID pengguna untuk routing layanan unit. Diperlukan untuk panggilan generik. |
getProviderIp() | Mendapatkan alamat IP penyedia yang menangani panggilan terakhir. |
setTargetServerIp(String ip) | Mengarahkan panggilan berikutnya ke penyedia tertentu. Alamat IP harus ada dalam daftar penyedia di memori dari registri. |
setDirectTargetServerIp(String targetIp) | Mengarahkan panggilan berikutnya ke penyedia tertentu, melewati registri. Alamat IP tidak perlu berada dalam daftar penyedia di memori. |
Metode Penyedia
Panggil metode-metode ini di sisi penyedia untuk memeriksa permintaan masuk.
| Metode | Deskripsi |
|---|---|
getClientIp() | Mendapatkan alamat IP pemanggil. |
getAppNameOfClient() | Mendapatkan nama aplikasi pemanggil. |
isHttpRequest() | Memeriksa apakah panggilan diterima melalui HTTP. |
getHttpHeader(String key) | Mendapatkan nilai header permintaan HTTP tertentu. |
Meneruskan Data Kustom dengan RPCContext
RPCContext memungkinkan Anda menyambungkan pasangan kunci-nilai arbitrer ke panggilan RPC tanpa mengubah antarmuka layanan.
Nilai dapat berupa tipe objek domain (DO) kustom atau tipe dasar. Baik konsumen maupun penyedia harus mampu melakukan serialisasi tipe tersebut.
Menetapkan Lampiran (Sisi Konsumen)
Tetapkan lampiran sebelum melakukan panggilan RPC. Konteks akan ditransmisikan secara otomatis bersama permintaan.
// Tetapkan konteks kustom sebelum panggilan RPC
RPCContext rpcContext = RPCContext.getClientContext();
rpcContext.putAttachment("tetantId", "123");
// Lakukan panggilan RPC. Konteks dikirim bersama permintaan.
orderService.queryOrder(1L);Membaca Lampiran (Sisi Penyedia)
Baca lampiran di dalam implementasi metode penyedia.
// Baca konteks kustom dari permintaan masuk
RPCContext rpcContext = RPCContext.getServerContext();
String myContext = (String) rpcContext.getAttachment("tetantId");Siklus Hidup ThreadLocal
RequestCtxUtil menyimpan properti panggilan dalam variabel ThreadLocal. Data konteks dibatasi cakupannya pada satu panggilan di thread saat ini dan dihapus setelah panggilan selesai.