บทนำสู่สปริงคลาวด์เกตเวย์
เวอร์ชันทางการของ Spring Boot 2 เพิ่งเปิดตัวเมื่อไม่นานมานี้ Spring Cloud Gateway ขึ้นอยู่กับ Spring Boot 2 และเป็นโครงการใหม่ล่าสุดของ Spring Cloud โครงการจัดทำเกตเวย์ API ที่สร้างขึ้นบนระบบนิเวศฤดูใบไม้ผลิรวมถึง: Spring 5, Spring Boot 2 และ Project Reactor Spring Cloud Gateway ได้รับการออกแบบมาเพื่อให้วิธีที่เรียบง่ายและมีประสิทธิภาพในการส่ง APIs และให้ข้อกังวลเกี่ยวกับการตัดข้ามเช่น: ความปลอดภัยการตรวจสอบ/การวัดและความยืดหยุ่น เวอร์ชันล่าสุดปัจจุบันคือ v2.0.0.m8 และเวอร์ชันอย่างเป็นทางการจะมาที่นี่เร็ว ๆ นี้
คุณสมบัติของ Spring Cloud Gateway:
vs netflix zuul
Zuul ขึ้นอยู่กับ Servlet 2.5 (ใช้ 3.x) โดยใช้การปิดกั้น API ไม่รองรับการเชื่อมต่อที่ยาวนานเช่น WebSockets ในขณะที่เกตเวย์ถูกสร้างขึ้นบน Spring Framework 5, Project Reactor และ Spring Boot 2 โดยใช้ API ที่ไม่ปิดกั้น WebSockets ได้รับการสนับสนุนและจะเป็นประสบการณ์การพัฒนาที่ดีขึ้นเพราะมีการรวมเข้ากับฤดูใบไม้ผลิอย่างแน่นหนา
การแนะนำการแนะนำ Gateway Spring Gateway
เมื่อเร็ว ๆ นี้ผู้เขียนได้ศึกษาซอร์สโค้ดของ Spring Cloud Gateway และได้เขียนบทความเกี่ยวกับการวิเคราะห์ซอร์สโค้ดสำหรับฟังก์ชั่นส่วนใหญ่ แต่เวอร์ชันอย่างเป็นทางการยังไม่ได้รับการเผยแพร่หลังจากทั้งหมด บทความนี้เป็นแนวปฏิบัติเบื้องต้นแสดงฟังก์ชั่นที่ใช้กันทั่วไปหลายฟังก์ชั่นและหวังว่าจะได้เปิดตัวเวอร์ชันทางการล่าสุด
ตัวอย่างเริ่มต้นสองบริการ: เกตเวย์เซิร์ฟเวอร์และเซิร์ฟเวอร์ผู้ใช้ สถานการณ์จำลองคือลูกค้าร้องขอบริการแบ็กเอนด์และเกตเวย์ให้ทางเข้าแบบครบวงจรไปยังบริการแบ็กเอนด์ บริการแบ็กเอนด์ทั้งหมดลงทะเบียนกับบริการและพบกงสุล (ทั้ง Build ZK และ Eureka ก็โอเคและฉันคุ้นเคยกับการใช้กงสุลมากขึ้น) เกตเวย์ส่งต่อไปยังบริการแบ็กเอนด์ที่เฉพาะเจาะจงผ่านการโหลดบาลานซ์
บริการผู้ใช้
บริการผู้ใช้ได้รับการลงทะเบียนกับกงสุลและให้อินเทอร์เฟซ/ทดสอบ
พึ่งพา
การพึ่งพาที่ต้องการมีดังนี้:
<การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Concovery-scovery </artifactid> </serpendency> <การพึ่งพา> <roupid> org.springframework.boot </groupid> <ratifactid>
ไฟล์กำหนดค่า
ฤดูใบไม้ผลิ: แอปพลิเคชัน: ชื่อ: ผู้ใช้บริการคลาวด์: ที่ปรึกษา: โฮสต์: 192.168.1.204 พอร์ต: 8500 Discovery: IP-address: $ {host_address: localhost} พอร์ต: $ {server_port: $ {server.port}} HealthCheckPath: /HealthCheckInterval 8005 การจัดการ: ความปลอดภัย: เปิดใช้งาน: เท็จเปิดเผยอินเทอร์เฟซ
@springbootapplication@restcontroller@enablecoverycoverycelientpublic คลาส gatewayuserapplication {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (gatewayuserapplication.class, args); } @getMapping ("/ทดสอบ") การทดสอบสตริงสาธารณะ () {return "ตกลง"; -เปิดเผย/ทดสอบอินเทอร์เฟซและส่งคืนตกลง
บริการเกตเวย์
Gateway Service ให้การกำหนดค่าการกำหนดเส้นทางที่หลากหลายโรงงานยืนยันการกำหนดเส้นทางและโรงงานกรอง
พึ่งพา
การพึ่งพาที่จำเป็นต้องแนะนำ:
<การพึ่งพา> <roupID> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Actuator </artifactid> </serdency> // การพึ่งพา WebFlux มีความจำเป็นที่จะต้องแนะนำ <การพึ่งพา> <ArtIfactId> Spring-Boot-Starter-Webflux </artifactId> </การพึ่งพาอาศัย> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <roupId> org.springframework.cloud </groupid> <ratifactid> Spring-Cloud-Starter-Concover-discovery </artifactid> <sersion> 2.0.0.m6 </sersion> <sadjectusions> <sclusision> </sclipusion> </การยกเว้น> </serdency> // การพึ่งพา Kotlin <การพึ่งพา> <roupId> org.jetbrains.kotlin </groupId> <ratifactid> kotlin-stdlib </artifactid> <persion> $ {kotlin.ersion} <roupId> org.jetbrains.kotlin </groupid> <ratifactid> kotlin-reflect </artifactid> <cersion> $ {kotlin.version} </version> <plorial> true </onfectional> </addency>ดังที่ได้กล่าวมาแล้วการพึ่งพาที่เกี่ยวข้องกับ Kotlin ได้รับการแนะนำและการกำหนดค่าการกำหนดเส้นทางของ Kotlin จะต้องได้รับการสนับสนุนที่นี่ การใช้สปริงคลาวด์เกตเวย์ต้องไม่รวมการกำหนดค่าที่เกี่ยวข้องกับเว็บ แนะนำการอ้างอิงถึง WebFlux มันจะถูกตรวจสอบเมื่อแอปพลิเคชันเริ่มต้นและต้องแนะนำ
โรงงานการยืนยันเส้นทาง
มีโรงงานการยืนยันการกำหนดเส้นทางหลายประเภทขึ้นอยู่กับเวลาคำขอโฮสต์เส้นทางวิธีการ ฯลฯ คำจำกัดความต่อไปนี้คือการจับคู่เส้นทางการยืนยันเส้นทางตามเส้นทาง
@BeanPublic RouterFunction <ServerResponse> TestFunRouterFunction () {RouterFunction <ServerResponse> เส้นทาง = RouterFunctions.route (requestPredicates.Path ("/testFun"), คำขอ -> serverResponse.ok () เส้นทางกลับ;}เมื่อเส้นทางที่ร้องขอคือ /TestFun รหัสสถานะของ OK จะถูกส่งคืนโดยตรงและตัวตอบกลับเป็นสตริงสวัสดี
โรงงานกรอง
เกตเวย์มักจะต้องกรองคำขอการกำหนดเส้นทางและดำเนินการบางอย่างเช่นการสร้างส่วนหัวหลังจากการตรวจสอบ มีการกรองหลายประเภทเช่นการเพิ่มส่วนหัวคำขอเพิ่มพารามิเตอร์คำขอเพิ่มส่วนหัวตอบกลับและเบรกเกอร์ ฯลฯ
@BeanPublic Routelocator CustomRoutElocator (RoutelocatorBuilder Builder, ThrottleGateWayFilterFactory Throttle) {//@Formatter: Off Return Builder.routes () .Route (r -> r.path ("/image/webp"). .uri ("http://httpbin.org:80")) .build (); //@formatter: on}ดังกล่าวข้างต้นเมื่อเส้นทางคำขอคือ/image/webp คำขอจะถูกส่งต่อไปยัง http://httpbin.org:80 และการตอบกลับจะถูกกรองเพิ่มส่วนหัวการตอบกลับ X-Anotherheader: Baz
การกำหนดเส้นทางที่กำหนดเอง
ส่วนย่อยสองส่วนข้างต้นเป็นของการกำหนดเส้นทาง API ที่กำหนดเองและยังสามารถกำหนดได้ผ่านการกำหนดค่า:
ฤดูใบไม้ผลิ: คลาวด์: เกตเวย์: locator: เปิดใช้งาน: จริงค่าเริ่มต้นตัวกรอง:-addResponseHeader = x-response-default-foo, เส้นทางแถบเริ่มต้น: # - - - -
การกำหนดค่าข้างต้นกำหนดเส้นทางและตัวกรอง ตัวกรองทั่วโลกเพิ่มการตอบสนองทั้งหมดไปยังส่วนหัว X-Response-Default-Foo: เริ่มต้นบาร์ เส้นทางที่มี ID default_path_to_http ถูกกำหนด แต่ลำดับความสำคัญค่อนข้างต่ำ เมื่อคำขอไม่สามารถจับคู่ได้จะถูกส่งต่อไปยัง Blueskykong.com
การกำหนดเส้นทางที่กำหนดเอง Kotlin
Spring Cloud Gateway สามารถใช้ Kotlin เพื่อปรับแต่งเส้นทาง:
@ConfigurationClass เพิ่มเติม Routes {@Bean Fun MotionRoutElocator (Builder: RoutelocatorBuilder): routelocator = builder.routes {เส้นทาง (id = "test-kotlin") {path ("/png") ตัวกรอง {addresponseheader ("x-testheader" uri ("http://httpbin.org:80")}}}}เมื่อเส้นทางที่ร้องขอคือ/image/png มันจะถูกส่งต่อไปยัง http://httpbin.org:80 และตั้งค่าตัวกรองและส่วนหัว X-testheader: Foobar จะถูกเพิ่มลงในส่วนหัวการตอบสนอง
ส่วนประกอบการค้นพบบริการ
เมื่อรวมกับการลงทะเบียนบริการในองค์ประกอบการค้นพบที่ส่งต่อไปยังอินสแตนซ์บริการเฉพาะผ่าน ServiceID การพึ่งพาที่สอดคล้องกันได้รับการแนะนำในการกำหนดค่าก่อนหน้านี้
@BeanPublic RoutedEfinitionLocator DiscoveryClientRouteDefinitionLocator (DiscoveryClient DiscoveryClient) {ส่งคืน DiscoveryClientRouteDefinitionLocator ใหม่ (DiscoveryClient);} Inject DiscoveryClient ลงในตัวสร้างของ DiscoveryClientRouteDefinitionLocator การวิเคราะห์ซอร์สโค้ดจะได้รับการอธิบายในภายหลังและจะไม่ขยายที่นี่
ฤดูใบไม้ผลิ: คลาวด์: เกตเวย์: locator: เปิดใช้งาน: จริงค่าเริ่มต้นตัวกรอง:-addResponseHeader = x-response-default-foo, เส้นทางแถบเริ่มต้น: # =================================================================================== - ID: Service_So_USER URI: LB: LB: LB:/ - stripprefix = 1
การกำหนดค่าข้างต้นช่วยให้การใช้งานของตัวระบุตำแหน่ง DiscoveryClient เส้นทางกำหนดว่าคำขอทั้งหมดที่เริ่มต้นด้วย /ผู้ใช้จะถูกส่งต่อไปยังบริการผู้ใช้และตัวกรองพา ธ จะถูกนำไปใช้เพื่อสกัดกั้นส่วนแรกของคำนำหน้าพา ธ นั่นคือคำขอที่แท้จริงในการเข้าถึง/ผู้ใช้/การทดสอบจะถูกแปลงเป็น LB: // ผู้ใช้/การทดสอบ
websocket
คุณยังสามารถกำหนดค่าการกำหนดเส้นทางเกตเวย์ของ WebSocket:
ฤดูใบไม้ผลิ: คลาวด์: เกตเวย์: ตัวกรองเริ่มต้น:-addResponseHeader = X-Response-default-foo, เส้นทางการเริ่มต้น:-ID: WebSocket_Test URI: WS: // LocalHost: 9000 คำสั่งซื้อ: 9000 Predicates:-path =/echo
เริ่มต้นเซิร์ฟเวอร์ WS WSCAT --Listen 9000 เริ่มต้นเกตเวย์ (พอร์ตเกตเวย์คือ 9090) และเชื่อมต่อไคลเอนต์กับ WSCAT -การเชื่อมต่อ WS: // localHost: 9090/echo
การเข้าถึงลูกค้า
ผู้อ่านสามารถดาวน์โหลดซอร์สโค้ดเพื่อลองฟังก์ชั่นด้านบน ที่นี่ฉันแสดงผลการเข้าถึงบริการผู้ใช้เท่านั้น:
เกตเวย์สามารถโหลดความสมดุลให้กับผู้ใช้เซิร์ฟเวอร์ได้สำเร็จและส่งคืนโอเค ส่วนหัวการตอบกลับมีส่วนหัวการตั้งค่าตัวกรองทั่วโลก X-Response-default-Foo: Bar Default
สรุป
ในบทความนี้เราสำรวจคุณสมบัติและส่วนประกอบบางอย่างที่เป็นของ Spring Cloud Gateway API ใหม่นี้มีเครื่องมือนอกกรอบสำหรับเกตเวย์และการสนับสนุนพร็อกซี รอคอยเวอร์ชันทางการของ Spring Cloud Gateway 2.0
ที่อยู่ซอร์สโค้ด
https://github.com/keets2012/spring-loud_samples
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น