การแนะนำ
Zuul เป็นเราเตอร์ที่ใช้ Netflix JVM และโหลดบาลานซ์ฝั่งเซิร์ฟเวอร์ สถานการณ์ที่ใช้กันมากที่สุดคือการแทนที่ Microservice แบ็กเอนด์ Nginx Reverse Backend สำหรับการเข้าถึง UI ส่วนหน้า
Zuul ใช้ริบบิ้นเพื่อค้นหาอินสแตนซ์ที่ส่งต่อโดยการค้นพบและคำขอทั้งหมดจะถูกดำเนินการด้วยคำสั่ง Hystrix ดังนั้นความล้มเหลวจะปรากฏในตัวชี้วัด Hystrix
หมายเหตุ: Zuul ไม่รวมถึงไคลเอนต์การค้นพบดังนั้นสำหรับเส้นทางที่ใช้บริการรหัสบริการหนึ่งในเส้นทางจะต้องมีให้ใน ClassPath
Zuul เป็นเกตเวย์ API และส่วนประกอบการกรองที่จัดทำโดย Spring Cloud มันมีฟังก์ชั่นต่อไปนี้:
ในบทช่วยสอนนี้เราจะใช้ Zuul เพื่อส่งต่อการร้องขอเว็บ/ผลิตภัณฑ์ไปยังบริการผลิตภัณฑ์ที่เกี่ยวข้องและกำหนดตัวกรองล่วงหน้าเพื่อตรวจสอบว่า Zuul ได้รับการส่งต่อหรือไม่
สภาพแวดล้อมพื้นฐาน
ซอร์สโค้ดโครงการ
คลิกที่นี่
สร้างบริการ Zuul
สร้างโครงการ maven ใน Intellij:
จากนั้นเพิ่มรหัสต่อไปนี้ใน pom.xml:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/ XSI: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" <ArtIfactId> Apigateway </artifactId> <persion> 1.0-snapshot </เวอร์ชัน> <carent> <roupId> org.springframework.boot </groupId> <RoupID> org.springframework.cloud </groupid> <!-ชื่อมีการเปลี่ยนแปลงก่อนหน้า: Spring-Cloud-Starter-Zuul-> <ArtifactId> Spring-Cloud-Starter-Netflix-Zuul </artifactid> </การพึ่งพา <ArtIfactId> Spring-Cloud-Starter-Netflix-Eureka-client </artifactid> </การพึ่งพา> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-config </artifactid> <ratifactid> Spring-Boot-Starter-Actuator </artifactId> </dercedency> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Dependencies </artifactid> <persion> Finchley.m9 </เวอร์ชั่น> <ply> pom </peple> <pope> นำเข้า </scope> </การพึ่งพา> </การพึ่งพา </properties> <uffer> <plugins> <plugin> <sloupid> org.springframework.boot </groupid> <ratifactid> Spring-Boot-Maven-Plugin </artifactid> <url> https://repo.spring.io/libs-milestone </url> <naplots> <enabled> false </enabled> </napshots> </repository> </repository> </repository>
ควรสังเกตว่า artifactid ของ Zuul ที่ได้รับจากการสอนเว็บไซต์อย่างเป็นทางการของ Spring คือ Spring-Cloud-Starter-Zuul ซึ่งเป็นชื่อของ Zuul รุ่นเก่า มันได้รับการเปลี่ยนชื่อเป็น Spring-Cloud-Starter-Netflix-Zuul ในเวอร์ชัน Finchley.m9 ของเรา
เพิ่มไฟล์ src/main/resources/bootstrap.yml และระบุ spring.application.name:
ฤดูใบไม้ผลิ: แอปพลิเคชัน: ชื่อ: Zuul-Server
สร้างคลาส CN.ZXUQIAN.Application:
แพ็คเกจ cn.zxuqian; นำเข้า cn.zxuqian.filters.prefilter; นำเข้า org.springframework.boot.springapplication; นำเข้า org.springframework.boot.autoconfigure.springbootapplication; org.springframework.cloud.netflix.zuul.enablezuulproxy นำเข้า org.springframework.context.annotation.bean;@enablezuulproxy@enablescoverycovery@springbootaplicplication } @Bean prefilter prefilter () {ส่งคืน prefilter ใหม่ (); -ที่นี่ @enablezuulproxy ใช้เพื่อระบุพร็อกซีย้อนกลับโดยใช้ Zuul และส่งต่อคำขอของเราไปยังเซิร์ฟเวอร์ที่เกี่ยวข้อง จากนั้นเปิดใช้งานการค้นพบบริการของยูเรก้า Zuul จะใช้ Ribbon สำหรับ Load Balancing โดยค่าเริ่มต้นดังนั้นคุณสามารถค้นพบบริการที่ลงทะเบียนผ่าน Eureka Prefilter เป็น prefilter ที่ดำเนินการบางอย่างก่อนที่คำขอคำขอจะถูกประมวลผล รหัสของมันมีดังนี้:
แพ็คเกจ cn.zxuqian.filters; นำเข้า com.netflix.zuul.zuulfilter; นำเข้า com.netflix.zuul.context.requestcontext; นำเข้า com.netflix.zuul.exception.zuulexception; นำเข้า org.slf4j.logger; javax.servlet.http.httpservletRequest; prefilter คลาสสาธารณะขยาย Zuulfilter {logger แบบคงที่ส่วนตัว = loggerFactory.getLogger (prefilter.class); @Override Public String FilterType () {return "pre"; } @Override public int filterOrder () {return 1; } @Override บูลีนสาธารณะควร filter () {return true; } @Override วัตถุสาธารณะรัน () พ่น zuulexception {requestcontext ctx = requestcontext.getCurrentContext (); httpservletRequest Request = ctx.getRequest (); log.info (string.format (" %s คำขอ %s", request.getMethod (), request.getRequesturl (). toString ())); คืนค่า null; - FilterType - มีตัวกรองในตัวสี่ประเภทใน Zuul, Pre, เส้นทาง, โพสต์และข้อผิดพลาดซึ่งเป็นตัวแทนก่อนระหว่างหลังและหลังข้อผิดพลาด
FilterOrder - ระบุลำดับที่ดำเนินการตัวกรอง
ควรกรอง - ไม่ว่าจะเปิดใช้งานตัวกรองนี้หรือไม่
Run - ตรรกะทางธุรกิจของตัวกรอง ที่นี่ฉันเพียงแค่บันทึกวิธีการร้องขอและเส้นทางการร้องขอของ reqeust
ถัดไปสร้างไฟล์ Zuul-Server.yml ในที่เก็บ Git ในศูนย์การกำหนดค่าของเราและเพิ่มการกำหนดค่าต่อไปนี้:
เซิร์ฟเวอร์: พอร์ต: 8083zuul: เส้นทาง: ผลิตภัณฑ์: เส้นทาง: /ผลิตภัณฑ์ /** serviceId: บริการผลิตภัณฑ์
ที่นี่พอร์ตของ Zuul ได้รับการกำหนดค่าให้เป็น 8083 จากนั้นทั้งหมด / ผลิตภัณฑ์ / คำขอจะถูกแมปกับบริการบริการผลิตภัณฑ์ของเรา หาก ServiceID ไม่ได้รับการกำหนดค่าคีย์ผลิตภัณฑ์จะเป็น ServiceID โดยค่าเริ่มต้น ในตัวอย่างของเรา ServiceId รวมถึง -ดังนั้น ServiceId จะระบุไว้ด้านล่าง ส่งไปยัง GIT หลังจากการกำหนดค่าเสร็จสมบูรณ์
อัปเดต Productservice
URI of Productservice มีการเปลี่ยนแปลงเล็กน้อยเพื่อให้สอดคล้องกับสไตล์การพักผ่อนมากขึ้น:
@RequestMapping (" /list") Public String ProductList () {log.info ("เข้าถึง /จุดสิ้นสุดผลิตภัณฑ์"); กลับ "เสื้อ, แจ็คเก็ต, เสื้อกันหนาว, เสื้อยืด";}ที่นี่การจับคู่พา ธ @requestmapping ถูกเปลี่ยนเป็น /รายการซึ่งก่อนหน้านี้ /ผลิตภัณฑ์
อัปเดตเว็บไคลเอนต์
เพิ่มวิธีการใหม่ให้กับ Productservice ในเว็บไคลเอนต์ของเรา:
Public String ProductListzuul () {return this.resttemplate.getForObject ("http: // zuul-server/product/list", string.class);}เวลานี้เราขอบริการ Zuul-Server โดยตรงจากนั้นจะส่งคำขอของเราไปยังบริการบริการผลิตภัณฑ์ สุดท้ายเพิ่มวิธีการจัดการคำขอใน ProductController:
@RequestMapping ("/ผลิตภัณฑ์/รายการ") Public String ProductListzuul () {return productservice.productlistzuul ();}ใช้ในการประมวลผล /คำขอผลิตภัณฑ์ /รายการจากนั้นเรียกใช้วิธีการในชั้นเรียนผลิตภัณฑ์
ทดสอบ
ใช้ MVN SPRING-BOOT: RUN เพื่อเริ่มต้นการกำหนดค่า, รีจิสทรี, Zuulserver, Productservice และโครงการเว็บจากนั้นเริ่มต้นผลิตภัณฑ์ที่สองและใช้ Server_port = 8082 Spring-Boot: Run
เยี่ยมชม http: // localhost: 8080/ผลิตภัณฑ์/รายการหลายครั้งและนอกเหนือจากการดูผลลัพธ์ที่ส่งคืนในเบราว์เซอร์แล้วเราจะเห็นคำต่อไปนี้ในหน้าต่างบรรทัดคำสั่งของ Zuulserver:
รับวิธีการขอวิธีการ http: // xuqians-imac: 8083/ผลิตภัณฑ์/รายการ
จากนั้นใน windows บรรทัดคำสั่งของสองผลิตภัณฑ์ผลิตภัณฑ์เราจะเห็นการปรากฏตัวแบบสุ่ม
เข้าถึง /จุดสิ้นสุดผลิตภัณฑ์
ซึ่งหมายความว่า Zuulserver จะโหลดสมดุลโดยอัตโนมัติ
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com