ครั้งนี้ฉันแบ่งปันวิธีการใช้บริการ บทความก่อนหน้านี้พูดถึงการใช้ Feign เพื่อการบริโภคบทความนี้ใช้บริการการบริโภค REST+Ribbon และปรับแต่งองค์ประกอบการบริโภคอย่างง่ายผ่านการสำรวจ วัตถุประสงค์ของบทความนี้คือ: แนวคิดในการปรับแต่งบริการการบริโภค; หากมีข้อดีใด ๆ โปรด "ชอบ":
REST+RIBBON ตระหนักถึงบริการผู้บริโภค
ในฐานะผู้บริโภคบริการเราได้ทำสองกระบวนการหลักเพื่อแยกความแตกต่างระหว่าง 1) การได้รับบริการและ 2) บริการการโทร ดังนั้นจะได้รับบริการอย่างไรและจะเรียกบริการอย่างไร? มาดูแผนภาพแบบแมนนวลด้านล่าง:
จะเห็นได้จากไดอะแกรมด้วยตนเองที่ผู้บริโภคได้รับที่อยู่อินเตอร์เฟสจริงของผู้ให้บริการก่อนจากนั้นเรียกอินเทอร์เฟซผ่านที่อยู่ จากนั้นสำหรับสถาปัตยกรรม Microservice ไม่แนะนำให้รับ IP หรือพอร์ตระดับหนึ่งจากนั้นเรียกอินเทอร์เฟซดังนั้นแนวคิดของ ServiceId จึงเกิดขึ้นใน Microservice กระบวนการง่าย ๆ ได้รับการแนะนำและต่อไปนี้เป็นตัวอย่างในการวิเคราะห์ ก่อนเพิ่มการพึ่งพาเช่น:
<การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Web </artifactid> </การพึ่งพาอาศัย> <การพึ่งพา> <roupId> org.springframework.cloud </groupid>
มาใช้ EUREKA_SERVER (ศูนย์บริการ) และ EUREKA_PROVIDER (ผู้ให้บริการ) ที่สร้างขึ้นในบทความก่อนหน้านี้เพื่อดำเนินการทดสอบกรณี ที่นี่ฉันกำหนดโมดูล Eureka_Consumer_ribbon เป็นบริการผู้บริโภค ก่อนอื่นสร้างคลาส Service Layer และรหัส:
@ServicePublic คลาส Userservice ใช้ UserInterface {@AutoWired RestTemplate RestTemplate; @Override Public Morp <List <Mouser>> GetUsers (Morq RQ) {return null; } @Override สตริงสาธารณะ getMSG () {string str = restTemplate.getForObject ("http: // uureka-provider/msg", string.class); return str; -ส่วนใหญ่ใช้ฟังก์ชั่น RestTemplate.getForObject ของ RestTemplate และจากนั้นคุณต้องกำหนดคอนโทรลเลอร์เพื่อตอบสนองต่อข้อมูลที่ได้รับบนหน้า เพื่อความเรียบง่ายเพียงใช้อินเทอร์เฟซบริการ GetMSG เพื่อทดสอบ:
@RestControllerPublic คลาส USERCONTROLLER {@AutoWired Userservice Userservice; @getMapping ("/msg") สตริงสาธารณะ getMSG () {return userservice.getmsg (); -ในที่สุดเราเพิ่มรหัสต่อไปนี้ในคลาสเริ่มต้น โปรดทราบว่าจะต้องเพิ่มแท็ก @LoadBalanced เนื่องจากการพึ่งพายูเรก้าที่เราแนะนำมีริบบิ้น (Dalston.Release เวอร์ชัน) ริบบิ้นห่อหุ้มอัลกอริทึมการปรับสมดุลโหลด หากไม่เพิ่มคำอธิบายประกอบนี้ URL ของวิธีการพักผ่อนจะต้องเป็นเส้นทาง URL ที่มีอยู่ แน่นอนถ้ามีการเพิ่มคำอธิบายประกอบที่นี่คุณสามารถใช้ ServiceId ที่กล่าวถึงข้างต้น:
@springbootapplication @enablediscoveryclient // ไคลเอนต์ผู้บริโภคคลาสสาธารณะระดับ Eurekaconsumerribbonapplication {@bean @loadbalanced // โหลดบาลานซ์ RestTemplate RestTemplate () {ส่งคืนใหม่ RESTTEMPLAT (); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (eeurekaconsumerribbonapplication.class, args); -ต่อไปนี้เป็นเอฟเฟกต์ที่แสดงโดยผู้บริโภค:
ส่วนประกอบการบริโภคแบบง่าย ๆ
องค์ประกอบการบริโภคที่กำหนดเองเกือบจะเหมือนกับการวาดภาพด้วยตนเอง มันคือการได้รับที่อยู่อินเตอร์เฟสจริงของผู้ให้บริการก่อนจากนั้นโทรหา URL ผ่านส่วนที่เหลือเพื่อรับผลลัพธ์ผลลัพธ์ที่สอดคล้องกัน นี่คือคลาสองค์ประกอบ Shenniubanlance:
/** * สร้างโดย Shenniu เมื่อปี 2018/6 * <p> * REST+EUREKA+Custom Client */ @ComponentPublic Class Shenniubanlance {@autowired Private Resttemplate Resttemplate; @autowired DiscoveryClient DiscoveryClient; / ** * ที่อยู่จริงที่อยู่จริงพร้อมกัน <"ชื่อแอปพลิเคชันบริการ", ("อินเตอร์เฟสจริง ip", จำนวนการเข้าชม)> */ สาธารณะพร้อมกันพร้อมกันกับการใช้งาน <String, รายการ <Moservice>> ServicesMap = ใหม่พร้อมกัน /** * ตั้งค่าข้อมูลผู้ให้บริการเพื่อทำแผนที่ */โมฆะสาธารณะ setServicesMap () {// รับรายการแอปพลิเคชันผู้ให้บริการทั้งหมด <string> appNames = discoveryClient.getServices (); // จัดเก็บที่อยู่จริงไปยังแผนที่สำหรับ (appname string: appnames) {// รับข้อมูลของรายการผู้ให้บริการ <ServiceInstance> instanceInfos = discoveryClient.getInstances (appName); if (InstanceInfos.isEmpty ()) {ดำเนินการต่อ; } รายการ <Moservice> services = new ArrayList <> (); InstanceInfos.foreach (b -> {Moservice Service = ใหม่ moservice (); // จำนวนของบริการที่เข้าถึงได้ SetWatch (0L); // ที่อยู่อินเตอร์เฟสจริง SESTURL (B.Geturi (). ToString ()); Services.add (บริการ);}); // หากมีให้อัปเดต ServicesMap.put (AppName.ToLowerCase (), บริการ); }} / ** * บริการที่เลือกตามแอพ * * @param appname * @return * / public moservice choiceserviceByAppName (appname สตริง) โยนข้อยกเว้น {appname = appname.toLowerCase (); // รายการคอลเลกชันบริการแอพบางรายการ <Moservice> ServiceMap = ServicesMap.get (AppName); if (serviceMap == null) {// เริ่มต้นบริการแอพทั้งหมด SetServicesMap (); serviceMap = servicesmap.get (appname); if (serviceMap == null) {โยนข้อยกเว้นใหม่ ("ไม่พบ" + appname + "บริการที่เกี่ยวข้อง"); }} // กรองวิธีการสำรวจบริการด้วยจำนวนผู้เข้าชมจำนวนน้อยที่สุด moservice moservice = servicemap.stream (). min (comparator.comparing (Moservice :: getWatch)) .get (); // โหลดระเบียน +1 moservice.setWatch (moservice.getWatch () + 1); กลับ Moservice; } / ** * รีเฟรชข้อมูลผู้ให้บริการโดยอัตโนมัติเป็นแผนที่ * / @scheduled (recideDelay = 1,000 * 10) โมฆะสาธารณะ RefreshServicesMap () {setServicesMap (); } / ** * รับบริการคำขอเพื่อรับข้อมูลการส่งคืน * * @param appname ชื่อแอปพลิเคชันชื่อแอปพลิเคชัน * @param serviceName serviceName * @param MAP Request Parameter บน url * @param tclass return type * @param <t> * @return * / public <t> t> T โมฆะ; ลอง {// ตัวกรองเพื่อรับบริการจริง Moservice Service = ตัวเลือก choiceserviceByAppName (appname); // ขอ URL ของบริการสตริง apiurl = service.getUrl () + "/" + serviceName; System.out.println (apiurl); result = map! = null? RestTemplate.getForObject (apiurl, tclass, แผนที่): resttemplate.getForObject (apiurl, tclass); } catch (exception ex) {ex.printstacktrace (); } ผลตอบแทนผลลัพธ์; } / *** ข้อมูลบริการ* / คลาสสาธารณะ moservice { / *** จำนวนโหลดบันทึก* / นาฬิกายาวส่วนตัว; /** * ที่อยู่อินเตอร์เฟสจริง: http://xxx.com/api/add */URL สตริงส่วนตัว; Public Long GetWatch () {Return Watch; } โมฆะสาธารณะ setWatch (ดูยาว) {this.watch = watch; } สตริงสาธารณะ getUrl () {return url; } โมฆะสาธารณะ setUrl (rl String) {this.url = url; -ข้างต้นเป็นรหัสการใช้งานหลัก CODE LOGIC: ตั้งค่าข้อมูลผู้ให้บริการเป็นแผนที่-ตามแอพเพื่อรับวิธีการเลือกตั้งบริการ-》 ร้องขอบริการเพื่อรับข้อมูลการส่งคืน หลักการของการดำเนินการสำรวจคือการใช้หมายเลขบันทึกโหลดซึ่งโดยอัตโนมัติ +1 หลังจากคำขอแต่ละครั้ง เมื่อคุณต้องการรับผู้ให้บริการบางรายอินสแตนซ์ของค่าต่ำสุดจะถูกกรองผ่านหมายเลขบันทึกและ URL ที่อยู่อินเตอร์เฟสจริงจะถูกเก็บไว้ การโทรจะต้องเป็นเช่นนี้เท่านั้น (แน่นอนว่ามันสามารถเรียกได้ว่าเป็นคำอธิบายประกอบ):
@Override สตริงสาธารณะ getMSG () {string str = banlance.getServiceData ("Eureka-provider", "msg", null, string.class); return str; -ควรสังเกตที่นี่ว่าเราได้เพิ่มคำอธิบายประกอบ @LoadBalanced ใน RestTemplate ก่อนหน้าเพื่อให้คำขอ REST ต้องเข้าถึงใน non-IP (นั่นคือ ServiceId) เพื่อตอบสนองตามปกติมิฉะนั้นจะมีข้อผิดพลาดเช่น:
พูดง่ายๆคือคุณไม่จำเป็นต้องใช้ IP อีกต่อไปเพราะมีกลไกการปรับสมดุลโหลด เมื่อเราลบคำอธิบายประกอบนี้ส่วนประกอบที่กำหนดเองของเราจะสามารถทำงานได้สำเร็จและการเรนเดอร์จะเหมือนกับในตัวอย่างที่ 1 และแผนที่จะไม่ติดอยู่
รีเฟรชข้อมูลผู้ให้บริการโดยใช้กำหนดเวลา
ในสถาปัตยกรรม Microservice หากบริการถูกวางสายข้อมูลแคชบริการของลูกค้าจะต้องได้รับการอัปเดตในเวลามิฉะนั้นอาจขอ URL ลง จากการพิจารณานี้ฉันใช้แท็กที่เปิดใช้งานเพื่อทำการรีเฟรชที่กำหนดเวลา ก่อนอื่นเพิ่ม @enablecheduling ไปยังคลาสเริ่มต้นจากนั้นกำหนดบริการที่กะพริบข้อมูลบริการเช่น:
/ ** * รีเฟรชข้อมูลผู้ให้บริการโดยอัตโนมัติเป็นแผนที่ */ @scheduled (recideDelay = 1,000 * 10) โมฆะสาธารณะ RefreshServicesMap () {setServicesMap (); -เพื่ออำนวยความสะดวกในการทดสอบเอฟเฟกต์เมื่อเซิร์ฟเวอร์ผู้ให้บริการ (2) และผู้บริโภคเริ่มต้นขึ้นเราเริ่มให้บริการผู้ให้บริการกับพอร์ต 2005; จากนั้นรีเฟรชอินเทอร์เฟซผู้บริโภคเพื่อดูผลกระทบ:
ในเวลานี้คุณจะเห็นว่าอินเทอร์เฟซที่เรียกพอร์ต 2005 ได้รับการเรียกว่าสำเร็จ หลังจากเพิ่มบริการล่าสุดหรือไม่ถูกต้องลงในบริการที่กำหนดเวลา @Scheduled มันจะตอบสนองความต้องการของสิ่งที่คุณต้องการ หากคุณคิดว่าเนื้อหานี้มีประโยชน์กับคุณโปรดขอบคุณ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น