目錄
在這篇文章中我們將討論三個流行詞匯API、SOA、ESB。
模塊
目前公認的解決復雜系統構建的方法是模塊化。模塊化的目的是產生功能內聚而單一的功能單元,以方便測試、部署和重用。
在拆分了模塊之后,模塊之間該如何通訊呢?
這個時候我想大家都聽說過SOA這個詞,SOA這個玄乎的詞匯任何搞架構的人都會有自己的理解,下面說說我的理解。
API
有了模塊之后,那么模塊對于外界來講是一個什么東西呢?這個時候另外一個流行詞匯API閃亮登場了。所以我們可以如下定義模塊:模塊是一個功能單元,通過對外暴露API來提供服務。
有了上述抽象的定義,接下來我們不得不面對如何在真實的系統中實現模塊的問題。在一個Java系統中,一個模塊通常就是一個jar文件,而API則是Java Class上面的方法構成。等等,如果是這樣,我們的界面如何來調用這些API呢?要知道我們的界面是完全在瀏覽器中運行的應用,與服務器端通訊的唯一方式就是Ajax + JSON。
好吧,我們需要包裝一些Restful Web Services。這個簡單,Resteasy或者Spring MVC輕松搞定。
好了,搞定上述這些之后,我們終于可以部署我們的模塊了。打包成一個war,放到Tomcat下面,然后配置一下Tomcat端口等等。
Service Registry & Discovery
就這樣,我們創建了很多模塊,把它們部署到不同的Tomcat實例當中,so far so good。可是如果這樣的話,我就需要記住每個服務到底是由那個Tomcat實例提供的,這個豈不是很麻煩?沒問題,我們需要一個Service Registry,把提供服務的Tomcat實例的地址和端口與它們相應的模塊記錄在一個公共的地方,這樣的話,我們需要某個模塊的時候,我們就只需要詢問Service Registry就行啦。
搞定了Service Discovery問題之后,如果要上生產,我們得考慮一下性能和擴展性問題了。假設模塊A提供了一個流行的API,很多人都要調用它,我們可以在不同的機器上面部署該模塊的多個實例,然后在前面在放置一個反向代理。
ESB
等等,運營部的同事來找你了,你們搞這么多Tomcat實例,讓我們怎么管理啊。好吧,讓我們添加一些監控和性能指標和日志收集的能力,在弄一個dashboard。
寫到這里,估計很多朋友都在嘀咕了,搞這么麻煩,實現起來是不是很復雜啊,答案是肯定的。ESB這個東西該閃亮登場了。IBM、Oracle、JBoss的顧問肯定會說,這些需求我們的ESB產品都能提供啊,而且還能提供更多,比如多協議支持,路由,消息轉換等等。
ESB到底是什么?不是一句話能夠講清楚的,簡單來講,它是實現SOA架構的一種策略,但是記住,這絕對不是唯一的方法。而且絕大部分ESB產品都過于復雜,提供一堆你永遠用不到的功能。如果你問我們公司核心系統的人ESB是什么,他們會說不就是一個用來調用SOAP Web Service的東東嘛,好吧,聽完這個,我想說如果是調用SOAP Web Services,直接用CXF或者JAX-WS不就行了,干嘛還用ESB,這不是殺雞用牛刀嘛。