Ⅰ 如何快速搭建一個微服務架構
什麼是微服務?
微服務(Microservices Architecture)是一種架構風格,一個大型復雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。
微服務的概念源於2014年3月Martin Fowler所寫的文章「Microservices」 martinfowler.com/articles/mi…
單體架構(Monolithic Architecture )
企業級的應用一般都會面臨各種各樣的業務需求,而常見的方式是把大量功能堆積到同一個單體架構中去。比如:常見的ERP、CRM等系統都以單體架構的方式運行,同時由於提供了大量的業務功能,隨著功能的升級,整個研發、發布、定位問題,擴展,升級這樣一個「怪物」系統會變得越來越困難。
這種架構模式就是把應用整體打包部署,具體的樣式依賴本身應用採用的語言,如果採用java語言,自然你會打包成war包,部署在Tomcat或者Jetty這樣的應用伺服器上,如果你使用spring boot還可以打包成jar包部署。其他還有Rails和Node.js應用以目錄層次的形式打包
上圖:單體架構
大部分企業通過SOA來解決上述問題,SOA的思路是把應用中相近的功能聚合到一起,以服務的形式提供出去。因此基於SOA架構的應用可以理解為一批服務的組合。SOA帶來的問題是,引入了大量的服務、消息格式定義和規范。
多數情況下,SOA的服務直接相互獨立,但是部署在同一個運行環境中(類似於一個Tomcat實例下,運行了很多web應用)。和單體架構類似,隨著業務功能的增多SOA的服務會變得越來越復雜,本質上看沒有因為使用SOA而變的更好。圖1,是一個包含多種服務的在線零售網站,所有的服務部署在一個運行環境中,是一個典型的單體架構。
單體架構的應用一般有以下特點:
微服務架構(Microservices Architecture)
微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務運行在自己的進程中,開發和發布都沒有依賴。不同服務通過一些輕量級交互機制來通信,例如 RPC、HTTP 等,服務可獨立擴展伸縮,每個服務定義了明確的邊界,不同的服務甚至可以採用不同的編程語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模塊轉變成不同的服務!而且服務可以使用不同的技術加以實現!
上圖:微服務架構
微服務設計
那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:
微服務消息
在單體架構中,不同功能之間通信通過方法調用,或者跨語言通信。SOA降低了這種語言直接的耦合度,採用基於SOAP協議的web服務。這種web服務的功能和消息體定義都十分復雜,微服務需要更輕量的機制。
同步消息 REST
同步消息就是客戶端需要保持等待,直到伺服器返回應答。REST是微服務中默認的同步消息方式,它提供了基於HTTP協議和資源API風格的簡單消息格式,多數微服務都採用這種方式(每個功能代表了一個資源和對應的操作)
非同步消息 – AMQP, STOMP, MQTT
非同步消息就是客戶端不需要一直等待服務應答,有應到後會得到通知。某些微服務需要用到非同步消息,一般採用AMQP, STOMP, MQTT 這三種通訊協議
消息格式 – JSON, XML, Thrift, ProtoBuf, Avro
消息格式是微服務中另外一個很重要的因素。SOA的web服務一般採用文本消息,基於復雜的消息格式(SOAP)和消息定義(xsd)。微服務採用簡單的文本協議JSON和XML,基於HTTP的資源API風格。如果需要二進制,通過用到Thrift, ProtoBuf, Avro。
服務約定 – 定義介面 – Swagger, RAML, Thrift IDL
如果把功能實現為服務,並發布,需要定義一套約定。單體架構中,SOA採用WSDL,WSDL過於復雜並且和SOAP緊耦合,不適合微服務。
REST設計的微服務,通常採用Swagger和RAML定義約定。
對於不是基於REST設計的微服務,比如Thrift,通常採用IDL(Interface Definition Languages),比如Thrift IDL。
微服務集成 (服務間通信)
大部分微服務基於RPC、HTTP、JSON這樣的標准協議,集成不同標准和格式變的不再重要。另外一個選擇是採用輕量級的消息匯流排或者網關,有路由功能,沒有復雜的業務邏輯。下面就介紹幾種常見的架構方式。
點對點方式
點對點方式中,服務之間直接用。每個微服務都開放REST API,並且調用其它微服務的介面。
上圖:通過點對點方式通信
很明顯,在比較簡單的微服務應用場景下,這種方式還可行,隨著應用復雜度的提升,會變得越來越不可維護。這點有些類似SOA的ESB,盡量不採用點對點的集成方式。
API-網關方式
API網關方式的核心要點是,所有的客戶端和消費端都通過統一的網關接入微服務,在網關層處理所有的非業務功能個。通常,網關也是提供REST/HTTP的訪問API。服務端通過API-GW注冊和管理服務。
上圖:通過API-網關暴露微服務
所有的業務介面通過API網關暴露,是所有客戶端介面的唯一入口。微服務之間的通信也通過API網關。
採用網關方式有如下優勢:
目前,API網關方式應該是微服務架構中應用最廣泛的設計模式。
消息代理方式
微服務也可以集成在非同步的場景下,通過隊列和訂閱主題,實現消息的發布和訂閱。一個微服務可以是消息的發布者,把消息通過非同步的方式發送到隊列或者訂閱主題下。作為消費者的微服務可以從隊列或者主題共獲取消息。通過消息中間件把服務之間的直接調用解耦。
上圖:非同步通信方式
通常非同步的生產者/消費者模式,通過AMQP, STOMP, MQTT 等非同步消息通訊協議規范。
數據的去中心化
單體架構中,不同功能的服務模塊都把數據存儲在某個中心資料庫中。
每個微服務有自己私有的資料庫,其它微服務不能直接訪問。單體架構,用一個資料庫存儲所有數據
微服務方式,多個服務之間的設計相互獨立,數據也應該相互獨立(比如,某個微服務的資料庫結構定義方式改變,可能會中斷其它服務)。因此,每個微服務都應該有自己的資料庫。
每個微服務有自己私有的資料庫,其它微服務不能直接訪問。每個微服務有自己私有的資料庫,其它微服務不能直接訪問。
數據去中心話的核心要點:
數據的去中心化,進一步降低了微服務之間的耦合度,不同服務可以採用不同的資料庫技術(sql、NoSQL等)。在復雜的業務場景下,如果包含多個微服務,通常在客戶端或者中間層(網關)處理。
微服務架構的優點:
微服務架構的缺點:
微服務的一些想法在實踐上是好的,但當整體實現時也會呈現出其復雜性。
關於微服務架構的取捨
Ⅱ 第三方軟體使用的MQTT協議,能向雲端伺服器要數據嗎如果可以該怎麼做
可以的
MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網路的遠程感測器和控制設備通訊而設計的協議,國內很多企業都廣泛使用MQTT作為Android手機客戶端與伺服器端推送消息的協議.
Ⅲ Java項目:mqtt發送的數據如何保存到資料庫里
循環遍歷set的元素,通過java.sql.PreparedStatement的setObject方法將set的元素按順序放入預編譯的參數化SQL中