ในสแต็คสปริงคลาวด์ Netflix แต่ละ microservice จะเปิดเผยบริการของตัวเองในรูปแบบของอินเทอร์เฟซ HTTP ดังนั้นไคลเอ็นต์ HTTP จะต้องใช้เมื่อเรียกใช้บริการระยะไกล เราสามารถใช้ JDK Native UrlConnection, ไคลเอนต์ HTTP ของ Apache, ไคลเอนต์ HTTP แบบอะซิงโครนัสของ Netty และ RestTemplate ของ Spring อย่างไรก็ตามสิ่งที่สะดวกและสง่างามที่สุดที่จะใช้คือการแสร้งทำเป็น
รู้เบื้องต้น
Feign เป็นไคลเอนต์ HTTP ที่มีการประกาศ การใช้ Feign ใน Spring Cloud เราสามารถบรรลุประสบการณ์การเข้ารหัสแบบเดียวกันกับการเรียกใช้วิธีการในท้องถิ่นเมื่อขอบริการระยะไกลโดยใช้ HTTP นักพัฒนาไม่สามารถตระหนักได้อย่างสมบูรณ์ว่านี่เป็นวิธีระยะไกลและไม่สามารถเห็นได้ว่านี่เป็นคำขอ HTTP ตัวอย่างเช่น:
@autowiredPrivate บริการโฆษณา GROPREMOTESERVICE; // Remote Service Public Public Vadsgroupvo Foo (Integer GroupID) {return service.findbyGroupId (GroupID); // โทรระยะไกลบริการผ่าน http} นักพัฒนาสามารถกรอกกระบวนการส่งคำขอ HTTP ถอดรหัสการส่งคืน HTTP และห่อหุ้มพวกเขาลงในวัตถุผ่าน service.findByGroupId()
คำจำกัดความของการแสร้งทำเป็น
เพื่อให้ Feign ทราบว่าที่อยู่ใดที่จะส่งคำขอไปยังเมื่อเรียกใช้วิธีการและพารามิเตอร์ที่จะใช้สำหรับคำขอเราจำเป็นต้องกำหนดอินเทอร์เฟซ:
@feignClient (name = "ea") // [a] อินเตอร์เฟสสาธารณะโฆษณา groupremoteservice {@requestmapping (value = "/group/{groupId}", method = requestMethod.get) // [b] valuedroupvo findByGroupid (@pathVariable (" "/group/{GroupId}", method = requestMethod.put) โมฆะอัปเดต (@PathVariable ("GroupID") จำนวนเต็ม GroupID, @RequestParam ("GroupName") ชื่อกลุ่มกลุ่ม)ตอบ: @FeIgnClient ใช้เพื่อแจ้งส่วนประกอบแสร้งทำเป็นพร็อกซีอินเทอร์เฟซ (ไม่จำเป็นต้องเขียนการใช้งานอินเทอร์เฟซ) และผู้ใช้สามารถฉีดผ่าน @autowired โดยตรง
B: @RequestMapping หมายความว่าเมื่อโทรหาวิธีนี้คุณต้องส่งคำขอ GET ไปยัง /group/{groupId}
C: @PathVariable มีความหมายเช่นเดียวกับคำอธิบายประกอบที่สอดคล้องกันใน SpringMVC
เมื่อแอปพลิเคชันสปริงคลาวด์เริ่มต้นการแกล้งจะสแกนอินเทอร์เฟซที่ทำเครื่องหมายด้วยคำอธิบายประกอบ @feignclient สร้างพร็อกซีและลงทะเบียนลงในคอนเทนเนอร์สปริง เมื่อสร้างพร็อกซี Feign จะสร้างวัตถุ requettemplate สำหรับแต่ละวิธีอินเตอร์เฟส วัตถุนี้ห่อหุ้มข้อมูลทั้งหมดที่จำเป็นสำหรับคำขอ HTTP ชื่อพารามิเตอร์คำขอวิธีการขอและข้อมูลอื่น ๆ จะถูกกำหนดในกระบวนการนี้ เทมเพลตของการแสร้งทำเป็นสะท้อนให้เห็นที่นี่
ในตัวอย่างนี้เราใช้การแกล้งใช้ร่วมกับยูเรก้าและ ,@FeignClient(name = "ea") หมายถึงการแจ้งเตือนการค้นหาเพื่อสอบถาม Eureka สำหรับบริการที่ชื่อ EA เมื่อเรียกวิธีการอินเทอร์เฟซนี้เพื่อรับ URL บริการ
เครื่องเข้ารหัสตัวถอดรหัสและ Errordecoder ของ Feign's
กระบวนการของ Feign ในการทำให้เป็นอนุกรมวัตถุพารามิเตอร์เมธอดในการลายเซ็นเมธอดลงในพารามิเตอร์การร้องขอและวางลงในคำขอ HTTP เสร็จสมบูรณ์โดย encoder (encoder) ในทำนองเดียวกันการ deserializing ข้อมูลการตอบสนอง HTTP ลงในวัตถุ Java นั้นทำโดยตัวถอดรหัส (ตัวถอดรหัส)
โดยค่าเริ่มต้น Feign จะแปลงพารามิเตอร์ที่ทำเครื่องหมายด้วยคำอธิบายประกอบ @RequestParam เป็นสตริงและเพิ่มลงใน URL และแปลงพารามิเตอร์โดยไม่ต้องมีคำอธิบายประกอบเป็น JSON ผ่าน Jackson เพื่อนำพวกเขาเข้าไปในร่างกายคำขอ โปรดทราบว่าหากวิธีการใน @requetMapping ระบุวิธีการร้องขอเป็นโพสต์พารามิเตอร์ที่ไม่ได้สังเกตทั้งหมดจะถูกละเว้นตัวอย่างเช่น:
@RequestMapping (value = "/Group/{GroupId}", method = requestMethod.get) การอัปเดตเป็นโมฆะ (@PathVariable ("GroupID") จำนวนเต็ม GroupID, @requestParam ("GroupName") ชื่อกลุ่ม, dataObject obj);ในเวลานี้เนื่องจากคำขอรับไม่มีตัวตนพารามิเตอร์ OBJ จะถูกละเว้น
ในสภาพแวดล้อมคลาวด์ฤดูใบไม้ผลิตัวเข้ารหัสของ Feign* จะถูกใช้เพื่อเข้ารหัสพารามิเตอร์ที่ยังไม่ได้เพิ่มลงในคำอธิบายประกอบ หากคุณปรับแต่งตัวเข้ารหัสตัวเข้ารหัสของคุณจะถูกเรียกเฉพาะเมื่อเข้ารหัสพารามิเตอร์ OBJ สำหรับตัวถอดรหัสผู้แทนค่าเริ่มต้นไปยังคลาส MappingJackson2httpmessageConverter ใน SpringMVC สำหรับการถอดรหัส Errordecoder จะถูกเรียกเฉพาะเมื่อรหัสสถานะไม่ได้อยู่ระหว่าง 200 ถึง 300 ฟังก์ชั่นของ Errordecoder คือการส่งคืนข้อยกเว้นตามข้อมูลการตอบกลับ HTTP ซึ่งสามารถจับได้ว่ามีการเรียกว่าอินเทอร์เฟซปลอม ขณะนี้เรากำลังใช้ ErrordEcoder เพื่อให้อินเทอร์เฟซแสร้งทำเป็นโยนข้อยกเว้นทางธุรกิจเพื่อให้ผู้โทรจัดการ
ไคลเอนต์ HTTP ของ Feign
โดยค่าเริ่มต้น Feign ใช้ JDK Native UrlConnection เพื่อส่งคำขอ HTTP ไม่มีกลุ่มการเชื่อมต่อ แต่จะมีการเชื่อมต่อที่ยาวนานสำหรับแต่ละที่อยู่นั่นคือการเชื่อมต่อการคงอยู่ของ HTTP ถูกใช้ เราสามารถแทนที่ไคลเอนต์ HTTP ดั้งเดิมของ Feign ด้วยไคลเอนต์ HTTP ของ Apache ซึ่งจะได้รับความสามารถในการควบคุมที่เกี่ยวข้องอย่างใกล้ชิดกับประสิทธิภาพเช่นพูลการเชื่อมต่อการหมดเวลา ฯลฯ สปริงคลาวด์รองรับการทดแทน feign-httpclient ตั้งแต่รุ่น Brixtion.SR5
<!-แทนที่ httpClient ดั้งเดิมด้วย Apache httpClient-> <การพึ่งพา> <roupId> org.apache.httpComponents </groupId> <ratifactid> httpClient </artifactid> <ArtIfactId> feign-httpClient </artifactId> <cersion> $ {feign-httpClient} </เวอร์ชัน> </dependency>จากนั้นเพิ่มใน application.properties:
feign.httpClient.enabled = true
สรุป
ผ่านการแสร้งทำเป็นเราสามารถทำการโทรจากระยะไกล HTTP โปร่งใสให้กับนักพัฒนาได้อย่างสมบูรณ์และได้รับประสบการณ์การเข้ารหัสที่สอดคล้องกับวิธีการโทรหาวิธีการในท้องถิ่น สิ่งนี้คล้ายกับวิธีการที่บริการระยะไกลถูกเปิดเผยในอาลีบาบา Dubbo ความแตกต่างคือ Dubbo ขึ้นอยู่กับโปรโตคอลไบนารีส่วนตัวในขณะที่การแกล้งเป็นลูกค้า HTTP เป็นหลัก หากคุณใช้สปริงคลาวด์ Netflix เพื่อสร้างไมโครไซต์การแสร้งทำเป็นว่าเป็นตัวเลือกที่ดีที่สุดอย่างไม่ต้องสงสัย
ข้างต้นคือวิธีการ (แนะนำ) สำหรับการใช้ Spring Cloud Feign เป็นไคลเอนต์ HTTP เพื่อเรียกใช้บริการ HTTP ระยะไกล (แนะนำ) ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!