ผ่านการแบ่งปันก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับสิ่งอำนวยความสะดวกหลักหลายประการของสถาปัตยกรรม Microservice ผ่านส่วนประกอบเหล่านี้เราสามารถสร้างระบบสถาปัตยกรรม Microservice อย่างง่าย ตัวอย่างเช่นสร้างศูนย์ลงทะเบียนบริการที่มีอยู่อย่างสูงผ่าน Spring Cloud Eureka และตระหนักถึงการลงทะเบียนและการค้นพบบริการ
โหลดบาลานซ์ด้วยริบบิ้นคลาวด์สปริงหรือแสร้งทำเป็น; บริการป้องกันความผิดพลาดด้วยสปริงคลาวด์ hystrix เพื่อหลีกเลี่ยงการแพร่กระจายความล้มเหลว หลังจากสร้าง Microservice แล้วเราจะจัดหาอินเทอร์เฟซบริการ API แบบครบวงจรอย่างแน่นอนให้กับระบบภายนอกสำหรับการโทร
แต่เมื่อระบบภายนอกเรียก API ที่อยู่อาศัยของเราคุณจะกำหนดบริการใดที่จำเป็นต้องให้ฟังก์ชั่นเฉพาะที่ต้องการ สิ่งนี้เกี่ยวข้องกับการบำรุงรักษากฎการกำหนดเส้นทางและรายการอินสแตนซ์บริการ
สิ่งนี้แนะนำตัวเอกของเราในวันนี้ - Spring Cloud Zuul ซึ่งเป็นส่วนประกอบ API Gateway ตามการใช้งาน Netflix Zuul สามารถแก้ปัญหาที่สำคัญสองประการได้:
ตกลงมาดูวิธีการใช้บริการเกตเวย์นี้
1. สร้างเกตเวย์และกำหนดค่าการกำหนดเส้นทาง
ที่นี่เรายังต้องใช้บริการสวัสดีและบริการผู้บริโภคก่อนหน้านี้ เราเคยคำนึงถึงการแสวงหาผู้บริโภคในฐานะผู้บริโภคบริการ แต่อย่าลืมว่าในระบบยูเรก้าแต่ละบริการแต่ละบริการเป็นทั้งผู้ให้บริการและผู้บริโภคบริการดังนั้นผู้ที่ถูกขอร้องจึงเป็นผู้ให้บริการและอินเทอร์เฟซเช่น http: // localhost: 9001/feign-consumer
ต่อไปเราสร้างบริการเกตเวย์ด้วยโครงสร้างรหัสดังนี้:
ขั้นตอนการใช้งานรหัส:
สร้าง Api-Gateway โครงการ Maven ใหม่
แก้ไขไฟล์ POM
<Project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http:/MANCMMMMMMMMMMMMMMMMMMMMMMMMMMBM http://maven.apache.org/xsd/maven-4.0.0.xsd "> <moderversion> 4.0.0 </modelversion> <roupid> com.sam </groupId> <ArtIfactId> API-GATEWAY </artifactId> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Parent </artifactid> <sersion> 1.5.1.release </เวอร์ชัน> </parent> <properties> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> สปริงคลาวด์-พึ่งพาอาศัยกัน </artifactid> <persion> camden.sr6 </version> <ply> Pom </pepolies> <pope> นำเข้า </cope> Spring-Boot-Starter-Actuator/Spring-Boot-Starter-Hystrix/Spring-Boot-Starter-Ribbon-> <การพึ่งพา> <GroupId> org.springframework.cloud </groupId> <ArtifactId> Spring-Cloud-Starter-Zuul
สร้างคลาสเริ่มต้นใหม่
/*** @enablezuulproxy เปิดใช้งานฟังก์ชั่นบริการเกตเวย์ API ของ zuul**/@enablezuulproxy@springcloudapplicationpublic คลาส GatewayApp {โมฆะสาธารณะคงที่ (สตริง [] args) {springapplication.run -สร้างแอปพลิเคชันใหม่
Server.port = 5555Spring.Application.Name = Api-Gateway#เพิ่มลงในการกำหนดค่ากฎการกำหนดเส้นทาง#กำหนดค่าผ่าน zuul.routes. <walles> .path และ zuul.routes. <walles> .url <route> เป็นชื่อของเส้นทางและสามารถระบุได้โดยพลการ แต่ชื่อเส้นทางของชุดของเส้นทางและ URL ควรเป็น#เช่นเดียวกับที่แสดงในตัวอย่างต่อไปนี้: ทั้งหมดที่พึงพอใจ/api-a/** การเข้าถึงกฎจะถูกกำหนดเส้นทางไปยังที่อยู่ของ // localhost: 9001#นั่นคือเมื่อเราเข้าถึง HTT อินเทอร์เฟซ Microservice จัดทำโดย http: // localhost: 9001/สวัสดี 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: // localhost: //
ทดสอบ, เริ่มต้นยูเรก้า, สวัสดี-บริการ, feign-consumer และบริการ api-gateway ที่เพิ่มขึ้นใหม่จากนั้นเยี่ยมชม http: // localhost: 5555/api-a/feign-consumer
เข้าถึงอินเทอร์เฟซบริการของ Feign-Consumer ได้สำเร็จ-Feign-Consonsumer
ขั้นตอนข้างต้นใช้การกำหนดค่าการกำหนดเส้นทางแบบดั้งเดิม การกำหนดค่านี้มีข้อเสียที่สำคัญซึ่งก็คือต้องมีการกำหนดค่าด้วยตนเองของกฎการกำหนดเส้นทางในไฟล์แอปพลิเคชัน เมื่อมีบริการจำนวนมากภาระงานบำรุงรักษาจะมีขนาดใหญ่มาก เพื่อลดค่าใช้จ่ายในการบำรุงรักษามีเส้นทางอื่น - เส้นทางที่มุ่งเน้นบริการ
2. การกำหนดเส้นทางที่มุ่งเน้นบริการ
Spring Cloud Zuul และ Eureka รวมกันเราสามารถทำให้เส้นทางเส้นทางไม่ใช่แผนที่ URL เฉพาะ แต่บริการเฉพาะและ URL บริการจะได้รับการดูแลโดยอัตโนมัติโดยกลไกการค้นพบบริการยูเรก้าโดยอัตโนมัติ เส้นทางประเภทนี้เป็นเส้นทางที่มุ่งเน้นบริการ การกำหนดค่ารหัสเฉพาะมีดังนี้:
แก้ไขไฟล์ POM และแนะนำการพึ่งพา Eureka
<!-แนะนำ Eureka Dependencies-> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Eureka </artifactid>
แก้ไขไฟล์การกำหนดค่า Application.properties
Server.port = 5555Spring.application.name = api-gatewayzuul.routes.api-a.path =/api-a/**# ที่นี่เราใช้ ServiceId แทน URL และใช้ชื่อบริการแทน IP+หมายเลขพอร์ต zuul.routes.api-a.serviceId = hello-serviceeureka.client.service-url.defaultzone = http: // localhost: 1111/Eureka
หมายเหตุ: zuul.routes.api-a.url = Hello-Service ยังสามารถใช้ฟังก์ชั่นได้ แต่ไม่สามารถทำการปรับสมดุลโหลดตามปกติและป้องกันความผิดพลาดได้
ทดสอบเยี่ยมชม http: // localhost: 5555/api-a/สวัสดี
การเข้าถึงประสบความสำเร็จ
3. กฎเริ่มต้นสำหรับการกำหนดเส้นทางบริการ
ในเส้นทางที่มุ่งเน้นบริการเนื่องจากชื่อ <route> เป็นไปได้โดยพลการเป็นไปได้:
zuul.routes.hello-service.path =/hello-service/** zuul.routes.hello-service.serviceid = hello-service
<route> ชื่อคือชื่อบริการ ในความเป็นจริงในแอปพลิเคชันจริงเรามักจะตั้งชื่อด้วยวิธีนี้ หากมีกฎดังกล่าว Zuul สามารถช่วยเราใช้ฟังก์ชั่นดังกล่าวโดยค่าเริ่มต้นให้บันทึกปัญหาของการกำหนดค่าเพิ่มเติม
ลองทำการทดลองและเปลี่ยนไฟล์การกำหนดค่าเป็น:
Server.port = 5555Spring.application.name = api-gatewayeureka.client.service-url.defaultzone = http: // localhost: 1111/ouureka
จากนั้นการยืนยันการเข้าถึงหน้าเว็บ
การเข้าถึงประสบความสำเร็จ
อย่างไรก็ตามโดยค่าเริ่มต้นบริการของยูเรก้าจะถูกกำหนดเส้นทางโดย Zuul สร้างความสัมพันธ์การแมปเริ่มต้นดังนั้นบริการที่เราไม่ต้องการเปิดให้กับโลกภายนอกก็เข้าถึงได้จากภายนอก ในเวลานี้เราสามารถกำหนดค่ากฎที่ไม่ต้องการการสร้างเส้นทางอัตโนมัติโดย Zuul.ignored-Services เมื่อ zuul.ignored-services =*บริการทั้งหมดจะไม่สร้างกฎการกำหนดเส้นทางโดยอัตโนมัติ ในเวลานี้การกำหนดค่าการกำหนดเส้นทางที่เกี่ยวข้องจะต้องดำเนินการผ่านการกำหนดค่าก่อนหน้า
==================== บรรทัดหารที่งดงาม ============================
ก่อนหน้านี้ได้รับการกล่าวก่อนหน้านี้ทั้งหมดหมุนรอบปัญหาหนึ่ง: กฎการกำหนดเส้นทางและปัญหาการบำรุงรักษาอินสแตนซ์บริการ ดังนั้นจะแก้ปัญหาที่สองได้อย่างไร (ตรวจสอบปัญหาความซ้ำซ้อน)?
4. คำขอกรอง
ในการตรวจสอบคำขอของลูกค้าในเกตเวย์ API เราสามารถใช้ตัวกรองเพื่อสกัดกั้นและคำขอตัวกรอง วิธีการใช้งานค่อนข้างง่าย คุณจะต้องสืบทอดคลาสบทคัดย่อ Zuulfilter และใช้วิธีการทั้งสี่
ปรับเปลี่ยน api-gateway:
เพิ่มคลาสตัวกรอง
/*** การสืบทอด ZuulFilter และการใช้งานอินเตอร์เฟส 4 ตัว** สำหรับการกรองคำขอ**/AccessFilter คลาสสาธารณะขยาย ZuulFilter {logger logger = loggerFactory.getLogger (AccessFilter.class); / * * ควรฟิลเทอร์กำหนดว่าจะต้องดำเนินการตัวกรอง * * ส่งคืนจริงที่นี่ซึ่งระบุว่าตัวกรองจะมีผลกับคำขอทั้งหมดหรือไม่ * ในการใช้งานจริงเราสามารถใช้ฟังก์ชั่นนี้เพื่อระบุช่วงที่มีประสิทธิภาพของตัวกรอง*/ @Override บูลีนสาธารณะควร filter () {return true; } /** ตรรกะเฉพาะของตัวกรอง** ที่นี่เราขอให้ Zuul ร้องขอผ่าน ctx.setsendzuulResponse (เท็จ) และอย่ากำหนดเส้นทาง* จากนั้นเราตั้งค่ารหัสข้อผิดพลาดที่ส่งคืนผ่าน CTX.SetResponSestatusCode (401)** / @Override httpservletRequest Request = context.getRequest (); Object AccessToken = request.getParameter ("AccessToken"); logger.info ("ส่ง {} คำขอไปที่ {}", request.getMethod (), request.getRequesturl (). toString ()); if (accessToken == null) {context.setSendzuulResponse (เท็จ); Context.SetResponSestatusCode (401); } return null; } /* FilterType ส่งคืนประเภทตัวกรอง* จะกำหนดว่าวงจรชีวิตใดที่ใช้งานตัวกรองจะถูกกำหนดไว้ซึ่งกำหนดเป็นก่อนซึ่งหมายความว่าคำขอจะถูกดำเนินการก่อนที่จะถูกกำหนดเส้นทาง * * ก่อน: ตัวกรองก่อนการดำเนินการตามคำขอ * เส้นทาง: ประมวลผลคำขอและเส้นทาง * โพสต์: ตัวกรองที่ดำเนินการหลังจากการประมวลผลคำขอเสร็จสิ้น * ข้อผิดพลาด: ตัวกรองดำเนินการเมื่อเกิดข้อผิดพลาด */ @Override สตริงสาธารณะตัวกรองสาธารณะ () {return "pre"; } / * * FilterOrder ส่งคืนคำสั่งของการดำเนินการของตัวกรอง * * เมื่อคำขอมีตัวกรองหลายตัวในขั้นตอนเดียวจำเป็นต้องดำเนินการครั้งเดียวตามค่าคืนของวิธี * * / @Override public int filterOrder () {return 0; -ปรับเปลี่ยนคลาสเริ่มต้น
/*** @enablezuulproxy เปิดใช้งานฟังก์ชั่นบริการเกตเวย์ API ของ Zuul**/ @enablezuulproxy @SpringCloudapplicationPublic Class GatewayApp {// ถั่วถูกเพิ่มเข้าไปในการใช้งาน @Bean สาธารณะ } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (gatewayapp.class, args); -ทดสอบ
) เยี่ยมชม http: // localhost: 5555/hello-service/hello, การเข้าถึงล้มเหลว
) เยี่ยมชม http: // localhost: 5555/hello-service/hello? accesstoken = โทเค็น, เข้าถึงได้ตามปกติ
โครงสร้างรหัสที่แก้ไขแล้ว:
5. ขยายและขยาย
ในความเป็นจริงเมื่อฟังก์ชั่นการกำหนดเส้นทางทำงานจริงการแมปการกำหนดเส้นทางและการส่งต่อการร้องขอจะทำโดยตัวกรองที่แตกต่างกันหลายตัว
การทำแผนที่การกำหนดเส้นทางส่วนใหญ่จะเสร็จสมบูรณ์ผ่านตัวกรองก่อนประเภทซึ่งตรงกับเส้นทางคำขอกับกฎการกำหนดเส้นทางที่กำหนดค่าและค้นหาที่อยู่เป้าหมายที่ต้องส่งต่อ
ส่วนการส่งต่อคำขอเสร็จสมบูรณ์โดยตัวกรองเส้นทางซึ่งส่งต่อที่อยู่เส้นทางที่ได้รับจากตัวกรองประเภทก่อน
ดังนั้นตัวกรองสามารถกล่าวได้ว่าเป็นองค์ประกอบหลักที่สุดของฟังก์ชั่น API Gateway ของ Zuul คำขอ HTTP แต่ละครั้งที่เข้าสู่ Zuul จะได้รับการตอบกลับผ่านชุดของห่วงโซ่การประมวลผลตัวกรองและส่งกลับไปยังลูกค้า
สรุป
ข้างต้นเป็นปัญหาของการใช้ Zuul เพื่อใช้บริการ API Gateway ใน Spring Cloud ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!