Я читал документацию Spring Cloud Netflix, когда узнал о способе обмена интерфейсами между HTTP-сервером и его клиентом. Они используют этот пример для микросервисов, хотя нет никаких причин, по которым он не может распространяться на обычную связь 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 в его текущей форме (отображение параметров метода не наследуется).
ОК, так что это не очень хорошо интегрированы прямо сейчас ... но эта часть приходит после того, как предупреждение против обмена кода и введения соединения между сервером и клиентом, который по их мнению , является более важным. Почему они думают, что такой интерфейс - плохая идея?
Без этого вы потеряете возможность гарантировать, что сервер и клиент отправляют друг другу данные, которые они оба могут понять. Вы можете добавить поле к одному, но не к другому и обнаруживать несоответствие только до времени выполнения. На мой взгляд, это не введение связи, а просто выявление связи, которая уже существует. Является ли необходимость сделать серверы полностью независимыми больше, чем необходимость сообщать им, какие типы данных они будут получать?