Je lisais la documentation de Spring Cloud Netflix lorsque j'ai découvert un moyen de partager une interface entre un serveur HTTP et son client. Ils utilisent cet exemple pour les microservices, bien qu'il n'y ait aucune raison pour qu'il ne puisse pas s'étendre à la communication HTTP générique:
// 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 {
}
Cela définit une interface qui est utilisée à la fois comme serveur (The Spring le @RestController
transforme en serveur HTTP) et comme client (The Feign la @FeignClient
configure pour une utilisation client HTTP). Les implémentations de classe serveur et client peuvent être utilisées dans des projets distincts mais utilisent toujours la même interface pour garantir la correspondance des types.
Cependant, sous l'exemple, ils ont mis la mise en garde suivante:
Remarque: Il n'est généralement pas conseillé de partager une interface entre un serveur et un client. Il introduit un couplage étroit et ne fonctionne pas réellement avec Spring MVC dans sa forme actuelle (le mappage des paramètres de méthode n'est pas hérité).
OK, donc ce n'est pas bien intégré en ce moment ... mais cette partie vient après l'avertissement contre le partage de code et l'introduction du couplage entre le serveur et le client, ce qu'ils pensent être plus important. Pourquoi pensent-ils que c'est une si mauvaise idée de partager une interface de cette façon?
Sans cela, vous perdez la possibilité de garantir que le serveur et le client s'envoient mutuellement des données qu'ils peuvent tous deux comprendre. Vous pouvez ajouter un champ à l'un mais pas à l'autre et découvrir uniquement la non-concordance jusqu'à l'exécution. À mon avis, il ne s'agit pas d' introduire un couplage, mais simplement de révéler un couplage qui existe déjà. La nécessité de rendre les serveurs complètement indépendants est-elle supérieure à la nécessité de leur faire savoir quels types de données ils recevront?