การแนะนำ
เรายังคงสร้างรหัสจากบล็อกก่อนหน้าและเพิ่มส่วนประกอบริบบิ้นเพื่อให้การปรับสมดุลโหลดไคลเอนต์ โหลดบาลานซ์เป็นส่วนสำคัญในการบรรลุการพร้อมกันสูงประสิทธิภาพสูงบริการที่ปรับขนาดได้ สามารถแจกจ่ายคำขอไปยังเซิร์ฟเวอร์ที่แตกต่างกันในคลัสเตอร์เพื่อบรรเทาภาระในแต่ละเซิร์ฟเวอร์ การโหลดบาลานซ์ของไคลเอนต์จะทำงานในโปรแกรมไคลเอนต์เช่นโครงการเว็บของเราจากนั้นสุ่มเลือกเซิร์ฟเวอร์เพื่อส่งคำขอโดยได้รับรายการที่อยู่ IP ของคลัสเตอร์ เมื่อเทียบกับการปรับสมดุลโหลดเซิร์ฟเวอร์ไม่จำเป็นต้องใช้ทรัพยากรเซิร์ฟเวอร์
สภาพแวดล้อมพื้นฐาน
Git: ซอร์สโค้ดโครงการ
อัปเดตการกำหนดค่า
เวลานี้เราต้องเริ่มโปรแกรมบริการผลิตภัณฑ์สองโปรแกรมในพื้นที่เพื่อตรวจสอบการปรับสมดุลโหลดดังนั้นเราจึงต้องจัดเตรียมพอร์ตที่แตกต่างกันสำหรับโปรแกรมที่สอง การกำหนดค่าของศูนย์บริการการกำหนดค่าสปริงคลาวด์จะแทนที่ตัวแปรสภาพแวดล้อมระบบท้องถิ่นตามค่าเริ่มต้น เราจำเป็นต้องตั้งค่าพอร์ตของบริการผลิตภัณฑ์ผ่านตัวแปรสภาพแวดล้อมระบบดังนั้นเราจึงจำเป็นต้องแก้ไขไฟล์การกำหนดค่าของบริการผลิตภัณฑ์ในที่เก็บศูนย์การกำหนดค่า GIT
เซิร์ฟเวอร์: พอร์ต: 8081Spring: คลาวด์: config: อนุญาต-override: True Override System-System-Properties: FALSE
ค่าเริ่มต้นของการอนุญาตให้ยกเลิกเป็นจริง ฉันเขียนมันออกมาเพื่ออธิบาย หมายความว่ารายการการกำหนดค่าของศูนย์การกำหนดค่าระยะไกลได้รับอนุญาตให้เขียนทับการกำหนดค่าท้องถิ่นไม่ใช่ว่าการกำหนดค่าท้องถิ่นได้รับอนุญาตให้เขียนทับการกำหนดค่าระยะไกล แน่นอนว่าเราสามารถตั้งค่าเป็นเท็จ แต่เพื่อให้กฎความครอบคลุมที่แม่นยำยิ่งขึ้นค่าเริ่มต้นจะถูกเก็บรักษาไว้ที่นี่
เราได้เพิ่มการแทนที่ระบบระบบ = FALSE นั่นคือแม้ว่าไฟล์การกำหนดค่าของศูนย์การกำหนดค่าระยะไกลสามารถเขียนทับการกำหนดค่าในท้องถิ่นได้ไม่ได้เขียนทับตัวแปรระบบท้องถิ่น หลังจากการแก้ไขเสร็จสมบูรณ์แล้วให้ส่งไปยังที่เก็บ GIT
นอกจากนี้เพิ่มบันทึกบางอย่างลงใน ProductionController ของโครงการ Productservice เพื่อตรวจสอบว่าโหลดบาลานซ์มีผลบังคับใช้หรือไม่:
แพ็คเกจ cn.zxuqian.controllers; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; นำเข้า org.springframework.web.bind.annotation.requestmapping; {logger logger แบบคงที่ส่วนตัว = loggerFactory.getLogger (ProductController.class); @RequestMapping (" /ผลิตภัณฑ์") Public String ProductList () {log.info ("เข้าถึง /จุดสิ้นสุดผลิตภัณฑ์"); กลับ "เสื้อแจ็คเก็ตเสื้อยืดเสื้อยืด"; -กำหนดค่าริบบิ้นสำหรับเว็บ
ก่อนเพิ่มการพึ่งพาของริบบิ้นใน pom.xml:
<การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-Netflix-Ribbon </artifactid>
จากนั้นแก้ไขคลาสแอปพลิเคชันและเพิ่มรหัสต่อไปนี้:
@enableCircuitBreaker@enablediscoveryclient@ribbonclient (name = "product-service")@springbootapplicationpublic คลาสแอปพลิเคชัน {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args); } @Bean @LoadBALANCH Public RestTemplate Rest (RestTemplateBuilder Builder) {return builder.build (); - ที่นี่เราใช้คำอธิบายประกอบ @ribbonclient (name = "บริการผลิตภัณฑ์")) เพื่อทำเครื่องหมายโครงการนี้เป็นไคลเอนต์การปรับสมดุลของริบบิ้น จำเป็นต้องเลือกหนึ่งในกลุ่มบริการผลิตภัณฑ์เพื่อเข้าถึงบริการที่จำเป็น แอตทริบิวต์ชื่อที่นี่สอดคล้องกับแอตทริบิวต์ Spring.Application.Name ที่กำหนดค่าไว้ในโครงการ Productservice
คำอธิบายประกอบ @loadbalanced ระบุว่า RestTemplate จะถูกกำหนดค่าให้ใช้ LoadBalancerClient ของ Ribbon โดยอัตโนมัติเพื่อเลือก URI ของบริการและส่งคำขอ
เราเพิ่มรหัสต่อไปนี้ในคลาส Productservice:
@ServicePublic Class Productservice {Private Final RestTemplate RestTemplate; @autowired DiscoveryClient DiscoveryClient; Public Productservice (RestTemplate RestTemplate) {this.restTemplate = restTemplate; } @HyStrixCommand (fallbackMethod = "backupproductList") Public String ProductList () {list <ServiceInstance> อินสแตนซ์ = this.discoveryClient.getInstances ("บริการผลิตภัณฑ์"); if (อินสแตนซ์! = null && instances.size ()> 0) {return this.resttemplate.getForObject (instances.get (0) .geturi () + "/products", string.class); } กลับ ""; } สตริงสาธารณะ backupproductList () {return "jack, sweater"; } Public String ProductListLoadBalannad () {return this.resttemplate.getForObject ("http: // ผลิตภัณฑ์/ผลิตภัณฑ์/ผลิตภัณฑ์", string.class); -มีการเพิ่มวิธีการ productlistloadbalanced ใหม่ที่นี่ซึ่งสามารถเข้าถึงบริการเดียวกันกับวิธีการจัดผลิตภัณฑ์ก่อนหน้านี้ แต่มันเป็นโหลดที่สมดุลกับไคลเอนต์ริบบิ้น ที่นี่โฮสต์ของ URI ได้กลายเป็นชื่อของบริการที่จะเข้าถึงซึ่งสอดคล้องกับแอตทริบิวต์ชื่อที่กำหนดค่าใน @ribbonclient สุดท้ายเพิ่มรหัสต่อไปนี้ใน ProductController ของเรา:
@RestControllerPublic คลาส ProductController {@AutoWired Productservice Productservice Productservice; @RequestMapping ("/ผลิตภัณฑ์") Public String ProductList () {return productservice.productlist (); } @RequestMapping ("/productslb") สตริงสาธารณะ productListloadBalanced () {return productservice.productlistlistloadbalanced (); -เพื่อสร้างวิธีการที่จัดการ /ผลิตภัณฑ์โดยเฉพาะและโทรหา Productservie เพื่อให้การปรับสมดุลโหลด
ณ จุดนี้รหัสของเราเสร็จสมบูรณ์ รหัสดูเหมือนง่าย แต่อันที่จริงการกำหนดค่าทั้งหมดใช้ค่าเริ่มต้น ริบบิ้นให้วิธีการเขียนโปรแกรมและการกำหนดค่าเพื่อกำหนดค่าไคลเอนต์ริบบิ้น ให้ฉันแนะนำสั้น ๆ เมื่อคุณเข้าไปลึกลงไปในริบบิ้นลองมาดูวิธีแก้ไขการกำหนดค่า ริบบิ้นให้การกำหนดค่าต่อไปนี้ (อินเทอร์เฟซอยู่ทางด้านซ้ายและการใช้งานเริ่มต้นอยู่ทางด้านขวา):
เนื่องจากโครงการของเราใช้ยูเรก้ารายการการกำหนดค่าบางรายการจึงแตกต่างจากการใช้งานเริ่มต้น ตัวอย่างเช่นยูเรก้าใช้ DiscoveryEnabledNiWSServerList แทน RibbonserverList เพื่อรับรายการบริการที่ลงทะเบียนบนยูเรก้า มีคลาสการกำหนดค่าอย่างง่ายด้านล่างจากเว็บไซต์ทางการของ Spring:
คลาสสาธารณะ sayhelloconfiguration {@autowired iclientconfig ribbonclientconfig; @Bean IPING RIBBONPING (ICLIENTCONFIG config) {ส่งคืนใหม่ pingurl (); } @Bean Irule Ribbonrule (IClientConfig config) {ส่งคืนความพร้อมใช้งานใหม่ FilteringRule (); -Ribbon จะไม่ส่ง Ping เพื่อตรวจสอบสถานะสุขภาพของเซิร์ฟเวอร์โดยค่าเริ่มต้นและค่าเริ่มต้นเป็นเรื่องปกติ จากนั้น Irune จะถูกนำไปใช้เป็น zoneavoidancerule โดยค่าเริ่มต้นเพื่อหลีกเลี่ยงโซนที่มีปัญหามากมายกับ AWS EC2 สิ่งนี้ไม่สามารถใช้ได้ในสภาพแวดล้อมการทดสอบในท้องถิ่น จากนั้นจะถูกแทนที่ด้วย AvailabilityFilteringRule สิ่งนี้สามารถเปิดใช้งานฟังก์ชั่นเบรกเกอร์วงจรที่มาพร้อมกับริบบิ้นเพื่อกรองเซิร์ฟเวอร์ที่ทำงานไม่ถูกต้อง
ทดสอบ
ก่อนอื่นให้เริ่มบริการศูนย์การกำหนดค่า Configserver ของเราจากนั้นเริ่มการลงทะเบียน Eureka ลงทะเบียนและบริการ Discovery จากนั้นเริ่มต้นผลิตภัณฑ์สองรายการ อันแรกคือการใช้ Spring-Boot: Run Plug-in เพื่อเริ่มต้นและอันที่สองคือการจัดหาพอร์ตใหม่ซึ่งสามารถเริ่มต้นด้วยคำสั่งต่อไปนี้:
$ server_port = 8082 MVN Spring-Boot: Run
สุดท้ายเริ่มโครงการเว็บไคลเอนต์ของเราเยี่ยมชม http: // localhost: 8080/productslb จากนั้นรีเฟรชสองสามครั้ง คุณจะเห็นว่า windows บรรทัดคำสั่งสองรายการที่ใช้งาน Productservice จะปรากฏขึ้นแบบสุ่ม:
เข้าถึง /จุดสิ้นสุดผลิตภัณฑ์
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น