Ribbon เป็นส่วนประกอบที่รับผิดชอบในการโหลดบาลานซ์ในถังสปริง Cloud Netflix มันเป็นคอลเลกชันของไลบรารีคลาส ผ่าน Ribbon โปรแกรมเมอร์สามารถใช้การบาลานซ์ "โปร่งใส" โดยไม่เกี่ยวข้องกับรายละเอียดการใช้งานที่เฉพาะเจาะจงโดยไม่ต้องเขียนโค้ดมากเกินไปเพื่อใช้การปรับสมดุลโหลดในโครงการ
ตัวอย่างเช่นในคลัสเตอร์ที่มียูเรก้าและริบบิ้นบริการ (ซึ่งสามารถเข้าใจได้ว่าเป็นแพ็คเกจขวด) ถูกปรับใช้ในเซิร์ฟเวอร์หลายเครื่อง เมื่อผู้ใช้บริการหลายคนเรียกบริการในเวลาเดียวกันคำขอที่เกิดขึ้นพร้อมกันเหล่านี้สามารถส่งต่อไปยังเซิร์ฟเวอร์แต่ละเซิร์ฟเวอร์โดยใช้กลยุทธ์ที่สมเหตุสมผล
ในความเป็นจริงเมื่อใช้ส่วนประกอบอื่น ๆ ของคลาวด์สปริงเราสามารถเห็นร่องรอยของริบบิ้นเช่นยูเรก้าสามารถรวมเข้ากับริบบิ้นและส่วนประกอบ Zuul ที่ให้ฟังก์ชั่นเกตเวย์สามารถรวมเข้ากับริบบิ้นเมื่อส่งต่อคำขอ
จากระดับรหัสริบบิ้นมีอินเทอร์เฟซที่สำคัญกว่าสามประการต่อไปนี้
ครั้งแรก Iloadbalancer ซึ่งเรียกว่า Load Balancer เราสามารถส่งต่อคำขอในโครงการตามกฎเฉพาะได้อย่างสมเหตุสมผล คลาสการใช้งานทั่วไปคือ BaseloadBalancer
ประการที่สอง Irule อินเทอร์เฟซนี้มีคลาสการใช้งานหลายคลาสเช่น RandomRule และ RoundrobinRule คลาสการใช้งานเหล่านี้จะกำหนดกลยุทธ์การปรับสมดุลโหลดโดยเฉพาะเช่น "สุ่ม" และ "การสำรวจ" ฯลฯ เรายังสามารถเขียนวิธีการในอินเทอร์เฟซนี้เพื่อปรับแต่งกลยุทธ์การปรับสมดุลโหลด
ในคลาส BaseloadBalancer เราสามารถตั้งค่านโยบายการปรับสมดุลโหลดผ่านคลาสการใช้งาน IRULE เพื่อให้โหลดบัลแลนเซอร์สามารถส่งต่อคำขอได้อย่างสมเหตุสมผลตามนี้
ประการที่สามอินเทอร์เฟซ iping ผ่านอินเทอร์เฟซนี้เราสามารถรับเซิร์ฟเวอร์ที่มีอยู่ในปัจจุบันและเรายังสามารถปรับแต่งกฎเพื่อพิจารณาว่าเซิร์ฟเวอร์นั้นพร้อมใช้งานโดยการเขียนวิธีการในอินเทอร์เฟซนี้ใหม่หรือไม่ ในคลาส BaseloadBalancer เรายังสามารถกำหนดนโยบายเพื่อพิจารณาว่าเซิร์ฟเวอร์นั้นมีให้ผ่านคลาสการใช้งาน IPING หรือไม่
1 iloadbalancer: อินเตอร์เฟส loadbalancer
ในริบบิ้นเรายังสามารถเลือกเซิร์ฟเวอร์ตามนโยบายการปรับสมดุลการโหลดเฉพาะผ่านอินเตอร์เฟส iloadbalancer
ผ่าน iloadbalancerdemo.java ด้านล่างลองมาดูการใช้งานพื้นฐานของอินเทอร์เฟซนี้ คลาสนี้ถูกวางไว้ในโครงการ RabbionbasicDemo ที่สร้างขึ้นในส่วนที่ 4.2 และรหัสมีดังนี้
// ละเว้นแพ็คเกจที่จำเป็นและรหัสนำเข้าคลาสสาธารณะ iloadbalancerdemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// สร้างวัตถุ iloadbalancer iloadbalancer loadbalancer = ใหม่ baseloadbalancer (); // กำหนดรายการรายการเซิร์ฟเวอร์ <server> myServers = new ArrayList <Server> (); // สร้างเซิร์ฟเวอร์วัตถุเซิร์ฟเวอร์สองตัว S1 = เซิร์ฟเวอร์ใหม่ ("Ekserver1", 8080); เซิร์ฟเวอร์ S2 = เซิร์ฟเวอร์ใหม่ ("Ekserver2", 8080); // ใส่วัตถุเซิร์ฟเวอร์สองรายการลงในรายการประเภท MyServers Object MyServers.Add (S1); MyServers.add (S2); // ใส่ myServers ลงใน load balancer loadbalancer.addservers (MyServers); // เริ่มต้นการโทร 10 ครั้งในการวนรอบสำหรับ (int i = 0; i <10; i ++) {// ใช้กฎการปรับสมดุลโหลดเริ่มต้นเพื่อรับเซิร์ฟเวอร์ประเภทเซิร์ฟเวอร์เซิร์ฟเวอร์ S = loadbalancer.chooeserver ("เริ่มต้น"); // ที่อยู่ IP เอาท์พุทและหมายเลขพอร์ต System.out.println (s.getHost () + ":" + s.getport ()); -ในบรรทัดที่ 5 เราสร้างวัตถุ loadbalancer ของประเภท baseloadbalancer และ baseloadbalancer เป็นคลาสการใช้งานของอินเตอร์เฟส load balancer iloadbalancer
ในบรรทัดที่ 6 ถึง 13 เราสร้างวัตถุประเภทเซิร์ฟเวอร์สองชิ้นและนำไปใส่ลงใน MyServers ในบรรทัดที่ 15 เราใส่วัตถุ MyServers ประเภทรายการลงในตัวโหลดบาลานซ์
ในการวนรอบสำหรับบรรทัด 17 ถึง 22 เราจำลองการเลือกเซิร์ฟเวอร์ 10 ครั้งผ่านตัวโหลดบาลานซ์ โดยเฉพาะในบรรทัดที่ 19 เราเลือกเซิร์ฟเวอร์ด้วยกฎการโหลดบาลานซ์เริ่มต้นผ่านวิธีตัวเลือกของ LoadBalancer ในบรรทัดที่ 21 เราใช้การกระทำ "พิมพ์" เพื่อจำลองจริง "โดยใช้วัตถุเซิร์ฟเวอร์เพื่อจัดการการร้องขอ"
ผลลัพธ์ที่รันของรหัสข้างต้นมีดังนี้ เราจะเห็นได้ว่า LoadBalancer Load Balancer Distributes 10 คำขอไปยังเซิร์ฟเวอร์ 2 ตัวและเราสามารถเห็นผลของ "การปรับสมดุล"
ประการที่สอง Irule อินเทอร์เฟซนี้มีคลาสการใช้งานหลายคลาสเช่น RandomRule และ RoundrobinRule คลาสการใช้งานเหล่านี้จะกำหนดกลยุทธ์การปรับสมดุลโหลดโดยเฉพาะเช่น "สุ่ม" และ "การสำรวจ" ฯลฯ เรายังสามารถเขียนวิธีการในอินเทอร์เฟซนี้เพื่อปรับแต่งกลยุทธ์การปรับสมดุลโหลด
ในคลาส BaseloadBalancer เราสามารถตั้งค่านโยบายการปรับสมดุลโหลดผ่านคลาสการใช้งาน IRULE เพื่อให้โหลดบัลแลนเซอร์สามารถส่งต่อคำขอได้อย่างสมเหตุสมผลตามนี้
ประการที่สามอินเทอร์เฟซ iping ผ่านอินเทอร์เฟซนี้เราสามารถรับเซิร์ฟเวอร์ที่มีอยู่ในปัจจุบันและเรายังสามารถปรับแต่งกฎเพื่อพิจารณาว่าเซิร์ฟเวอร์นั้นพร้อมใช้งานโดยการเขียนวิธีการในอินเทอร์เฟซนี้ใหม่หรือไม่ ในคลาส BaseloadBalancer เรายังสามารถกำหนดนโยบายเพื่อพิจารณาว่าเซิร์ฟเวอร์นั้นมีให้ผ่านคลาสการใช้งาน IPING หรือไม่
Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver2: 8080 Ekserver1: 8080 Ekserver1: 8080
2 IRULE: อินเทอร์เฟซที่กำหนดกฎการโหลดบาลานซ์
ใน Ribbon เราสามารถตั้งค่ากฎที่สอดคล้องกันสำหรับตัวโหลดบาลานซ์โดยกำหนดคลาสการใช้งานของอินเตอร์เฟส IRULE ในตารางต่อไปนี้เราสามารถเห็นคลาสการใช้งานที่ใช้กันทั่วไปของอินเตอร์เฟส IRULE
ชื่อของคลาสการใช้งาน | กฎการปรับสมดุล |
การสุ่ม | ใช้กลยุทธ์ที่เลือกแบบสุ่ม |
รอบ | ใช้กลยุทธ์การสำรวจ |
ลองอีกครั้ง | เมื่อใช้กลยุทธ์นี้จะมีการดำเนินการลองใหม่อีกครั้ง |
AvailabilityFilterRule | มันจะกรองเซิร์ฟเวอร์ที่มีความล้มเหลวในการเชื่อมต่อหลายครั้งและคำขอพร้อมกันที่มากเกินไป |
ถ่วงน้ำหนัก | ตั้งค่าน้ำหนักสำหรับแต่ละเซิร์ฟเวอร์ตามเวลาตอบสนองเฉลี่ยและเลือกเซิร์ฟเวอร์ที่มีเวลาตอบสนองเฉลี่ยที่เล็กกว่าตามค่าน้ำหนักนี้ |
zoneavoidancerule | ลำดับความสำคัญจะได้รับการจัดสรรคำขอให้เซิร์ฟเวอร์ที่มีโซนเดียวกันกับคำขอ |
ในโปรแกรม iruledemo.java ต่อไปนี้มาดูการใช้งานขั้นพื้นฐานของ Irule
// ละเว้นแพ็คเกจที่จำเป็นและรหัสนำเข้าคลาสสาธารณะ iruledemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// โปรดทราบว่าสิ่งนี้ใช้สำหรับ baseloadbalancer ไม่ใช่อินเตอร์เฟส iloadbalancer baseloadbalancer loadbalancer = ใหม่ baseloadbalancer (); // ประกาศนโยบายการปรับสมดุลโหลดตามกฎการเลือกตั้ง irule = ใหม่ roundrobinRule (); // ตั้งค่านโยบาย loadbalancer.setRule (กฎ); // กำหนด 3 เซิร์ฟเวอร์ดังต่อไปนี้และวางไว้ในคอลเลกชันของรายการประเภทรายการ <server> myServers = new ArrayList <Server> (); เซิร์ฟเวอร์ S1 = เซิร์ฟเวอร์ใหม่ ("Ekserver1", 8080); เซิร์ฟเวอร์ S2 = เซิร์ฟเวอร์ใหม่ ("Ekserver2", 8080); เซิร์ฟเวอร์ S3 = เซิร์ฟเวอร์ใหม่ ("Ekserver3", 8080); MyServers.add (S1); MyServers.add (S2); MyServers.add (S3); // ตั้งค่ารายการ LoadBalancer.Addservers (MyServers); // เอาต์พุตผลลัพธ์ของการปรับสมดุลโหลดสำหรับ (int i = 0; i <10; i ++) {เซิร์ฟเวอร์ s = loadbalancer.chooseserver (null); System.out.println (s.getHost () + ":" + s.getport ()); -รหัสนี้คล้ายกับ iloadbalancerdemo.java ในบทความข้างต้น แต่มีความแตกต่างดังต่อไปนี้
1 ในบรรทัดที่ 5 เรากำหนดตัวโหลดบาลานซ์ผ่านคลาส BaseloadBalancer แทนอินเทอร์เฟซเนื่องจากคลาสมีวิธี SetRule
2 กำหนดวัตถุกฎตามกฎการลงคะแนนในบรรทัดที่ 7 และตั้งเป็นโหลดบาลานซ์ในบรรทัด 9
3 ในบรรทัดที่ 19 เราใส่วัตถุรายการที่มี 3 เซิร์ฟเวอร์ลงในโหลดบัลลาร์เซอร์แทนที่จะเป็นสองรุ่นก่อนหน้า เนื่องจากมันถูกเก็บไว้ที่นี่เพื่อจุดประสงค์ในการสาธิตเราจะใส่เซิร์ฟเวอร์ "Ekserver3" ที่ไม่มีอยู่จริง
หลังจากเรียกใช้โปรแกรมเราจะเห็นว่ามี 10 เอาต์พุตและแน่นอนว่ามันส่งออกชื่อของเซิร์ฟเวอร์ 3 ตัวตามลำดับตามกฎ "การสำรวจ" หากเราเปลี่ยนรหัสบนบรรทัด 7 เป็นต่อไปนี้เราจะเห็นชื่อเซิร์ฟเวอร์ "สุ่ม" เอาต์พุต
กฎ irule = new RandomRule ();
3 IPING: อินเทอร์เฟซเพื่อตรวจสอบว่าเซิร์ฟเวอร์พร้อมใช้งาน
ในโครงการเรามักจะปล่อยให้อินเตอร์เฟส iloadbalancer ตรวจสอบโดยอัตโนมัติว่าเซิร์ฟเวอร์นั้นพร้อมใช้งานหรือไม่ (บริการเหล่านี้ถูกห่อหุ้มด้วยรหัสพื้นฐานของริบบิ้น) นอกจากนี้เรายังสามารถใช้อินเทอร์เฟซ iping ในส่วนประกอบริบบิ้นเพื่อใช้ฟังก์ชั่นนี้
ในรหัส iruledemo.java ต่อไปนี้เราจะแสดงให้เห็นถึงการใช้งานทั่วไปของอินเทอร์เฟซ iping
// ละเว้นแพ็คเกจที่จำเป็นและการนำเข้าคลาส Myping ใช้ iping {public boolean isalive (เซิร์ฟเวอร์เซิร์ฟเวอร์) {// ถ้าชื่อเซิร์ฟเวอร์คือ ekserver2, ส่งคืนเท็จถ้า (server.gethost (). เท่ากับ ("ekserver2")) {return false; } return true; -คลาส MYPING ที่กำหนดไว้ใน Line 2 ใช้อินเตอร์เฟส IPING และแทนที่วิธี Isalive ในบรรทัด 3
ในวิธีนี้เราตัดสินตามชื่อเซิร์ฟเวอร์ โดยเฉพาะอย่างยิ่งหากชื่อคือ Ekserver2 จะส่งคืน FALSE ซึ่งหมายความว่าเซิร์ฟเวอร์ไม่พร้อมใช้งานมิฉะนั้นจะส่งคืนจริงซึ่งหมายความว่าเซิร์ฟเวอร์ปัจจุบันพร้อมใช้งาน
ระดับสาธารณะ Iruledemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {baseloadbalancer loadbalancer = ใหม่ baseloadbalancer (); // กำหนดวัตถุ myping ของ iping type iping myping = new myping (); // ใช้ myping object loadbalancer.setping (myping); // สร้างวัตถุเซิร์ฟเวอร์สามวัตถุและวางไว้ในรายการโหลดบาลานซ์ <server> myServers = new ArrayList <Server> (); เซิร์ฟเวอร์ S1 = เซิร์ฟเวอร์ใหม่ ("Ekserver1", 8080); เซิร์ฟเวอร์ S2 = เซิร์ฟเวอร์ใหม่ ("Ekserver2", 8080); เซิร์ฟเวอร์ S3 = เซิร์ฟเวอร์ใหม่ ("Ekserver3", 8080); MyServers.add (S1); MyServers.add (S2); MyServers.add (S3); loadbalancer.addservers (MyServers); // ร้องขอเซิร์ฟเวอร์หลายครั้งผ่าน A for loop สำหรับ (int i = 0; i <10; i ++) {เซิร์ฟเวอร์ s = loadbalancer.chooseserver (null); System.out.println (s.getHost () + ":" + s.getport ()); -ในฟังก์ชั่นหลักในบรรทัดที่ 12 เราสร้าง iping type myping object ในบรรทัดที่ 15 และใส่วัตถุนี้ลงในตัวโหลดบาลานซ์ในบรรทัด 17 ผ่านรหัสบนบรรทัดที่ 18 ถึง 26 เราสร้างเซิร์ฟเวอร์สามเซิร์ฟเวอร์และใส่ลงในตัวโหลดบาลานซ์เช่นกัน
ใน For Loop On Line 28 เรายังคงขอและส่งออกชื่อเซิร์ฟเวอร์ เนื่องจากตัวโหลดบาลานซ์ที่นี่มีวัตถุประเภท iping หลังจากได้รับเซิร์ฟเวอร์ตามนโยบายจึงจะพิจารณาว่าเซิร์ฟเวอร์นั้นใช้งานได้ตามวิธีการ ISACTION ใน MYPING หรือไม่
เนื่องจากในวิธีนี้เราจึงกำหนดว่าเซิร์ฟเวอร์ Ekserver2 ไม่สามารถใช้งานได้วัตถุโหลดบาลานซ์ LoadBalancer จะไม่ส่งคำขอไปยังเซิร์ฟเวอร์นั่นคือในผลลัพธ์ผลลัพธ์เราจะไม่เห็นผลลัพธ์ของ "Ekserver2: 8080"
จากนี้เราสามารถเห็นการใช้งานทั่วไปของอินเทอร์เฟซ iping เราสามารถกำหนดตรรกะของ "การตัดสินว่าเซิร์ฟเวอร์พร้อมใช้งาน" โดยการเขียนวิธี isalive ใหม่ ในโครงการจริงพื้นฐานสำหรับการตัดสินนั้นไม่มีอะไรมากไปกว่า "ไม่ว่าเซิร์ฟเวอร์จะตอบสนองนานเกินไป" หรือ "ไม่ว่าจำนวนคำขอที่ส่งไปยังเซิร์ฟเวอร์นั้นมากเกินไป" วิธีการตัดสินเหล่านี้ถูกห่อหุ้มในส่วนต่อประสาน IRULE และคลาสการใช้งานดังนั้นในสถานการณ์ทั่วไปเราใช้อินเตอร์เฟส IPING
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น