Tôi đang đọc tài liệu Spring Cloud Netflix khi tôi tìm hiểu về cách chia sẻ giao diện giữa máy chủ HTTP và máy khách của nó. Họ sử dụng ví dụ này cho microservice, mặc dù không có lý do nào khiến nó không thể mở rộng sang giao tiếp HTTP chung:
// 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 {
}
Điều này xác định một giao diện được sử dụng cho cả máy chủ (Spring @RestController
biến nó thành máy chủ HTTP) và máy khách (Fict @FeignClient
thiết lập giao diện đó cho việc sử dụng máy khách HTTP). Việc triển khai lớp máy chủ và máy khách có thể được sử dụng trong các dự án riêng biệt nhưng vẫn sử dụng cùng một giao diện để đảm bảo rằng các loại khớp với nhau.
Tuy nhiên, bên dưới ví dụ họ đặt cảnh báo sau:
Lưu ý: Thông thường không nên chia sẻ giao diện giữa máy chủ và máy khách. Nó giới thiệu khớp nối chặt chẽ và thực tế cũng không hoạt động với Spring MVC ở dạng hiện tại (ánh xạ tham số phương thức không được kế thừa).
OK, vì vậy nó không được tích hợp tốt ngay bây giờ ... nhưng phần đó xuất hiện sau cảnh báo chống lại việc chia sẻ mã và giới thiệu khớp nối giữa máy chủ và máy khách, điều mà họ cho là quan trọng hơn. Tại sao họ nghĩ rằng đó là một ý tưởng tồi để chia sẻ một giao diện theo cách này?
Không có nó, bạn sẽ mất khả năng đảm bảo rằng máy chủ và máy khách gửi cho nhau dữ liệu mà cả hai có thể hiểu được. Bạn có thể thêm một trường vào một nhưng không phải trường khác và chỉ khám phá sự không phù hợp cho đến khi thời gian chạy. Theo suy nghĩ của tôi, nó không giới thiệu khớp nối, mà chỉ tiết lộ khớp nối đã tồn tại. Có phải nhu cầu làm cho máy chủ hoàn toàn độc lập lớn hơn nhu cầu cho họ biết loại dữ liệu nào họ sẽ nhận được không?