ในบทความก่อนหน้านี้เราสามารถพบได้ว่าเมื่อเราเรียก API ของบริการอื่น ๆ ผ่าน RestTemplate พารามิเตอร์ที่ต้องการจะต้องถูกเชื่อมต่อใน URL ที่ร้องขอ หากมีพารามิเตอร์น้อยลงเราอาจทนได้ เมื่อมีหลายพารามิเตอร์การประกบสตริงคำขอจะไม่มีประสิทธิภาพและดูโง่
มีทางออกที่ดีกว่านี้หรือไม่? คำตอบคือแน่นอนและ Netflix ได้จัดเตรียมกรอบการทำงาน: Feign
Feign เป็นไคลเอนต์บริการเว็บที่ประกาศและมีวัตถุประสงค์เพื่อให้การโทรผ่านบริการเว็บง่ายขึ้น Feign จัดเตรียมเทมเพลตสำหรับคำขอ HTTP โดยการเขียนอินเทอร์เฟซอย่างง่ายและคำอธิบายประกอบการแทรกคุณสามารถกำหนดพารามิเตอร์รูปแบบที่อยู่และข้อมูลอื่น ๆ ของคำขอ HTTP
Feign จะร้องขอพร็อกซี HTTP อย่างสมบูรณ์และเราเพียงแค่ต้องเรียกมันเช่นการเรียกใช้วิธีการเพื่อดำเนินการตามคำขอบริการและการประมวลผลที่เกี่ยวข้อง Feign รวมริบบิ้นและ Hystrix (เราจะพูดถึง Hystrix ในภายหลัง) ดังนั้นเราจึงไม่สามารถใช้องค์ประกอบทั้งสองนี้ได้อย่างชัดเจนอีกต่อไป
ในระยะสั้น Feign มีลักษณะดังต่อไปนี้:
ดูเหมือนว่าการทำแผนที่การใช้งานของเลเยอร์คอนโทรลเลอร์ของรูปแบบ SpringMVC ของเรา รูปแบบนี้เป็นสิ่งที่เราชอบจริงๆ Feign ใช้ @feignclient เพื่อทำแผนที่บริการ
ขั้นแรกขั้นตอนแรกคือการสร้างโมดูล Feign ใหม่บนพื้นฐานดั้งเดิมจากนั้นแนะนำการพึ่งพาที่เกี่ยวข้องและการพึ่งพาการปลอมแปลงซึ่งจะแนะนำการพึ่งพา Hystrix โดยอัตโนมัติดังนี้:
<การพึ่งพา> <roupId> org.springframework.cloud </groupid> <ratifactid> Spring-Cloud-Starter-eureka </artifactid> <sersion> 1.3.5.Release </เวอร์ชั่น> </การพึ่งพา> <Sersion> 1.4.0.Release </เวอร์ชัน> </predency>
การกำหนดค่า application.yml มีดังนี้:
เซิร์ฟเวอร์: พอร์ต: 8083Spring: แอปพลิเคชัน: ชื่อ: feign-consumereureka: ไคลเอนต์: service-url: defaultzone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka //
จากนั้นในบทความก่อนหน้านี้มีการเพิ่มวิธีการใหม่หลายวิธีลงในบริการโมดูล Provider1 และ Provider2 สองวิธีดังที่แสดงในรหัสต่อไปนี้:
/*** สร้างโดย CONG เมื่อปี 2018/5/8 */ @restcontrollerpublic คลาส hellocontroller {@requestmapping ("/hello") สตริงสาธารณะสวัสดี () {system.out.println ("การเข้าถึงมา 1 ... "); กลับ "hello1"; } @RequestMapping ("/hjcs") รายการสาธารณะ <String> laowangs (รหัสสตริง) {รายการ <string> list = new ArrayList <> (); list.add ("laowang1"); list.add ("laowang2"); list.add ("laowang3"); รายการคืน; } // วิธีเพิ่ม @RequestMapping (value = "/hellol", method = requestMethod.get) สตริงสาธารณะสวัสดี (@requestparam ชื่อสตริง) {return "hello" + name; } @RequestMapping (value = "/hello2", method = requestMethod.get) ผู้ใช้สาธารณะสวัสดี (@requestheader ชื่อสตริง, @requestheader อายุจำนวนเต็ม) {ส่งคืนผู้ใช้ใหม่ (ชื่ออายุ); } @RequestMapping (value = "/hello3", method = requestMethod.post) สตริงสาธารณะสวัสดี (@requestbody ผู้ใช้ผู้ใช้) {return "hello"+ ผู้ใช้ getName () + "," + ผู้ใช้ getage (); -ถัดไปคือคลาสผู้ใช้ที่จำเป็นสำหรับรหัสด้านบนรหัสมีดังนี้:
/*** สร้างโดย Cong 2017/12/2 */ผู้ใช้คลาสสาธารณะ {ชื่อสตริงส่วนตัว; อายุจำนวนเต็มส่วนตัว // จะต้องมีตัวสร้างที่ว่างเปล่าเมื่อทำให้การส่งสัญญาณเป็นอนุกรมมิฉะนั้นจะเกิดข้อผิดพลาด ผู้ใช้สาธารณะ () {} ผู้ใช้สาธารณะ (ชื่อสตริงอายุจำนวนเต็ม) {this.name = name; this.age = อายุ; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } Public Integer Getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุจำนวนเต็ม) {this.age = อายุ; -ถัดไปใช้ @feignclient ของ Feign ("ชื่อบริการ") เพื่อแมปการโทรบริการ รหัสมีดังนี้:
แพ็คเกจ hjc; นำเข้า org.springframework.cloud.netflix.feign.feignlient; นำเข้า org.springframework.web.bind.annotation.*;/*** สร้างโดย cong เมื่อปี 2018/5/17 */// การกำหนดค่า = xxx.class คลาสนี้กำหนดค่าคุณสมบัติที่แม่นยำของ Hystrix // value = "ชื่อบริการที่คุณใช้" @feignClient (value = "hello-service", fallback = feignfallback.class) public interface feignservice @RequestMapping (value = "/hellol", method = requestMethod.get) สตริงสวัสดี (@RequestParam ("ชื่อ") ชื่อสตริง); @RequestMapping (value = "/hello2", method = requestmethod.get) ผู้ใช้สวัสดี (@requestheader ("ชื่อ") ชื่อสตริง, @requestheader ("อายุ") อายุจำนวนเต็ม); @RequestMapping (value = "/hello3", method = requestMethod.post) สตริงสวัสดี (@requestbody ผู้ใช้ผู้ใช้);}จากนั้นฉีดอินเทอร์เฟซ Feiservice ลงในเลเยอร์คอนโทรลเลอร์เพื่อทำการโทรจากระยะไกล รหัสมีดังนี้:
/*** สร้างโดย CONG เมื่อปี 2018/5/17 */ @RestControllerPublic Class ConsumerController {@autowired feignservice feignservice; @RequestMapping ("/ผู้บริโภค") สตริงสาธารณะ helloconsumer () {return feignservice.hello (); } @requestmapping ("/consumer2") สตริงสาธารณะ helloconsumer2 () {String r1 = feignservice.hello ("hjc"); สตริง r2 = feignservice.hello ("hjc", 23) .tostring (); String R3 = FeignService.hello (ผู้ใช้ใหม่ ("HJC", 23)); ส่งคืน R1 + "-----" + R2 + "----" + R3; -จากนั้นสถานที่ที่จะใส่คำอธิบายประกอบไคลเอน
@enablefeignclients, รหัสมีดังนี้:@springbootapplication@enablecoverycoveryclient@enablefeignclientsspublic คลาส feignapplication {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (feignapplication.class, args); -จากนั้นเริ่มคลาสเริ่มต้นให้ป้อน LocalHost: 8083/ผู้บริโภคในเบราว์เซอร์และผลการทำงานมีดังนี้:
คุณจะเห็นได้ว่าการสำรวจความสมดุลแบบโหลดจะปรากฏ Hello1 และ Hello2
จากนั้นดำเนินการต่อเพื่อเข้าสู่ LocalHost: 8083/Consumer2 ในเบราว์เซอร์และผลการดำเนินการมีดังนี้:
ต่อไปเราจะใช้การลดระดับบริการภายใต้บริการโทรประกาศการเรียกร้อง จากนั้นเราต้องสร้างคลาส Feignfallback ใหม่เพื่อสืบทอด Feiservice รหัสมีดังนี้:
แพ็คเกจ hjc; นำเข้า org.springframework.stereotype.component;/*** สร้างโดย cong เมื่อปี 2018/5/17 */ @ComponentPublic Class Feignfallback ใช้ FeignService {// วิธีการใช้งานเป็นวิธีการลดระดับการเรียกใช้บริการ @Override สตริงสาธารณะ Hello () {return "ข้อผิดพลาด"; } @Override สตริงสาธารณะสวัสดี (ชื่อสตริง) {return "ข้อผิดพลาด"; } @Override ผู้ใช้สาธารณะสวัสดี (ชื่อสตริงอายุจำนวนเต็ม) {ส่งคืนผู้ใช้ใหม่ (); } @Override สตริงสาธารณะสวัสดี (ผู้ใช้ผู้ใช้) {return "ข้อผิดพลาด"; -จากนั้นเราหยุดโมดูลผู้ให้บริการทั้งสองโมดูลผู้ให้บริการ 1 และโมดูล Provider2 และผลการดำเนินการดังต่อไปนี้:
คุณจะเห็นว่าการโทรของเรามีบริการที่ลดระดับทั้งหมด
จากนั้นหากเราต้องการควบคุมพารามิเตอร์ของ Hystrix ได้อย่างแม่นยำตัวอย่างเช่นพารามิเตอร์ที่รวมกับ Hystrix คุณสามารถกำหนดค่าการกำหนดค่า = xxx class.class แอตทริบิวต์ในคำอธิบายประกอบ feignclient เพื่อระบุคุณสมบัติที่แม่นยำในชั้นเรียน
หรือกำหนดค่าใน application.yml ดังต่อไปนี้:
Hystrix: คำสั่ง: ค่าเริ่มต้น: การดำเนินการ: แยก: เธรด: TimeOutinMilliseconds: 5000 RIBBON: ConnectTimeOut: 500 #ถ้าคุณต้องการกำหนดค่าบริการแยกต่างหากดังนี้ Hello-Service: Ribbon: ConnectTimeOut: 500
สิ่งนี้ตอบสนองการโทรของสถานการณ์ส่วนใหญ่ของเรา แต่ถ้าคุณเขียนสถานการณ์ที่ดีคุณยังต้องใช้ Hystrix ดั้งเดิมและติดตามการใช้ Hystrix ก่อนหน้าของเรา อย่าใช้การโทรของไคลเอนต์แสร้งดังต่อไปนี้:
/*** สร้างโดย CONG เมื่อปี 2018/5/17 */คลาสสาธารณะ HJCCOMMAND ขยาย HystrixCommand {ป้องกัน HJCCOMMAND (กลุ่ม HystrixCommandGroupKey) {Super (กลุ่ม); } @Override วัตถุที่ได้รับการป้องกันการรัน () โยนข้อยกเว้น {return null; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น