Estaba leyendo la documentación de Spring Cloud Netflix cuando descubrí una forma de compartir una interfaz entre un servidor HTTP y su cliente. Usan este ejemplo para microservicios, aunque no hay ninguna razón por la cual no se puede extender a la comunicación 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 {
}
Esto define una interfaz que se usa como un servidor (The Spring lo @RestControllerconvierte en un servidor HTTP) y un cliente (The Feign @FeignClientlo configura para el uso del cliente HTTP). Las implementaciones de clase de servidor y cliente se pueden usar en proyectos separados, pero aún usan la misma interfaz para garantizar que los tipos coincidan.
Sin embargo, debajo del ejemplo ponen la siguiente advertencia:
Nota: Por lo general, no es recomendable compartir una interfaz entre un servidor y un cliente. Introduce un acoplamiento estrecho y, en realidad, tampoco funciona con Spring MVC en su forma actual (el mapeo de parámetros del método no se hereda).
Bien, no está bien integrado en este momento ... pero esa parte viene después de la advertencia de no compartir código e introducir el acoplamiento entre el servidor y el cliente, lo que creen que es más importante. ¿Por qué piensan que es una mala idea compartir una interfaz de esta manera?
Sin él, pierde la capacidad de garantizar que el servidor y el cliente se envíen datos que ambos puedan entender. Puede agregar un campo a uno pero no al otro y solo descubrir la falta de coincidencia hasta el tiempo de ejecución. En mi opinión, no está introduciendo el acoplamiento, sino simplemente revelando el acoplamiento que ya existe. ¿Es la necesidad de hacer que los servidores sean completamente independientes más que la necesidad de hacerles saber qué tipos de datos recibirán?