Stavo leggendo la documentazione di Spring Cloud Netflix quando ho scoperto un modo per condividere un'interfaccia tra un server HTTP e il suo client. Usano questo esempio per i microservizi, anche se non c'è motivo per cui non possa estendersi alla comunicazione HTTP generica:
// 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 {
}
Questo definisce un'interfaccia che viene utilizzata sia come server (The Spring lo @RestController
trasforma in un server HTTP) sia come client (The Feign @FeignClient
lo configura per l'uso del client HTTP). Le implementazioni della classe client e server possono essere utilizzate in progetti separati ma utilizzano comunque la stessa interfaccia per garantire che i tipi corrispondano.
Tuttavia, sotto l'esempio hanno messo il seguente avvertimento:
Nota: in genere non è consigliabile condividere un'interfaccia tra un server e un client. Presenta un accoppiamento stretto e in realtà non funziona con Spring MVC nella sua forma attuale (la mappatura dei parametri del metodo non viene ereditata).
OK, quindi non è ben integrato in questo momento ... ma quella parte viene dopo l'avvertimento contro la condivisione del codice e l'introduzione dell'accoppiamento tra il server e il client, che ritengono sia più importante. Perché pensano che sia una cattiva idea condividere un'interfaccia in questo modo?
Senza di essa, si perde la capacità di garantire che il server e il client si scambino reciprocamente dati comprensibili a entrambi. È possibile aggiungere un campo a uno ma non all'altro e scoprire solo la mancata corrispondenza fino al runtime. A mio avviso, non si tratta di introdurre un accoppiamento, ma semplicemente di rivelare un accoppiamento già esistente. La necessità di rendere i server completamente indipendenti è maggiore della necessità di far loro sapere quali tipi di dati riceveranno?