当我发现一种在HTTP服务器与其客户端之间共享接口的方法时,我正在阅读Spring Cloud Netflix文档。他们将这个示例用于微服务,尽管没有理由不能将其扩展到通用HTTP通信:
// 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 {
}
这定义了一个既用作服务器(Spring @RestController
将其转换为HTTP服务器)又用作客户端(Feign @FeignClient
将其设置为供HTTP客户端使用)的接口。服务器和客户端类的实现可以在单独的项目中使用,但仍使用相同的接口来确保类型匹配。
但是,在示例下面,他们提出了以下警告:
注意:通常不建议在服务器和客户端之间共享接口。它引入了紧密耦合,并且实际上也不能以当前形式与Spring MVC一起使用(方法参数映射不被继承)。
好的,所以它目前尚未很好地集成在一起……但是,在警告共享代码以及在服务器和客户端之间引入耦合的警告之后,他们认为这很重要。他们为什么认为以这种方式共享接口是一个坏主意?
没有它,您将无法保证服务器和客户端彼此发送它们都可以理解的数据。您可以将一个字段添加到一个字段中,但不能添加另一个字段,并且只能发现不匹配,直到运行时。在我看来,它不是在引入耦合,而只是揭示已经存在的耦合。使服务器完全独立的需求是否比让服务器知道它们将接收什么类型的数据更大?