Melalui berbagi sebelumnya, kami telah belajar tentang beberapa fasilitas inti arsitektur layanan mikro, melalui komponen -komponen ini, kami dapat membangun sistem arsitektur layanan mikro sederhana. Misalnya, membangun pusat pendaftaran layanan yang sangat tersedia melalui Spring Cloud Eureka dan sadari pendaftaran dan penemuan layanan;
Load Balancing dengan Spring Cloud Ribbon atau Retign; Perlindungan layanan toleran terhadap layanan dengan Spring Cloud Hystrix untuk menghindari kegagalan penyebaran. Setelah layanan mikro dibangun, kami pasti akan menyediakan beberapa antarmuka layanan API Restful Unified ke sistem eksternal untuk panggilan.
Tetapi ketika sistem eksternal memanggil API RESTful kami, bagaimana Anda menentukan layanan mana yang diperlukan untuk menyediakan fungsi spesifik yang dibutuhkan? Ini melibatkan pemeliharaan aturan perutean dan daftar instance layanan.
Ini memperkenalkan protagonis kami hari ini - Spring Cloud Zuul, yang merupakan komponen gateway API berdasarkan implementasi Netflix Zuul. Itu dapat menyelesaikan dua masalah utama:
Oke, mari kita lihat cara mengimplementasikan layanan gateway ini.
1. Bangun gateway dan konfigurasikan perutean
Di sini kita masih perlu menggunakan layanan Hello-Service dan Petana-Konsumer sebelumnya. Kami dulu menganggap konsumen pisas sebagai konsumen layanan, tetapi jangan lupa bahwa dalam sistem Eureka, setiap layanan merupakan penyedia layanan dan konsumen layanan, jadi konsumen-konsumen juga merupakan penyedia layanan, dan antarmuka seperti http: // localhost: 9001/konsumen konsumen yang disediakan layanan yang disediakan.
Selanjutnya, kami membangun layanan gateway dengan struktur kode sebagai berikut:
Langkah Implementasi Kode:
Buat API-Gateway Proyek Maven baru
Memodifikasi file pom
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/maven.romp.romp.romp. http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sam</groupId> <artifactId>api-gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupid> org.springframework.boot </proupid> <ArtiFacTId> Spring-boot-starter-parent </arttifactid> <version> 1.5.1.release </version> </parter> <poperties> <javaversion> 1.8 </javaversion> </Properties> <! <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependencyManagement> <dependencies> <!-- Introducing zuul dependency, which relies on spring-boot-starter-aktuator/spring-boot-starter-hystrix/spring-boot-starter-ribbon-> <dependency> <Groupid> org.springframework.cloud </groupid> <ArTifactId> SPRING-CLOUD-STARTER-ZUUL </artifactid> </Digergency> </Dependencies>
Buat kelas startup baru
/*** @EnableZuulproxy Mengaktifkan fungsi layanan Gateway API Zuul**/@enablezuulproxy@springcloudapplicationpublic kelas gatewayapp {public static main (string [] args) {springappplication.run (gatewayapp.class, args); }}Buat application.properties baru
server.port = 5555spring.application.name = API-Gateway#Tambahkan ke konfigurasi aturan perutean#konfigurasi melalui zuul.Routes. <soute> .path dan zuul.Routes. <soute> .url. <ute> adalah nama rute dan dapat ditentukan secara sewenang-wenang, tetapi nama rute dari satu set jalur dan URL harus sama#seperti yang ditunjukkan dalam contoh berikut: semua memenuhi/API-A/** akses ke aturan akan dialihkan ke alamat // Localhost: 9001, yaitu, ketika kami mengakses http: // localhost ke localhost: 9001#, yaitu, ketika kami mengakses http: // localhost ke localhost: 9001#, yaitu, ketika kami mengakses http: // localhost ke localhost: 9001#, yaitu, ketika kami mengakses http: // localhost ke localhost: 9001#, yaitu, ketika kami mengakses http://localhost the localhost: 9001#, yaitu, ketika kami mengakses http://localhost the local Antarmuka Microservice Disediakan oleh http: // localhost: 9001/halo Zuul.Routes.API-A.PATH =/API-A/** Zuul.Routes.Api-A.url = http: // Localhost: 9001zuul.Routes.API-B.Path =/API-B/** Zuul.Routes.API-B.Url = http:/http://http://http://http://http://http://http://http://http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/http:/
Uji, Mulailah Eureka, Hello-Service, Petana-Konsumer dan Layanan API-Gateway yang baru ditambahkan, lalu kunjungi http: // Localhost: 5555/API-A/PEIGN-CONSUMER
Berhasil mengakses antarmuka layanan dari konsumen-konsumen-feign-konsumen.
Langkah -langkah di atas menerapkan konfigurasi perutean tradisional. Konfigurasi ini memiliki kelemahan besar, yaitu membutuhkan konfigurasi aturan perutean manual dalam file application.properties. Ketika ada banyak layanan, beban kerja pemeliharaan akan sangat besar. Untuk mengurangi biaya pemeliharaan, ada rute lain yang berorientasi pada rute.
2. Routing berorientasi layanan
Spring Cloud Zuul dan Eureka Integrate, kita dapat membuat jalur rute bukan memetakan URL spesifik, tetapi layanan spesifik, dan URL layanan secara otomatis dikelola oleh mekanisme penemuan layanan Eureka. Jenis rute ini adalah rute berorientasi layanan. Konfigurasi kode spesifik adalah sebagai berikut:
Ubah file POM dan perkenalkan dependensi Eureka
<!-Memperkenalkan dependensi eureka-> <dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-eureka </artifactid> </dependency>
Ubah File Konfigurasi Application.Properties
server.port = 5555spring.application.name = API-Gatewayzuul.Routes.Api-A.Path =/API-A/**# Di sini kami menggunakan layanan sebagai URL, dan menggunakan nama layanan alih-alih nomor port IP+Port Zuul.Routes.API-A.ServiceID = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111/eureka
Catatan: Zuul.Routes.API-A.URL = Hello-Service juga dapat mengimplementasikan fungsi, tetapi tidak dapat melakukan penyeimbangan beban normal dan perlindungan toleran terhadap kesalahan.
Uji, kunjungi http: // localhost: 5555/api-a/hello
Aksesnya berhasil.
3. Aturan default untuk perutean layanan
Dalam rute yang berorientasi layanan, karena nama <ute> secara sewenang-wenang, apakah ini mungkin:
zuul.Routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceid = hello-service
<soute> Nama adalah nama layanan. Bahkan, dalam aplikasi yang sebenarnya, kami sering menyebutkannya dengan cara ini. Jika ada aturan seperti itu, Zuul dapat membantu kami mengimplementasikan fungsi -fungsi tersebut secara default, lebih lanjut menyimpan masalah konfigurasi.
Mari kita lakukan percobaan dan ubah file konfigurasi menjadi:
server.port = 5555Spring.application.name = API-Gatewayeureka.client.Service-url.defaultzone = http: // localhost: 1111/eureka
Kemudian verifikasi akses halaman
Aksesnya berhasil.
Namun, secara default, layanan di Eureka akan dialihkan oleh Zuul membuat hubungan pemetaan default, sehingga layanan yang tidak ingin kami buka ke dunia luar juga diakses secara eksternal. Pada saat ini, kami dapat mengonfigurasi aturan yang tidak memerlukan pembuatan perutean otomatis oleh Zuul.Inchored-Services. Ketika Zuul.ignored-Services =*, semua layanan tidak akan secara otomatis membuat aturan perutean. Pada saat ini, konfigurasi perutean yang relevan perlu dilakukan melalui konfigurasi sebelumnya.
=================== GREATD GREATD GREATE ========================
Begitu banyak yang telah dikatakan sebelumnya, semua berputar di sekitar satu masalah: aturan perutean dan masalah pemeliharaan instance layanan. Jadi bagaimana cara menyelesaikan masalah kedua (memeriksa masalah redundansi)?
4. Penyaringan permintaan
Untuk memverifikasi permintaan klien di API Gateway, kami dapat menggunakan filter untuk mencegat dan memfilter permintaan. Metode implementasi relatif sederhana. Anda hanya perlu mewarisi kelas abstrak Zuulfilter dan mengimplementasikan empat metode.
Ubah API-Gateway:
Menambahkan kelas filter
/*** mewarisi zuulfilter dan mengimplementasikan 4 antarmuka** untuk pemfilteran permintaan**/kelas publik AccessFilter memperluas Zuulfilter {Logger Logger = LoggerFactory.getLogger (AccessFilter.class); / * * Haruskah Filter menentukan apakah filter perlu dieksekusi * * mengembalikan true di sini, menunjukkan bahwa filter akan berlaku pada semua permintaan. * Dalam penggunaan aktual, kita dapat menggunakan fungsi ini untuk menentukan kisaran efektif filter*/ @Override public boolean seharusnya filter () {return true; } /** Logika spesifik dari filter** Di sini kami meminta Zuul untuk meminta melalui ctx.setsendzuulResponse (false) dan jangan merutekannya* lalu kami mengatur kode kesalahan yang dikembalikan melalui ctx.setresponseStexCode (401)* / @Override run objek publik () {requestContext contextcext = contextcext.context. HttpservletRequest request = context.getRequest (); Object AccessToken = request.getParameter ("AccessToken"); Logger.info ("Kirim {} permintaan ke {}", request.getMethod (), request.getRequesturl (). ToString ()); if (accessToken == null) {context.setsendzuulResponse (false); Context.SetResponseStuScode (401); } return null; } /* Filtertype Mengembalikan Jenis Filter* Menentukan siklus hidup mana filter dijalankan. Ini didefinisikan sebagai pre, yang berarti bahwa permintaan akan dieksekusi sebelum dialihkan. * * Pre: Filter Sebelum Permintaan Eksekusi * Rute: Proses Permintaan dan Rute * Posting: Filter Dieksekusi Setelah Pemrosesan Permintaan selesai * Kesalahan: Filter dieksekusi saat kesalahan terjadi */ @Override public string filtertype () {return "pre"; } / * * Filterorder Mengembalikan urutan eksekusi filter * * Ketika permintaan memiliki beberapa filter dalam satu tahap, perlu untuk menjalankannya sekali berdasarkan nilai pengembalian metode * * / @Override public int filterorder () {return 0; }}Ubah kelas startup
/*** @Enablezuulproxy Mengaktifkan fungsi layanan Gateway API Zuul**/ @enablezuulproxy @springcloudapplicationpublic class gatewayapp {// bean ditambahkan untuk mengimplementasikan @bean public accessFilter AccessFilter () {return new AccessFilter (); } public static void main (string [] args) {springApplication.run (gatewayapp.class, args); }}tes
) Kunjungi http: // localhost: 5555/hello-service/hello, aksesnya gagal
) Kunjungi http: // localhost: 5555/hello-service/hello? AccessToken = token, akses secara normal
Struktur kode yang dimodifikasi:
5. Perluas dan Perpanjang
Bahkan, ketika fungsi perutean benar -benar berjalan, pemetaan perutean dan penerusan permintaan semuanya dilakukan oleh beberapa filter yang berbeda.
Pemetaan perutean terutama diselesaikan melalui filter pra-tipe, yang cocok dengan jalur permintaan dengan aturan perutean yang dikonfigurasi dan menemukan alamat target yang perlu diteruskan.
Bagian penerusan permintaan diselesaikan oleh filter rute, yang meneruskan alamat rute yang diperoleh oleh filter pra-tipe.
Oleh karena itu, filter dapat dikatakan sebagai komponen inti dari fungsi Gateway API Zuul. Setiap permintaan HTTP yang memasukkan Zuul akan ditanggapi melalui serangkaian rantai pemrosesan filter dan dikembalikan ke klien.
Meringkaskan
Di atas adalah masalah penggunaan Zuul untuk mengimplementasikan layanan API Gateway di Spring Cloud. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!