Stavo leggendo il Spring Cloud Netflix documentazione 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 {
}
Definisce un'interfaccia che viene utilizzata sia come server (The Spring @RestController
lo trasforma in un server HTTP) sia come client (The Feign @FeignClient
lo imposta per l'utilizzo 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:
Note: It is generally not advisable to share an interface between a server and a client. It introduces tight coupling, and also actually doesn’t work with Spring MVC in its current form (method parameter mapping is not inherited).
OK, quindi non è ben integrato in questo momento ... ma quella parte viene dopo l'avvertimento contro il codice di condivisione e l'introduzione dell'accoppiamento tra il server e il client, che pensano sia più importante. Perché pensano che sia una cattiva idea condividere un'interfaccia in questo modo?
Senza di esso, si perde la possibilità di garantire che il server e il client si scambino reciprocamente i dati che possono entrambi comprendere. È possibile aggiungere un campo a uno ma non all'altro e scoprire solo la mancata corrispondenza fino al runtime. A mio avviso, non è l'accoppiamento che introduce , ma semplicemente l'accoppiamento rivelatore che esiste già. È necessario rendere i server completamente indipendenti rispetto alla necessità di far sapere loro quali tipi di dati riceveranno?