Eu estava lendo a documentação do Spring Cloud Netflix quando descobri uma maneira de compartilhar uma interface entre um servidor HTTP e seu cliente. Eles usam este exemplo para microsserviços, embora não haja motivo para que ele não possa se estender à comunicação HTTP genérica:
// 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 {
}
Isso define uma interface que é usada como servidor (o Spring o @RestController
transforma em servidor HTTP) e como cliente (o Feign o @FeignClient
configura para uso do cliente HTTP). As implementações de classe de servidor e cliente podem ser usadas em projetos separados, mas ainda usam a mesma interface para garantir que os tipos correspondam.
No entanto, abaixo do exemplo, eles colocam a seguinte ressalva:
Nota: geralmente não é aconselhável compartilhar uma interface entre um servidor e um cliente. Ele apresenta acoplamento rígido e, na verdade, também não funciona com o Spring MVC em sua forma atual (o mapeamento de parâmetros do método não é herdado).
OK, então não está bem integrado no momento ... mas essa parte vem após o aviso contra o compartilhamento de código e a introdução do acoplamento entre o servidor e o cliente, o que eles acham mais importante. Por que eles acham que é uma má idéia compartilhar uma interface dessa maneira?
Sem ele, você perde a capacidade de garantir que o servidor e o cliente enviem dados uns aos outros que eles possam entender. Você pode adicionar um campo a um, mas não ao outro, e descobrir apenas a incompatibilidade até o tempo de execução. Na minha opinião, não está introduzindo acoplamento, mas apenas revelando o acoplamento que já existe. A necessidade de tornar os servidores completamente independentes é maior do que a necessidade de informar quais tipos de dados eles receberão?