2011-07-26 77 views
2

我們系統的體系結構使得存在一組功能細分的RESTful子系統。許多這些子系統不僅要響應瀏覽器的請求,還要響應其他子系統。子系統間流量相對較大,需要擴展,因此決定使用序列化的Java Bean作爲此類通信的表示(由於序列化/反序列化的速度)。這又引入了具有客戶端/服務器關係的子系統之間的二進制依賴關係。通過RESTful API更改公開的Java bean的內部結構可能會影響客戶端子系統的版本兼容性。當然,改變任何內容類型的表示的結構都會有兼容性問題,但這顯然更糟糕。最小化RESTful Java生態系統中內部子系統之間依賴關係的策略

由於一個API可以爲多個客戶端提供服務,因此協調每個從屬子系統集的發佈是一個沒有吸引力的選擇。

這一定是一個常見問題,我想知道其他人如何解決/緩解?

回答

2

一種選擇可能是使用諸如protocol buffers之類的東西在子系統之間進行通信。從我所瞭解的情況來看,它們僅僅是爲了描述你所描述的那種事情而設計的,特別是在兼容版本變化方面。

+0

非常非常有趣。 – rshepherd

1

我不知道我是否正確理解你的問題。我想這是關於接口版本控制,例如一個操作和/或對象可能存在不同的版本,並使用不同的客戶端系統,讓我們說:

ClientA uses InterfaceA 
ClientB uses InterfaceA 
... 

在SOA世界中,被命名空間的不同(WSDL,XSD)版本解決了,這樣你可以實現的接口周圍的一些治理:

時間T0

ClientA uses InterfaceA.v1 
ClientB uses InterfaceA.v1 

時間T1(了InterfaceA的新版本)

ClientA uses InterfaceA.v2 
ClientB uses InterfaceA.v1 

現在,您可以實施流程以強制ClientB在某個時間點遷移到InterfaceA.v2。總的來說,這些概念是爲WS- *世界開發的,但是您也可以將它們應用到RESTful世界(我曾多次這樣做)。一篇不錯的MSFT文章:http://msdn.microsoft.com/en-us/library/ms954726.aspx

+0

我忽略了一個細節可能會有用; API不是版本化的,向後兼容性被承諾,並且在演化API時使用棄用。我知道這個頂端本身已經引起了熱烈的爭論,但至少這個問題不在我的手中。不過謝謝你的回答,這很有意思。 – rshepherd