Pengantar Spring Cloud Gateway
Versi resmi Spring Boot 2 baru saja dirilis beberapa waktu lalu. Spring Cloud Gateway didasarkan pada Spring Boot 2 dan merupakan proyek baru Spring Cloud. Proyek ini menyediakan gerbang API yang dibangun di ekosistem musim semi, termasuk: Spring 5, Spring Boot 2 dan Project Reactor. Spring Cloud Gateway dirancang untuk memberikan cara yang sederhana dan efisien untuk mengirim API dan memberi mereka masalah lintas sektor seperti: keamanan, pemantauan/metrik dan ketahanan. Versi terbaru saat ini adalah v2.0.0.m8, dan versi resmi juga akan segera tiba.
Fitur Spring Cloud Gateway:
vs Netflix Zuul
Zuul didasarkan pada Servlet 2.5 (menggunakan 3.x), menggunakan API pemblokiran. Itu tidak mendukung koneksi panjang seperti websockets. Sementara gateway dibangun di Spring Framework 5, Project Reactor, dan Spring Boot 2, menggunakan API non-blocking. Websockets didukung dan akan menjadi pengalaman pengembangan yang lebih baik karena sangat terintegrasi dengan musim semi.
Praktek Pendahuluan Gateway Gateway Musim Semi
Penulis baru -baru ini mempelajari kode sumber Spring Cloud Gateway, dan telah menulis artikel tentang analisis kode sumber untuk sebagian besar fungsi, tetapi versi resmi belum dirilis. Artikel ini adalah praktik pengantar, menunjukkan beberapa fungsi yang umum digunakan, dan menantikan rilis versi resmi terbaru.
Contoh Memulai Dua Layanan: Gateway-Server dan Server Pengguna. Skenario yang disimulasikan adalah bahwa klien meminta layanan backend dan gateway menyediakan pintu masuk terpadu ke layanan backend. Semua layanan backend terdaftar dengan Layanan dan ditemukan Konsul (baik Build ZK dan Eureka OK, dan saya lebih terbiasa menggunakan Konsul). Gateway ke depan ke layanan backend tertentu melalui penyeimbangan beban.
Layanan Pengguna
Layanan pengguna terdaftar dengan konsul dan menyediakan antarmuka/tes.
mengandalkan
Ketergantungan yang diperlukan adalah sebagai berikut:
<dependency> <GroupId> org.springframework.cloud </groupid> <ArTifactId> Spring-cloud-starter-consul-discovery </artifactid> </gandendency> <sependency> <RoupId> org.springframework.boot </groupid> <ArtiFacTid> Spring-boot-starterter.BACTIF </groupid> <ArtiFacTID> Spring-boots-starterter.BOCKIT </Groupid> <ArtiFacTID> Spring-boots-starterter.BACTIF </groupid> <ArTtifacTID> Spring-Boot-Starterter
File konfigurasi
spring: application: name: user-service cloud: consult: host: 192.168.1.204 port: 8500 discovery: ip-address: ${HOST_ADDRESS:localhost} port: ${SERVER_PORT:${server.port}} healthCheckPath: /health healthCheckInterval: 15s instance-id: user-${server.port} service-name: userserver: port: 8005 Management: Keamanan: Diaktifkan: SalahMengekspos antarmuka
@SpringbootApplication@restcontroller@enableDiscoVeryClientPublic kelas gatewayeSerApplication {public static void main (string [] args) {springapplication.run (gatewayUserApplication.class, args); } @GetMapping ("/test") public string test () {return "ok"; }}Ekspos/Tes Antarmuka dan kembalikan OK.
Layanan Gateway
Gateway Service menyediakan berbagai konfigurasi perutean, pabrik penegasan perutean, dan memfilter pabrik.
mengandalkan
Ketergantungan yang perlu diperkenalkan:
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-aktuator </artifactid> </dependency> // Ketergantungan pada WebFlux, perlu untuk memperkenalkan <pendekening> <groupid> org.springframework.boot </groupid> <artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway-core</artifactId></dependency>//Service discovery component, excluding web dependencies<dependency> <groupid> org.springframework.cloud </groupid> <ArtifactId> Spring-cloud-starter-consul-discovery </arttifactid> <version> 2.0.0.m6 </version> <scuxtid> <scructid> <groupid> org.springframework.boot </groupid> <ArtifacTid> <RoupD> </Exclusion> </Exclussions> </gandendency> // Ketergantungan Kotlin <Sependensi> <Groupid> org.jetbrains.kotlin </sroupid> <ArtifactId> Kotlin-stdlib </arttifactid> </Version> $ {Kotlin.version} </Version> </ArtifactId </Version> $ {Kotlin.version <groupid> org.jetbrains.kotlin </groupid> <ArTifactId> Kotlin-Reflect </artifactId> <Version> $ {Kotlin.version} </version> <pilihan> true </porton> </dependency>Seperti disebutkan di atas, dependensi terkait Kotlin diperkenalkan, dan konfigurasi perutean Kotlin perlu didukung di sini. Penggunaan Spring Cloud Gateway membutuhkan konfigurasi terkait web yang tidak termasuk. Ini memperkenalkan referensi ke WebFlux. Ini akan diperiksa ketika aplikasi dimulai dan harus diperkenalkan.
Routing Assertion Factory
Ada banyak jenis pabrik pernyataan perutean, tergantung pada waktu permintaan, host, jalur, metode, dll. Definisi berikut adalah pencocokan pernyataan rute berbasis jalur.
@Beanpublic routerfunction <Meregrespons> testFunRouterFunction () {routerfunction <derserponse> route = routerfunctions.Route (requestPredicates.path ("/testfun"), request -> serverResponse.ok (). Body (Bodyinser.from "), serverResponse.ok (). Body (Bodyinsers.froMun rute rute;}Ketika jalur yang diminta adalah /testfun, kode status OK dikembalikan langsung, dan badan respons adalah string hello.
Pabrik Filter
Gateway sering perlu memfilter permintaan perutean dan melakukan beberapa operasi, seperti membangun header setelah otentikasi. Ada banyak jenis penyaringan, seperti menambahkan header permintaan, menambahkan parameter permintaan, menambahkan header respons dan pemutus sirkuit, dll.
@BeanPublic RouteLocator CustomRoutelocator (RouteLocatorBuilder Builder, ThrottlegatewayFilterfactory Throttle) {//@formatter: off return builder.Routes () .Route (r -> r.path ("/image/webp") .ffliSters (f -f. F.addry ("f.addread (" "f.addread (" f.addread ("f.azead (" f. F. " .uri ("http://httpbin.org:80")) .build (); //@formatter: on}Seperti di atas, ketika jalur permintaan adalah/gambar/webp, permintaan diteruskan ke http://httpbin.org:80, dan responsnya difilter, menambahkan header respons X-anotherheader: Baz.
Routing khusus
Dua subbagian di atas milik routing kustom API, dan juga dapat didefinisikan melalui konfigurasi:
Spring: Cloud: Gateway: Locator: Diaktifkan: True Default-Filters:-AddResponseHeader = X-Response-Default-Foo, Rute Bar Default: # =============================================================================================================================================== =============================================================================================================================================== =============================================================================================================================================== =============================================================================================================================================
Konfigurasi di atas mendefinisikan perutean dan filter. Filter global menambahkan semua tanggapan ke header X-Response-Default-Foo: Default-Bar. Rute dengan ID default_path_to_http didefinisikan, tetapi prioritasnya relatif rendah. Ketika permintaan tidak bisa cocok, itu akan diteruskan ke blueskykong.com.
Routing Kustom Kotlin
Spring Cloud Gateway dapat menggunakan Kotlin untuk menyesuaikan routing:
@ConfigurationClass Tambahan Tambahan {@Bean Fun Tambahan Tambahanelocator (Builder: RouteLocatorBuilder): routeLocator = builder.Routes {route (id = "test-kotlin") {path ("/image/png") filter {addResponshead ("x-tehophead (" x-tehophead ") fo-theader") Uri ("http://httpbin.org:80")}}}Ketika jalur yang diminta adalah/gambar/png, itu akan diteruskan ke http://httpbin.org:80, dan filter diatur, dan header X-Testheader: Foobar ditambahkan ke header responsnya.
Komponen Penemuan Layanan
Dikombinasikan dengan pendaftaran layanan dalam komponen penemuan, diteruskan ke instance layanan spesifik melalui layanan. Ketergantungan yang sesuai telah diperkenalkan dalam konfigurasi sebelumnya.
@BeanPublic routedefinitionLocator DiscoveryClientRoutEdefinitionLocator (DiscoveryClient DiscoveryClient) {return New DiscoveryClientRoutEdefinitionLocator (DiscoveryClient);} Menyuntikkan penemuan ke dalam konstruktor DiscoveryClientRoutEdefinitionLocator. Analisis kode sumber akan dijelaskan nanti, dan tidak akan diperluas di sini.
Spring: Cloud: Gateway: Locator: Diaktifkan: True Default-Filters:-AddResponseHeader = X-Response-Default-Foo, Rute Bar Default: # ===========================================================. - Stripprefix = 1
Konfigurasi di atas memungkinkan implementasi Locator Discoveryclient. Rute menentukan bahwa semua permintaan yang dimulai dengan /pengguna akan diteruskan ke layanan pengguna, dan filter path akan diterapkan untuk mencegat bagian pertama dari awalan jalur. Artinya, permintaan aktual untuk mengakses/pengguna/tes dikonversi menjadi LB: // pengguna/tes.
Websocket
Anda juga dapat mengonfigurasi perutean gateway Websocket:
Spring: Cloud: Gateway: Default-Filters:-AddResponseHeader = X-Response-Default-Foo, Default-Bar Rute:-ID: Websocket_test URI: WS: // Localhost: 9000 Pesanan: 9000 Predikat:-path =/echo
Mulailah server WS WSCAT -listen 9000, mulailah gateway (port gateway adalah 9090), dan sambungkan klien ke wscat -connect ws: // localhost: 9090/echo.
Akses Klien
Pembaca dapat mengunduh kode sumber untuk mencoba fungsi di atas. Di sini saya hanya menunjukkan hasil mengakses layanan pengguna:
Gateway berhasil memuat seimbang ke server pengguna dan kembali ok. Header respons berisi header X-Response-Default-Foo Header Global: Default-Bar
Meringkaskan
Dalam artikel ini, kami mengeksplorasi beberapa fitur dan komponen yang dimiliki oleh Spring Cloud Gateway. API baru ini menyediakan alat out-of-the-box untuk dukungan gateway dan proxy. Menantikan versi resmi Spring Cloud Gateway 2.0.
Alamat kode sumber
https://github.com/keets2012/spring-cloud_samples
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.