ฉันอ่านเอกสารSpring Cloud Netflixเมื่อฉันค้นพบวิธีแชร์อินเทอร์เฟซระหว่างเซิร์ฟเวอร์ HTTP และไคลเอนต์ พวกเขาใช้ตัวอย่างนี้สำหรับ microservices แม้ว่าจะไม่มีเหตุผลว่าทำไมมันถึงขยายไปยังการสื่อสาร HTTP ทั่วไปไม่ได้:
// The shared interface, in a common library
public interface UserService {
@RequestMapping(method = GET, value = "/users/{id}")
User getUser(@PathVariable long id);
}
// The controller, on the server
@RestController
public class UserResource implements UserService {
}
// The same interface used for the client
@FeignClient("users")
public interface UserClient extends UserService {
}
สิ่งนี้นิยามอินเตอร์เฟสที่ถูกใช้เป็นทั้งเซิร์ฟเวอร์ (The Spring @RestController
เปลี่ยนเป็นเซิร์ฟเวอร์ HTTP) และไคลเอ็นต์ (The Feign @FeignClient
ตั้งค่าสำหรับการใช้ไคลเอ็นต์ HTTP) การใช้งานคลาสเซิร์ฟเวอร์และไคลเอนต์สามารถใช้ในโครงการแยกต่างหาก แต่ยังคงใช้อินเทอร์เฟซเดียวกันเพื่อให้แน่ใจว่าตรงกับชนิด
อย่างไรก็ตามภายใต้ตัวอย่างพวกเขาใส่ข้อแม้ต่อไปนี้:
หมายเหตุ:โดยทั่วไปจะไม่แนะนำให้แชร์อินเตอร์เฟสระหว่างเซิร์ฟเวอร์และไคลเอ็นต์ มันแนะนำการมีเพศสัมพันธ์อย่างแน่นหนาและจริง ๆ แล้วไม่ได้ทำงานกับ Spring MVC ในรูปแบบปัจจุบัน
ตกลงดังนั้นตอนนี้ยังไม่ได้รวมกันเป็นอย่างดี ... แต่ส่วนนั้นเกิดขึ้นหลังจากคำเตือนรหัสการแชร์และการแนะนำการเชื่อมต่อระหว่างเซิร์ฟเวอร์และไคลเอนต์ซึ่งพวกเขาคิดว่าสำคัญกว่า ทำไมพวกเขาคิดว่าเป็นความคิดที่ไม่ดีที่จะแบ่งปันอินเทอร์เฟซด้วยวิธีนี้
หากไม่มีคุณจะสูญเสียความสามารถในการรับประกันว่าเซิร์ฟเวอร์และไคลเอนต์จะส่งข้อมูลซึ่งกันและกันซึ่งพวกเขาสามารถเข้าใจได้ คุณสามารถเพิ่มฟิลด์หนึ่งไปยังอีกฟิลด์หนึ่ง แต่ไม่ใช่ฟิลด์อื่นและค้นพบว่าไม่ตรงกันจนกว่าจะถึงเวลาจริง ในใจของฉันมันไม่ได้แนะนำการมีเพศสัมพันธ์ แต่เพียงเปิดเผยการมีเพศสัมพันธ์ที่มีอยู่แล้ว จำเป็นที่จะต้องทำให้เซิร์ฟเวอร์เป็นอิสระโดยสมบูรณ์มากกว่าความต้องการที่จะให้พวกเขารู้ว่าพวกเขาจะได้รับข้อมูลประเภทใด?