RESTful Java生态系统中最小化内部子系统之间依赖关系的策略

RESTful Java生态系统中最小化内部子系统之间依赖关系的策略,java,web-services,rest,Java,Web Services,Rest,我们系统的架构是这样的,即有一组功能细分的RESTful子系统。这些子系统中的许多不仅要响应浏览器的请求,还要响应其他子系统。子系统间的通信量相对较大,需要扩展,因此决定使用序列化的JavaBean作为这种通信类型的表示(由于序列化/反序列化的速度)。这又在具有客户机/服务器关系的子系统之间引入了二进制依赖关系。更改通过restfulapi公开的javabean的内部结构可能会导致与客户机子系统的版本兼容性问题。当然,更改任何内容类型的表示结构都会有兼容性问题,但这显然更糟 由于一个API可以服

我们系统的架构是这样的,即有一组功能细分的RESTful子系统。这些子系统中的许多不仅要响应浏览器的请求,还要响应其他子系统。子系统间的通信量相对较大,需要扩展,因此决定使用序列化的JavaBean作为这种通信类型的表示(由于序列化/反序列化的速度)。这又在具有客户机/服务器关系的子系统之间引入了二进制依赖关系。更改通过restfulapi公开的javabean的内部结构可能会导致与客户机子系统的版本兼容性问题。当然,更改任何内容类型的表示结构都会有兼容性问题,但这显然更糟

由于一个API可以服务于多个客户机,所以协调每一组依赖子系统的发布是一个不吸引人的选择


这一定是一个常见的问题,我想知道其他人是如何解决/缓解的?

一种选择可能是使用以下方式在子系统之间进行通信。据我所知,它们正是为您所描述的那种事情而设计的,特别是在进行兼容版本更改方面。

我不确定是否正确理解了您的问题。我想这是关于接口版本控制的,例如,一个操作和/或对象可能存在于不同的版本中,并被不同的客户端系统使用,比如:

ClientA uses InterfaceA
ClientB uses InterfaceA
...
在SOA世界中,它是通过对不同(WSDL、XSD)版本命名来解决的,这样您就可以围绕接口实现一些治理:

时间t0

ClientA uses InterfaceA.v1
ClientB uses InterfaceA.v1
时间t1(InterfaceA的新版本)


现在,您可以实施流程,强制
ClientB
在某个时间点迁移到
InterfaceA.v2
。一般来说,这些概念是为WS-*世界开发的,但是您也可以将它们应用于RESTful世界(我做过几次)。一篇很好的MSFT文章:。

一个我忽略了的细节,它会很有用;API没有版本控制,保证了向后兼容性,并且在开发API时使用了弃用。我知道这件上衣本身就引起了激烈的争论,但至少这一点是我无法控制的。谢谢你的回答,这很有趣。
ClientA uses InterfaceA.v2
ClientB uses InterfaceA.v1