Misalkan Anda sedang mengembangkan situs web e-commerce, maka akan banyak layanan mikro back-end yang terlibat, seperti keanggotaan, produk, layanan rekomendasi, dan sebagainya.
Lalu ada masalah di sini, bagaimana APP / Browser mengakses layanan back-end ini? Jika bisnisnya relatif sederhana, setiap bisnis dapat diberi nama domain terpisah (https://service.api.company.com) , Namun ada beberapa masalah dengan pendekatan ini:
- Setiap bisnis akan membutuhkan logika seperti otentikasi, pembatasan saat ini, dan verifikasi izin. Jika setiap bisnis berjuang sendiri dan membangun roda sendiri untuk menerapkannya lagi, itu akan menyakitkan, dan itu dapat diambil dan ditempatkan di tempat yang sama untuk melakukannya. .
- Jika volume bisnis relatif sederhana, pendekatan ini tidak akan menimbulkan masalah pada tahap awal, tetapi karena bisnis menjadi semakin kompleks, misalnya, Taobao, Amazon, membuka halaman mungkin melibatkan ratusan layanan mikro untuk bekerja sama, jika setiap layanan mikro Jika Anda menetapkan nama domain, di satu sisi, kode klien akan sulit untuk dipertahankan, yang melibatkan ratusan nama domain. Di sisi lain, ini adalah penghambat jumlah koneksi. Bayangkan Anda membuka sebuah APP dan menemukan bahwa ratusan panggilan jarak jauh terlibat melalui pengambilan paket. , Ini akan sangat tidak efisien di bawah terminal seluler.
- Setiap kali layanan baru diluncurkan, diperlukan partisipasi dalam pengoperasian dan pemeliharaan, pengajuan nama domain, konfigurasi Nginx, dll. Saat server online atau offline, juga memerlukan partisipasi dalam pengoperasian dan pemeliharaan. Selain itu, penggunaan nama domain tidak terlalu ramah terhadap isolasi lingkungan. , Penelepon harus membuat penilaiannya sendiri berdasarkan nama domain.
- Ada masalah lain. Setiap layanan mikro backend dapat ditulis dalam bahasa yang berbeda dan menggunakan protokol yang berbeda, seperti HTTP, Dubbo, GRPC, dll., Tetapi Anda tidak dapat meminta klien untuk beradaptasi dengan begitu banyak protokol. Ini adalah tugas yang sangat menantang, proyek akan menjadi sangat rumit dan sulit untuk dipelihara.
- Jika nanti Anda perlu refactor layanan mikro, itu akan menjadi sangat merepotkan. Klien perlu bekerja sama dengan Anda untuk melakukan transformasi, seperti layanan komoditas. Karena bisnis menjadi semakin kompleks, nanti perlu dipecah menjadi beberapa layanan mikro. Layanan Saat ini, layanan eksternal juga perlu dipecah menjadi beberapa, dan klien diharuskan bekerja sama dengan Anda dalam transformasi, yang sangat menyakitkan.
API Gateway
Cara yang lebih baik adalah menggunakan gateway API untuk mengimplementasikan gateway API guna mengambil alih semua traffic masuk, mirip dengan peran Nginx, meneruskan semua permintaan pengguna ke server back-end, tetapi gateway tidak hanya meneruskan, tetapi juga menargetkan traffic. Buat beberapa ekstensi, seperti otentikasi, pembatasan arus, izin, sekering, konversi protokol, kode kesalahan pemersatu, caching, logging, pemantauan, alarm, dll., Sehingga logika umum diekstraksi dan gateway disatukan untuk melakukannya, dan sisi bisnis juga dapat berubah Fokus pada logika bisnis dan tingkatkan efisiensi iterasi.
Dengan memperkenalkan API gateway, klien hanya perlu berinteraksi dengan API gateway daripada berkomunikasi dengan antarmuka masing-masing pihak bisnis. Namun, pengenalan satu komponen lagi memperkenalkan satu lagi titik kegagalan potensial. Oleh karena itu, gateway berkinerja tinggi dan stabil harus direalisasikan , Ada banyak poin yang terlibat.
Pendaftaran API
Bagaimana pihak bisnis mengakses gateway? Secara umum, ada beberapa cara.
- Yang pertama menggunakan plugin untuk memindai API dari sisi bisnis, seperti anotasi Spring MVC, dikombinasikan dengan anotasi Swagger untuk mencapai verifikasi parameter, pembuatan SDK dokumen, dan fungsi lainnya. Setelah pemindaian selesai, perlu dilaporkan ke layanan penyimpanan gateway.
- Entri manual. Misalnya, jalur antarmuka, parameter permintaan, parameter respons, metode panggilan dan informasi lainnya, tetapi metode ini akan relatif merepotkan, jika ada terlalu banyak parameter, entri awal akan memakan waktu dan melelahkan.
- Impor file konfigurasi. Misalnya, melalui Swagger \ OpenAPI, dll., Seperti gateway Alibaba Cloud:
Konversi protokol
API internal dapat diimplementasikan oleh banyak protokol yang berbeda, seperti HTTP, Dubbo, GRPC, dll., Tetapi banyak dari mereka tidak terlalu bersahabat dengan pengguna atau tidak dapat diekspos sama sekali, seperti layanan Dubbo, jadi mereka harus berada di lapisan gateway Lakukan konversi protokol, dan ubah permintaan protokol HTTP pengguna menjadi protokol yang sesuai di lapisan gateway, seperti HTTP- > Dubbo, tetapi ada banyak masalah yang perlu diperhatikan di sini, seperti jenis parameter. Jika jenisnya salah, mengakibatkan masalah konversi, dan log tidak cukup detail, masalah akan sulit ditemukan.
Penemuan layanan
Sebagai pintu masuk lalu lintas, gateway bertanggung jawab untuk meneruskan permintaan, tetapi pertama-tama, Anda perlu mengetahui kepada siapa dan bagaimana menanganinya. Ada beberapa cara:
- Sulit untuk menulis di kode / file konfigurasi. Meskipun cara ini membuat frustasi, tetapi juga dapat digunakan. Misalnya, mesin fisik masih digunakan secara online, dan perubahan IP tidak terlalu sering, tetapi akan merepotkan untuk memperluas dan mengontrak, termasuk aplikasi online dan offline. , Gateway itu sendiri bahkan perlu menerapkan seperangkat mekanisme pemantauan kesehatan.
- nama domain. Menggunakan nama domain juga merupakan solusi yang baik, yang dapat diterapkan ke semua bahasa, tetapi untuk layanan internal, nama domain sangat tidak efisien, dan isolasi lingkungan tidak terlalu bersahabat. Misalnya, pra-rilis dan online biasanya database yang sama, jadi Gerbang mungkin membaca nama domain yang sama. Pada saat ini, gerbang yang diterbitkan sebelumnya memanggil layanan online.
- Registri. Pusat pendaftaran tidak akan memiliki masalah di atas. Bahkan dalam lingkungan kontainer, IP node sering berubah, tetapi pemeliharaan daftar node secara real-time akan ditangani oleh registri, yang transparan ke gateway, dan aplikasi online dan offline normal , Termasuk waktu henti abnormal, dll., Juga akan dideteksi oleh mekanisme pemeriksaan kesehatan registri, dan umpan balik ke gateway secara waktu nyata. Dan tidak ada kerugian kinerja tambahan dalam penggunaan kinerja registri. Metode nama domain memerlukan resolusi DNS tambahan dan penerusan Nginx. Ada lebih banyak lompatan di tengah, dan kinerja akan sangat berkurang. Namun, ketika registri digunakan, gateway akan Komunikasi point-to-point langsung dari pihak bisnis tidak akan menimbulkan kerugian tambahan.
Layanan panggilan
Karena gateway terhubung ke banyak protokol yang berbeda, mungkin perlu menerapkan banyak metode panggilan, seperti HTTP, Dubbo, dll. Untuk alasan kinerja, yang terbaik adalah menggunakan metode asinkron, dan dukungan Http dan Dubbo asinkron, misalnya, apache menyediakan Klien HTTP asynchronous berdasarkan NIO.
Karena gateway melibatkan banyak panggilan asinkron, seperti interseptor, klien HTTP, dubbo, redis, dll., Anda perlu mempertimbangkan cara panggilan asinkron. Jika didasarkan pada callback atau masa depan, penyarangan kode akan mendalam dan keterbacaannya buruk , Anda dapat merujuk ke solusi gateway cloud zuul dan pegas, berdasarkan transformasi responsif.
Offline anggun
Graceful offline juga menjadi masalah yang perlu diperhatikan oleh gateway. Lapisan paling bawah dari gateway melibatkan banyak protokol, seperti HTTP dan Dubbo, dan HTTP dapat terus dibagi lagi, seperti nama domain, pusat pendaftaran, dll., Beberapa di antaranya mendukung elegant offline, seperti Nginx Ini mendukung mekanisme pemantauan kesehatan. Jika sebuah node terdeteksi turun, node akan dihapus. Agar aplikasi menjadi offline secara normal, itu perlu digabungkan dengan sistem penerbitan, pertama offline secara logis, dan kemudian tindak lanjut kesehatan Nginx Permintaan pemantauan langsung kembali ke kegagalan (misalnya, mengembalikan 500 secara langsung), lalu menunggu selama jangka waktu tertentu (ditentukan sesuai dengan konfigurasi Nginx), lalu aplikasi benar-benar offline. Selain itu, ini mirip dengan registri. Umumnya, registri hanya mendukung offline manual. Anda dapat memanggil antarmuka registri ke simpul offline selama fase offline logis. Beberapa tidak mendukung offline aktif dan perlu digabungkan dengan cache. Konfigurasi untuk menunda aplikasi secara offline. Selain itu, prinsip lain seperti Dubbo serupa.
kinerja
Sebagai pintu gerbang untuk semua lalu lintas, kinerja adalah prioritas utama. Pada awalnya, sebagian besar gerbang dibangun berdasarkan model pemblokiran sinkron, seperti Zuul 1.x. Tetapi model sinkronisasi semacam ini kita semua tahu bahwa setiap permintaan / koneksi menempati sebuah thread, dan thread adalah sumber daya yang sangat berat di JVM. Misalnya, Tomcat memiliki 200 thread secara default. Jika isolasi gateway tidak dilakukan dengan baik, saat itu terjadi Ketika layanan upstream tertunda karena penundaan jaringan, FullGC, layanan pihak ketiga yang lambat, dll., Kumpulan thread dengan mudah diisi, menyebabkan permintaan baru ditolak, tetapi saat ini, thread sebenarnya diblokir di IO, dan sumber daya sistem tidak diperoleh. penunjukan. Hal lain adalah bahwa ini mudah dipengaruhi oleh penundaan IO jaringan dan disk. Periode waktu tunggu perlu disetel dengan hati-hati. Jika setelannya tidak tepat dan isolasi layanan tidak sempurna, gateway dengan mudah ditarik ke bawah oleh antarmuka yang lambat.
Cara asinkronisasi sangat berbeda. Dalam keadaan normal, inti CPU dapat memulai utas untuk memproses semua permintaan dan tanggapan. Siklus hidup permintaan tidak lagi ditetapkan dalam satu utas, tetapi akan dibagi menjadi beberapa tahapan dan diproses oleh kumpulan utas yang berbeda, sehingga sumber daya sistem dapat dimanfaatkan secara lebih maksimal. Dan karena utas tidak lagi dimonopoli oleh koneksi, sumber daya sistem yang ditempati oleh koneksi akan jauh lebih rendah, hanya deskriptor file ditambah beberapa pendengar, dll., Dan dalam model pemblokiran, setiap koneksi akan memonopoli utas , Dan utas adalah sumber daya yang sangat berat. Latensi layanan hulu juga dapat sangat dikurangi, karena dalam model pemblokiran, permintaan yang lambat akan memonopoli sumber daya utas, dan setelah asinkronisasi, karena sumber daya yang ditempati oleh satu sambungan menjadi sangat rendah, sistem dapat memproses pada waktu yang sama. Banyak permintaan.
Jika ini adalah platform JVM, Zuul 2, gateway Spring Cloud, dll. Semuanya merupakan pilihan yang baik untuk gateway asinkron. Selain itu, Anda juga dapat melakukan studi mandiri berdasarkan dukungan asinkron dari Netty, webflux Spring Boot 2.x, vert.x, atau servlet3.1.
Cache
Untuk beberapa permintaan get idempoten, lapisan cache dapat dibuat di tingkat gateway sesuai dengan header cache yang ditentukan oleh pihak bisnis, dan disimpan di cache sekunder seperti Redis, sehingga beberapa permintaan berulang dapat langsung diproses di lapisan gateway tanpa terkena Lini bisnis mengurangi tekanan pada sisi bisnis.Selain itu, jika node sisi bisnis turun, gateway juga dapat kembali ke cache-nya sendiri.
Membatasi
Pembatasan arus merupakan komponen yang diperlukan untuk setiap komponen bisnis.Jika pembatasan arus tidak dilakukan dengan benar, ketika volume permintaan meningkat secara tiba-tiba, mudah menyebabkan layanan dari sisi bisnis ditutup, seperti Double 11 dan Double 12 Saat menunggu promosi besar, volume permintaan antarmuka beberapa kali lipat dari biasanya.Jika kapasitas tidak dievaluasi dan batas saat ini tidak dilakukan, mudah untuk melayani seluruh ketidaktersediaan.Oleh karena itu, perlu menerapkan strategi batas saat ini sesuai dengan kemampuan pemrosesan antarmuka sisi bisnis , Saya yakin semua orang telah melihat halaman downgrade ketika Taobao dan Baidu mengambil amplop merah.
Oleh karena itu, perlu diterapkan strategi pembatasan saat ini pada lapisan akses. Untuk antarmuka non-inti, dapat langsung diturunkan untuk memastikan ketersediaan layanan inti. Untuk antarmuka inti, perlu dirumuskan strategi pembatasan saat ini yang sesuai berdasarkan kapasitas antarmuka yang diperoleh selama pengujian stres. Batasan arus dibagi menjadi beberapa jenis:
- Berdiri sendiri. Kinerja yang berdiri sendiri relatif tinggi, tidak melibatkan panggilan jarak jauh, tetapi hanya dihitung secara lokal, yang memiliki dampak paling kecil pada antarmuka RT. Namun, Anda perlu mempertimbangkan setelan nomor batas bawah, seperti apakah itu untuk satu gerbang atau seluruh cluster gateway. Jika itu adalah keseluruhan cluster, Anda perlu mempertimbangkan gateway menyusut dan memperluas jumlah batas yang sesuai saat ini.
- didistribusikan. Didistribusikan membutuhkan node penyimpanan untuk mempertahankan jumlah panggilan ke antarmuka saat ini, seperti redis, sentinel, dll. Metode ini akan menyebabkan beberapa kehilangan kinerja karena panggilan jarak jauh, dan juga perlu mempertimbangkan penyimpanan hang, seperti redis jika hang Gateway perlu mempertimbangkan rencana penurunan, apakah akan menurunkan versi ke pembatasan arus lokal atau langsung menurunkan fungsi pembatas saat itu sendiri.
Ada juga strategi yang berbeda: penghitungan sederhana, keranjang token, dll. Dalam kebanyakan skenario, penghitungan sederhana sebenarnya cukup, tetapi jika Anda perlu mendukung skenario seperti lalu lintas lonjakan, Anda dapat menggunakan keranjang token dan solusi lainnya. Anda juga perlu mempertimbangkan apa yang menjadi dasar batas saat ini, seperti IP, antarmuka, dimensi pengguna, atau beberapa nilai dalam parameter permintaan. Ekspresi dapat digunakan di sini, yang relatif fleksibel.
stabilitas
Stabilitas adalah bagian yang sangat penting dari gateway. Pemantauan dan alarm perlu disempurnakan, seperti volume panggilan antarmuka, waktu respons, pengecualian, kode kesalahan, tingkat keberhasilan, dan alarm pemantauan terkait lainnya, serta yang terkait kumpulan utas. Misalnya jumlah thread aktif, antrian backlog, dll, dan beberapa level sistem, seperti CPU, memori, FullGC, dan basic lainnya.
Gateway adalah pintu masuk ke semua layanan. Persyaratan untuk stabilitas gateway lebih tinggi daripada layanan lain. Cara terbaik adalah menjalankan secara stabil sepanjang waktu dan memulai ulang sesedikit mungkin, tetapi saat menambahkan fitur baru atau menambahkan log untuk memecahkan masalah, hal itu tidak dapat dihindari Ini perlu dirilis ulang, sehingga Anda dapat merujuk pada cara Zuul untuk mengimplementasikan semua fungsi inti berdasarkan interseptor yang berbeda. Kode interseptor ditulis dalam Groovy, disimpan dalam database, dan mendukung pemuatan, kompilasi, dan operasi dinamis. Ini akan menimbulkan masalah Jika gateway perlu mengembangkan fungsi baru, ia hanya perlu menambahkan pencegat baru dan secara dinamis menambahkannya ke gateway tanpa rilis ulang.
Fuse downgrade
Mekanisme sekring juga sangat penting. Jika layanan tertentu mati atau respon timeout antarmuka terjadi secara serius, seluruh gateway dapat ditarik ke bawah oleh sebuah antarmuka, sehingga perlu untuk meningkatkan degradasi sekring. Ketika pengecualian tertentu terjadi, degradasi antarmuka dikembalikan langsung oleh gateway, yang dapat didasarkan pada Hystrix atau Implementasi Resilience4j.
Catatan
Karena semua permintaan diproses oleh gateway, log juga harus relatif lengkap, seperti antarmuka yang memakan waktu, metode permintaan, IP permintaan, parameter permintaan, parameter respons (perhatikan desensitisasi), dll. Selain itu, karena banyak saluran mikro mungkin terlibat Oleh karena itu, layanan perlu menyediakan traceId terpadu untuk memfasilitasi asosiasi semua log. TraceId ini dapat ditempatkan di header respons untuk memfasilitasi pemecahan masalah.
isolasi
Misalnya, isolasi tingkat aplikasi seperti kumpulan utas, kumpulan koneksi http, dan redis. Selain itu, layanan inti dapat diterapkan dengan kluster gerbang terpisah sesuai dengan skenario bisnis untuk mengisolasi mereka dari layanan non-inti lainnya.
Platform kontrol gateway
Ini juga merupakan bagian yang sangat penting. Anda perlu mempertimbangkan pengalaman pengguna dari keseluruhan proses. Misalnya, dapatkah proses menghubungkan ke gateway disederhanakan dan secerdas mungkin. Misalnya, jika itu adalah antarmuka dubbo, kita bisa mendapatkan kode sumber dari repositori git, Analisis kelas dan metode yang sesuai, untuk mewujudkan pengisian otomatis, dan mencoba membantu pengguna mengurangi operasi; selain itu, antarmuka umumnya dari pengujian- > Muka- > Secara online, jika harus mengisi formulir setiap saat akan sangat merepotkan. Bisakah kita melakukan ini secara otomatis? Selain itu, jika gateway diterapkan ke beberapa zona ketersediaan atau bahkan negara yang berbeda, maka saat ini kita juga perlu melakukan sinkronisasi data antarmuka Fungsi, jika tidak, pengguna perlu mengoperasikannya di setiap latar belakang, yang sangat merepotkan.
Saran pribadi ini adalah dengan merujuk langsung ke layanan gateway yang disediakan oleh Alibaba Cloud, aws, dll., Dan fungsinya sangat komprehensif.
lain
Ada poin lain yang perlu dipertimbangkan, seperti tiruan antarmuka, pembuatan dokumen, pembuatan kode sdk, penyatuan kode kesalahan, manajemen layanan terkait, dll., Yang tidak dibahas di sini.
Untuk menyimpulkan
Gerbang saat ini masih merupakan arsitektur terpusat, dan semua permintaan harus melalui gerbang satu kali. Oleh karena itu, ketika ada promosi besar atau peningkatan lalu lintas yang tiba-tiba, gerbang dapat menjadi hambatan kinerja, dan ketika gerbang terhubung ke sejumlah besar antarmuka, buat lalu lintas yang baik Evaluasi bukanlah tugas yang mudah. Sebelum setiap promosi besar, Anda perlu melakukan pengujian tekanan pada antarmuka dengan sisi bisnis untuk mengevaluasi perkiraan kapasitas dan memperluas gateway. Gerbang adalah pintu masuk semua lalu lintas, dan semua permintaan adalah Ini diproses oleh gateway, sangat rumit untuk memperkirakan kapasitas secara akurat. Anda dapat merujuk ke ServiceMesh yang saat ini populer, menggunakan solusi terdesentralisasi untuk memasukkan logika gateway ke sidecar, menerapkan sidecar dan aplikasi ke node yang sama, dan mengambil alih lalu lintas aliran masuk dan keluar aplikasi. Dalam promosi sebesar itu, hanya perlu Stress testing dari layanan terkait dan perluasan yang ditargetkan sudah cukup. Selain itu, peningkatan akan lebih lancar. Meskipun gateway terpusat dirilis dalam skala abu-abu, secara teoritis semua lalu lintas bisnis akan mengalir ke versi baru dari gateway. Masalahnya akan mempengaruhi semua bisnis, tetapi pendekatan desentralisasi ini pertama-tama dapat ditingkatkan untuk bisnis non-inti, dan setelah mengamati untuk jangka waktu tertentu, tidak ada masalah, dan kemudian semuanya akan diluncurkan secara online. Selain itu, solusi ServiceMesh lebih ramah terhadap dukungan multi bahasa.
- Kebenaran di balik serangan seksual terhadap anak-anak mengerikan, para netizen: Sama sekali tidak ada toleransi
- Selamat tinggal botol air! 3 siswa Inggris menemukan kantong air yang dapat dimakan, menarik 7,3 juta penonton untuk meniru
- Sebuah "Kota yang Dapat Dimakan", ia membutuhkan waktu 6 tahun untuk membangunnya, semua yang ada di belakangnya begitu indah
- Taman kanak-kanak paling "indah" di China telah lahir! Netizen: Saya sangat ingin pergi ke taman kanak-kanak lagi
- Dia adalah siswa terbaik di Yale, tetapi dengan gaji bulanan 1.453 yuan, dia menghabiskan 6 tahun di sebuah desa pegunungan kecil di Hunan.
- "TWICE" "Share" 190617 "TWICE" menduduki peringkat keempat dalam "Japan Oricon Semi-Annual Chart Top 50"
- Pidato bahasa Inggris Yuan Longping yang berusia 89 tahun meledakkan Internet: dia adalah kebanggaan China yang sebenarnya