1: ริบบิ้นคืออะไร?
Ribbon เป็นโครงการโอเพ่นซอร์สที่ออกโดย Netflix ฟังก์ชั่นหลักของมันคือการจัดหาอัลกอริทึมการโหลดบาลานซ์ซอฟต์แวร์ฝั่งไคลเอ็นต์เพื่อเชื่อมต่อบริการระดับกลางของ Netflix เข้าด้วยกัน ส่วนประกอบไคลเอนต์ริบบิ้นมีชุดของรายการการกำหนดค่าที่สมบูรณ์เช่นการหมดเวลาการเชื่อมต่อการลองใหม่ ฯลฯ เพียงแค่ใส่มันคือการแสดงรายการเครื่องทั้งหมดที่อยู่ด้านหลังโหลดบาลานซ์ (LB สั้น ๆ ) ในไฟล์การกำหนดค่า Ribbon จะช่วยให้คุณเชื่อมต่อเครื่องเหล่านี้โดยอัตโนมัติตามกฎบางอย่าง (เช่นการสำรวจอย่างง่ายการเชื่อมต่อทันที ฯลฯ ) นอกจากนี้เรายังมีวิธีที่ง่ายมากในการใช้อัลกอริทึมการปรับสมดุลการโหลดแบบกำหนดเองโดยใช้ริบบิ้น
สอง: การจำแนกประเภทโครงการ LB
ปัจจุบันโครงการ LB กระแสหลักสามารถแบ่งออกเป็นสองประเภท: หนึ่งคือ LB ส่วนกลางนั่นคือใช้สิ่งอำนวยความสะดวก LB อิสระ (สามารถเป็นฮาร์ดแวร์เช่น F5 หรือซอฟต์แวร์เช่น Nginx) ระหว่างผู้บริโภคบริการและผู้ให้บริการ อีกอันคือ LB ในกระบวนการซึ่งรวมตรรกะ LB เข้ากับผู้บริโภคและผู้บริโภครู้จากศูนย์ลงทะเบียนบริการที่มีที่อยู่แล้วเลือกเซิร์ฟเวอร์ที่เหมาะสมจากที่อยู่เหล่านี้เอง ริบบิ้นเป็นของหลัง มันเป็นเพียงไลบรารีคลาสที่รวมเข้ากับกระบวนการของผู้บริโภค ผู้บริโภคจะได้รับที่อยู่ของผู้ให้บริการ
สาม: ส่วนประกอบหลักของ Ribbon และเวิร์กโฟลว์
ส่วนประกอบหลักของ Ribbon (ทั้งหมดเป็นประเภทอินเทอร์เฟซ) มีสิ่งต่อไปนี้:
รายการเซิร์ฟเวอร์
ใช้เพื่อรับรายการที่อยู่ มันอาจเป็นแบบคงที่ (ให้ชุดที่อยู่คงที่) หรือไดนามิก (แบบสอบถามที่เกิดขึ้นซ้ำสำหรับรายการที่อยู่จากรีจิสทรี)
ServerListFilter
ใช้เมื่อใช้ ServerList แบบไดนามิกเท่านั้นจะใช้เพื่อใช้นโยบายบางอย่างในรายการบริการดั้งเดิมเพื่อพิจารณาที่อยู่บางอย่าง
แฝงตัว
เลือกที่อยู่บริการขั้นสุดท้ายเป็นผลลัพธ์ LB เลือกนโยบายรวมถึงการสำรวจน้ำหนักตามเวลาตอบสนองเบรกเกอร์ (เมื่อมี Hystrix) ฯลฯ
เมื่อริบบิ้นทำงานเป็นที่ต้องการใช้ ServerList เพื่อรับรายการบริการที่มีอยู่ทั้งหมดจากนั้นใช้ ServerListFilter เพื่อพิจารณาที่อยู่บางอย่างและในที่สุดก็เลือกเซิร์ฟเวอร์ในที่อยู่ที่เหลือผ่าน IRULE เป็นผลลัพธ์สุดท้าย
สี่: บทนำสู่กลยุทธ์การปรับสมดุลโหลดหลักที่จัดทำโดย Ribbon
1: การปรับสมดุลโหลดแบบสำรวจอย่างง่าย (Roundrobin)
คำขอจะถูกกำหนดเวลาในลักษณะที่สำรวจนั่นคือแต่ละตารางจะถูกดำเนินการ i = (i + 1) mod n และเซิร์ฟเวอร์ I-Th ถูกเลือก
2: การปรับสมดุลโหลดแบบสุ่ม (สุ่ม)
สุ่มเลือกเซิร์ฟเวอร์ด้วยสถานะ UP
3: การปรับสมดุลการโหลดถ่วงน้ำหนัก (ถ่วงน้ำหนักในเวลานั้น)
น้ำหนักจะถูกจัดสรรตามเวลาที่สอดคล้องกัน ยิ่งเวลาที่สอดคล้องกันมากขึ้นเท่าไหร่น้ำหนักก็จะน้อยลงและความเป็นไปได้ที่จะได้รับการคัดเลือกก็จะลดลง
4: Zoneavoidancerule
กำหนดประสิทธิภาพของพื้นที่เซิร์ฟเวอร์และเซิร์ฟเวอร์การเลือกความพร้อมใช้งานเซิร์ฟเวอร์อย่างครอบคลุม
การเปรียบเทียบกลยุทธ์การปรับสมดุลโหลดของ Ribbon
| ชื่อกลยุทธ์ | คำแถลงนโยบาย | คำอธิบายนโยบาย | คำแนะนำในการใช้งาน |
| BestavailableRule | ชั้นเรียนสาธารณะ BestavailableRule ขยาย ClientConfigenabledRoundRobinRule | เลือกเซิร์ฟเวอร์ที่มีคำขอพร้อมกันที่เล็กที่สุด | ตรวจสอบเซิร์ฟเวอร์ทีละตัว หากเซิร์ฟเวอร์สะดุดให้ละเว้น เลือกเซิร์ฟเวอร์ด้วย activeRequestScount ที่เล็กที่สุด |
| AvailabilityFilteringRule | ความพร้อมใช้งานระดับสาธารณะ FilteringRule ขยาย PredicateBasedRule | กรองเซิร์ฟเวอร์แบ็กเอนด์เหล่านั้นที่ทำเครื่องหมายว่าเป็นวงจรที่สะดุดเนื่องจากความล้มเหลวในการเชื่อมต่อและกรองเซิร์ฟเวอร์แบ็กเอนด์เหล่านั้นที่มีการเกิดพร้อมกันสูง (การเชื่อมต่อที่ใช้งานอยู่เกินขีด จำกัด ที่กำหนดไว้) | การใช้ AvailabilityPredicate เพื่อรวมตรรกะของเซิร์ฟเวอร์การกรองจริง ๆ แล้วจะตรวจสอบสถานะการทำงานของเซิร์ฟเวอร์แต่ละตัวที่บันทึกไว้ในสถานะ |
| ถ่วงน้ำหนัก | ระดับสาธารณะระดับถ่วงน้ำหนัก | น้ำหนักจะถูกจัดสรรตามเวลาที่สอดคล้องกัน ยิ่งเวลาที่สอดคล้องกันมากขึ้นเท่าไหร่น้ำหนักก็จะน้อยลงและความเป็นไปได้ที่จะได้รับการคัดเลือกก็จะลดลง | เธรดพื้นหลังจะอ่านเวลาตอบสนองการประเมินจากสถานะเป็นประจำและคำนวณน้ำหนักสำหรับแต่ละเซิร์ฟเวอร์ การคำนวณของน้ำหนักก็ค่อนข้างง่าย Responsetime ลบเวลาตอบสนองเฉลี่ยของแต่ละเซิร์ฟเวอร์คือน้ำหนักของเซิร์ฟเวอร์ เมื่อสถานะเริ่มต้นขึ้นและไม่มีการสร้างสถิติให้ใช้นโยบาย Roubine เพื่อเลือกเซิร์ฟเวอร์ |
| ลองอีกครั้ง | Public Class RetryRule ขยายบทคัดย่อ LoadBalancerrule | ลองใช้กลไกบนเครื่องสำหรับนโยบายการปรับสมดุลโหลดที่เลือก | ในช่วงระยะเวลาการกำหนดค่าเมื่อการเลือกเซิร์ฟเวอร์ไม่ประสบความสำเร็จคุณพยายามเลือกเซิร์ฟเวอร์ที่มีอยู่โดยใช้ subrule |
| รอบ | RoundrobinRule ชั้นเรียนสาธารณะขยายบทคัดย่อ | วิธีการเลือกตั้งแบบ Roundrobin เพื่อเลือกเซิร์ฟเวอร์ | ดัชนีการสำรวจความคิดเห็นและเลือกเซิร์ฟเวอร์ที่สอดคล้องกับดัชนี |
| การสุ่ม | Public Class RandomRule ขยายบทคัดย่อ loadbalancerrule | สุ่มเลือกเซิร์ฟเวอร์ | แบบสุ่มบนดัชนีเลือกเซิร์ฟเวอร์ที่สอดคล้องกับตำแหน่งดัชนี |
| zoneavoidancerule | ระดับสาธารณะ zoneavoidancerule ขยาย predicatebasedrule | กำหนดประสิทธิภาพของพื้นที่เซิร์ฟเวอร์และเซิร์ฟเวอร์การเลือกความพร้อมใช้งานเซิร์ฟเวอร์อย่างครอบคลุม | ใช้ zoneavoidancePredicate และความพร้อมใช้งานเพื่อพิจารณาว่าเซิร์ฟเวอร์ถูกเลือกหรือไม่ ก่อนหน้านี้จะกำหนดว่าประสิทธิภาพการทำงานของโซนนั้นมีอยู่หรือไม่ ไม่รวมโซนที่ไม่พร้อมใช้งาน (เซิร์ฟเวอร์ทั้งหมด) AvailabilityPredicate ใช้เพื่อกรองเซิร์ฟเวอร์ที่มีการเชื่อมต่อมากเกินไป |
5: ริบบิ้นคนเดียว
สร้างชื่อโครงการ maven ribbon_client
เนื้อหา POM
<การพึ่งพา> <การพึ่งพา> <roupId> com.netflix.ribbon </groupId> <ratifactId> ริบบิ้น-คอร์ </artifactid> <version> 2.2.0 </version> </การพึ่งพา> <predency> <ratrient> com.netflix.ribbon </Groupid> </predency> </dependencies>
sample-client.properties ไฟล์การกำหนดค่า
# จำนวนสูงสุดของ retries sample-client.ribbon.maxautoretries = 1# max จำนวนของเซิร์ฟเวอร์ถัดไปเพื่อลองใหม่ (ไม่รวมเซิร์ฟเวอร์แรก) ตัวอย่าง-client.ribbon.maxautoretriesNextServer = 1# ไม่ว่าการทำงานทั้งหมดจะถูกนำกลับมาใช้ใหม่ sample-client.ribbon.serverListrefreshInterval = 2000# เชื่อมต่อหมดเวลาที่ใช้โดย Apache httpClient-client.ribbon.connecttimeout = 3000# การหมดเวลาอ่านที่ใช้โดย Apache httpClient-client.ribbon. sample-client.ribbon.listofservers = www.sohu.com: 80, www.163.com: 80, www.sina.com.cn: 80sample-client.ribbon.enableprimeconnections = TRUE
รหัสริบบิ้น
นำเข้า java.net.uri; นำเข้า com.netflix.client.clientfactory; นำเข้า com.netflix.client.http.httprequest; นำเข้า com.netflix.client.http.httpresponse; com.netflix.niws.client.http.restclient; Ribbonmain คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {configurationManager.loadPropertiesFromResources ("sample-client.properties"); System.out.println (configurationManager.getConfiginstance (). getProperty ("sample-client.ribbon.listofservers")); RESTClient Client = (restClient) clientFactory.getNamedClient ("ตัวอย่าง-ลูกค้า"); httpRequest Request = httprequest.newbuilder (). uri (uri ใหม่ ("/")). build (); สำหรับ (int i = 0; i <4; i ++) {httPresponse response = client.executewithloadbalancer (คำขอ); System.out.println ("สถานะสำหรับ URI:" + Response.getRequesteduri () + "คือ:" + response.getStatus ()); } ZoneAwareloadBalancer LB = (ZoneAwareloadBalancer) ไคลเอนต์ GetLoadBalancer (); System.out.println (lb.getloadbalancerstats ()); configurationManager.getConfiginstance (). setProperty ("sample-client.ribbon.listofservers", "ccblog.cn:80,www.linkedin.com:80"); System.out.println ("การเปลี่ยนเซิร์ฟเวอร์ ... "); Thread.sleep (3000); สำหรับ (int i = 0; i <3; i ++) {httPresponse response = client.executewithloadbalancer (คำขอ); System.out.println ("สถานะสำหรับ URI:" + Response.getRequesteduri () + "คือ:" + response.getStatus ()); } system.out.println (lb.getloadbalancerstats ()); -การแยกวิเคราะห์รหัส
ใช้ Archaius ConfigurationManager เพื่อโหลดคุณสมบัติ;
ใช้ ClientFactory เพื่อสร้างลูกค้าและโหลดบัลแลนเซอร์
ใช้ตัวสร้างเพื่อสร้างคำขอ HTTP โปรดทราบว่าเราสนับสนุนเส้นทางของส่วน "/" ของ URI เท่านั้น เมื่อเซิร์ฟเวอร์ถูกเลือกโดย Load Balancer ไคลเอนต์จะคำนวณ URI ที่สมบูรณ์
การโทร API client.executewithloadbalancer () ไม่ใช่ exeucte () API;
แก้ไขพูลเซิร์ฟเวอร์แบบไดนามิกในการกำหนดค่า
รอให้รายการเซิร์ฟเวอร์รีเฟรช (ช่วงการรีเฟรชที่กำหนดไว้ในไฟล์กำหนดค่าคือ 3 วินาที);
พิมพ์สถิติเซิร์ฟเวอร์ที่บันทึกโดยโหลดบาลานซ์
หก: ริบบิ้นรวมกับยูเรก้า
ก่อนอื่นให้เริ่มโครงการ Eureka_Register_Service (ศูนย์ทะเบียน) และโครงการ Biz-Service-0 (ผู้ผลิตบริการ)
สร้างโครงการ Maven Eureka_ribbon_client โครงการนี้เริ่มต้นและการกำหนดค่าที่เกี่ยวข้องขึ้นอยู่กับ Eureka_register_service และ Biz-Service-0
POM เข้าร่วม
<carent> <scarreid> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Parent </artifactid> <Sersion> 1.4.3.Release </เวอร์ชัน> <การพึ่งพาอาศัยกัน> <! <ratifactid> Spring-Cloud-Starter-Ribbon </ArtifactId> </serdency> <การพึ่งพา> <roupId> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Starter-eureka </artifactid> <ArtIfactId> Spring-Boot-Starter-WEB </artifactId> </การพึ่งพาอาศัย> <การพึ่งพาอาศัย> <roupId> org.springframework.boot </groupId> <ratifactid> การพึ่งพาการทดสอบการพึ่งพาสปริง <RoupID> org.springframework.cloud </groupId> <ratifactid> Spring-Cloud-Dependencies </artifactid> <sersion> Brixton.Release </เวอร์ชัน> <ply> pom </peple>
ในคลาสหลักของแอปพลิเคชันเพิ่มความสามารถในการบริการ Discovery ผ่านคำอธิบายประกอบ @EnablediscoveryClient สร้างอินสแตนซ์ RestTemplate และเปิดใช้งานความสามารถในการโหลดบาลานซ์ผ่านคำอธิบายประกอบ @LoadBalanced
@springbootapplication @enablecoveryClientPublic คลาส RibbonApplication {@Bean @LoadBalanced RestTemplate RestTemplate () {ส่งคืน RESTTEMPLATE ใหม่ (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (ribbonapplication.class, args); -สร้าง consumercontroller เพื่อใช้บริการ Getuser ของ Biz-Service-0 เรียกบริการโดย RestTemplate โดยตรง
@RestControllerPublic Class ConsumerController {@autoWired RestTemplate RestTemplate; @RequestMapping (value = "/getUserInfo", method = requestMethod.get) สตริงสาธารณะเพิ่ม () {return restTemplate.getForentity ("http: // biz-service-0/getuser", string.class) .getbody (); - กำหนดค่าศูนย์ลงทะเบียนบริการยูเรก้าในแอปพลิเคชัน properties
Spring.application.name = Ribbon-ConsumerServer.port = 8003eureka.client.serviceurl.defaultzone = http: // localhost: 8000/ureka/
หลังจากเสร็จสิ้นคุณสามารถเปิด http: // localhost: 8003/getuserinfo เพื่อดูผลลัพธ์
สรุป: ริบบิ้นเป็นส่วนประกอบไคลเอนต์โหลดบาลานซ์ที่อ่อนนุ่ม สามารถใช้ร่วมกับคำขออื่น ๆ ที่จำเป็น การรวมเข้ากับยูเรก้าเป็นเพียงตัวอย่างของมัน
ที่อยู่รหัส: https://github.com/zhp8341/springclouddemo
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น