คำนำ
ตอนนี้ บริษัท จำนวนมากกำลังโอบกอดคลาวด์ฤดูใบไม้ผลิ Spring Boot เป็นเฟรมเวิร์กเว็บรุ่นต่อไปและ Spring Cloud เป็นผู้นำในไมโครไซต์ล่าสุดและเป็นที่นิยมมากที่สุด คุณต้องปฏิเสธเหตุผลอะไร? นักเรียนหลายคนในชวาได้เริ่มเรียนรู้คลาวด์ฤดูใบไม้ผลิอย่างแข็งขัน ในความเป็นจริงมีปัญหาอีกอย่างที่นี่: แม้ว่าทุกคนจะได้เรียนรู้ยูเรก้าริบบิ้น, Hystrix, Zuul, Feign ฯลฯ แต่ก็ยังยากที่จะนำไปใช้กับโครงการจริง
ความยากลำบากของ Microservices อยู่ในการแยกบริการ Framework เป็นเพียงเครื่องมือและหลายคนจะใช้มัน การแยกบริการและความสัมพันธ์ระหว่างบริการเป็นสิ่งที่ต้องพิจารณาในระหว่างการแยก
วันนี้เพื่อนร่วมชั้นส่งอีเมลถึงฉันเพื่อถามฉันเกี่ยวกับคำถามสองข้อต่อไปนี้:
นี่คือคำตอบบางส่วนตามประสบการณ์ของฉันเองสำหรับการอ้างอิงเท่านั้น:
เกี่ยวกับ API ในคำถามแรกคือคอนโทรลเลอร์ภายใต้ microservice แต่ละตัว?
สิ่งที่เราเรียกว่า API นั้นเป็นอินเทอร์เฟซจริง ๆ และส่วนใหญ่ได้รับการพัฒนาโดยใช้ Spring MVC ซึ่งเป็นวิธีการอธิบายประกอบในคอนโทรลเลอร์ คำอธิบายประกอบเป็นสิ่งที่เรามักใช้:
เกี่ยวกับคำถามแรกมันต้องใช้โครงการแบบครบวงจรเพื่อห่อหุ้มคอนโทรลเลอร์ของ Microservices อื่น ๆ หรือไม่?
ไม่มีรูปแบบที่แน่นอน ส่วนใหญ่จะถูกส่งต่อไปยังบริการธุรกิจของคุณโดยตรงผ่านทางเกตเวย์ API
ใช้หมวดหมู่ธุรกิจของเว็บไซต์บล็อกเช่น Yuantiandi เป็นตัวอย่าง:
มีฟังก์ชั่นทางธุรกิจ เมื่อฉันดูโพสต์บล็อกเฉพาะข้อมูลที่ฉันต้องส่งคืนมีดังนี้:
ในเวลานี้อินเทอร์เฟซของเราในการดูบทความจริง ๆ แล้วเกี่ยวข้องกับข้อมูลสามส่วนข้อมูลของบทความเองข้อมูลความคิดเห็นและข้อมูลของผู้เขียน
มีบริการ 3 บริการบริการผู้ใช้บริการบล็อกและบริการแสดงความคิดเห็น
ดังนั้นคำถามคือมันเกี่ยวข้องกับการโต้ตอบระหว่างบริการหลายบริการมาก่อน ในความเป็นจริงคำถามเดียวกับเพื่อนร่วมชั้นข้างต้นถามฉัน ฉันจำเป็นต้องมีโครงการแบบครบวงจรและรวบรวมบริการอื่น ๆ หรือไม่? พวกเขาสามารถเรียกกันได้หรือไม่?
ฉันแนะนำสองวิธีในการใช้งานนี้:
1. เกตเวย์ API ส่งต่อโดยตรงไปยังบริการบล็อก
API ของเราเป็นอินเทอร์เฟซสำหรับการได้รับข้อมูลโพสต์บล็อก ร่างกายหลักจะต้องเป็นบริการบล็อก มีอินเทอร์เฟซสำหรับข้อมูลโพสต์บล็อกในบริการบล็อก ในอินเทอร์เฟซเราเรียกอินเทอร์เฟซข้อมูลผู้ใช้โดยบริการผู้ใช้และเรายังเรียกข้อมูลความคิดเห็นโพสต์บล็อกในบริการแสดงความคิดเห็น มาดูรหัสหลอก:
@getMapping ("/บล็อก/รายละเอียด/{id}") Public BlogInfo BlogInfo (@PathVariable ("ID") Long ID) {// รับบล็อกข้อมูลบล็อกบล็อก = blogService.getById (ID); // รับข้อมูลผู้ใช้ userInfo userInfo = userfeignlient.getUserInfo (blog.getUserId ()); // รับข้อมูลความคิดเห็น commentInfo commentInfo = commentFeignClient.getCommentInfo (id); กลับมารวมข้อมูลทั้งหมดและส่งคืน -2. เพิ่มเลเยอร์บริการรวม
เลเยอร์บริการคอลเลกชันเป็นเพื่อนร่วมชั้นด้านบนจำเป็นหรือไม่ที่จะต้องมีโครงการที่เป็นเอกภาพในการให้บริการประกอบ? ซึ่งหมายความว่าบริการบล็อกของเรายังคงให้ข้อมูลบล็อกพื้นฐานและมีการเพิ่มบริการการรวมธุรกิจแยกต่างหากเพื่อรวบรวมข้อมูลนี้และส่งคืนไปยังผู้โทรอย่างสม่ำเสมอ รหัสหลอกมีดังนี้:
@getMapping ("/บล็อก/รายละเอียด/{id}") Public BlogInfo BlogInfo (@PathVariable ("ID") Long ID) {// รับบล็อกข้อมูลบล็อกบล็อก = blogfeignlient.getById (id); // รับข้อมูลผู้ใช้ userInfo userInfo = userfeignlient.getUserInfo (blog.getUserId ()); // รับข้อมูลความคิดเห็น commentInfo commentInfo = commentFeignClient.getCommentInfo (id); กลับมารวมข้อมูลทั้งหมดและส่งคืน -ข้อมูลเรียกว่าจากระยะไกลแน่นอนว่าคุณสามารถเรียกมันได้ที่นี่ อีกวิธีหนึ่งคือการดำเนินการรวมในเกตเวย์ API โซลูชันนี้เป็นไปได้เช่นกัน ฉันแนะนำให้ไม่ทำในเกตเวย์ เกตเวย์ API นั้นง่ายที่สุดเท่าที่จะทำได้และไปข้างหน้าเท่านั้น การเพิ่มเลเยอร์บริการรวมเป็นตัวเลือกที่ดี
หากการกำกับดูแลบริการของคุณถูกสร้างขึ้นด้วย Dubbo เลเยอร์บริการรวมก็เป็นวิธีที่ดีกว่าเช่นกัน การรวมบริการ Dubbo ให้อินเทอร์เฟซ HTTP ไปยังการโทรภายนอก
3. ผู้โทรได้รับข้อมูลต่าง ๆ ด้วยตัวเอง
อีกวิธีหนึ่งคือเรียกอินเทอร์เฟซบล็อกอินเทอร์เฟซความคิดเห็นและส่วนต่อประสานผู้ใช้เอง ด้วยวิธีนี้อินเทอร์เฟซจำเป็นต้องให้ความสนใจกับข้อมูลของตัวเองและส่งปัญหาการประกอบให้กับผู้ใช้เท่านั้น โดยทั่วไปจะใช้น้อยกว่า เป็นการดีที่สุดที่จะส่งคืนข้อมูลไปยังผู้โทรในครั้งเดียวและเรียกมันซ้ำ ๆ โดยเฉพาะอย่างยิ่งในเทอร์มินัลมือถือซึ่งต้องใช้คำขอมากเกินไปและการรับส่งข้อมูล
สรุป
สำหรับวิธีการรวบรวมข้อมูลคุณต้องตัดสินใจด้วยตัวเอง คุณสามารถวางแอสเซมบลีในบริการธุรกิจที่เกี่ยวข้องหรือเพิ่มบริการรวมเพื่อรวบรวมแยกต่างหากหรือปล่อยให้ลูกค้ารวมตัวกันด้วยตัวเอง
บริการสามารถเรียกกันได้อย่างแน่นอน หากพวกเขาไม่สามารถถูกเรียกซึ่งกันและกันได้แล้วจุดที่แยกออกจากกันคืออะไร? ใช้ Feign เพื่อโทรหาอินเทอร์เฟซบริการและคุณเพียงแค่ถือว่าเป็นการโทรระหว่างบริการ
โอเคข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com