微服務 (Microservices)
『微服務』(Microservices)最近在網路上被討論的熱度很高,我認真的K了一下,心得整理如下,如有謬誤,還請不吝指正。
『微服務』是由軟體大師Martin Fowler所提出的新系統架構風格(architectural style),原文如下:
In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery.
簡單的說,微服務架構風格就是以組合式的服務來開發一套應用系統,每一個微服務各自唯一單獨的程式,透過輕量級的HTTP API,作為彼此溝通的機制,而且它們可以獨立的佈署,自動化的更新版本。
其實看過這幾年的Web架構,會感覺是Web Services的延伸,除了原有的分散式架構外,它還隱含著幾個技術特點:
- 獨立的佈署,自動化的更新版本:透過 Docker打包,直接copy到容器執行,更新版本時再透過CI tool,自動 check out,更新。
- 輕量級的HTTP API:通常是RESTful架構,微服務之間透過JSON格式,傳遞訊息甚至觸發對方動作,藉以達到系統整合的目標。
- 利用簡單的架構,迅速開發系統,佈署到雲端上。
- 不侷限使用哪種電腦語言,也不限制僅能使用一套語言。
如此鬆散(Loose Coupling)的架構,就是要能應付變化越來越快的時代,一套複雜系統(Monolithic application)的開發時程,已不能滿足企業因應外在環境變化的需求,快速開發、簡易而自動化的佈署(DevOps),才是企業競逐市場的利器。但是,它還是有幾個老問題要解決:
- 權限控管(Authenntication、Authorization、Auditing):微服務如何做到單一登入(Single Sign On),是開發時要解決的首要課題。
- 系統整合(System Integraion):包括簡單的資料交換,進而跨微服務的流程控管,甚至微服務間的交易控制(Transaction Control),交易控制必須跨系統、跨資料庫、甚至可能使用到NoSQL資料庫,如何確保交易資料的完整性,是一大挑戰。
- 微服務的監控(Monitoring and Control):如何透過一有效的平台,監看所有微服務的運行,包括控制微服務的停止、開啟或暫停,因為一套完整的系統被切分眾多的微服務,要隨時確認每一個微服務都在正常的狀態運行,勢必需要一套監控的工具,另外,版本的控制與更新也必須自動化,這也就是CI(Continous Integration)的訴求。
- 主機的負荷:一台主機可能佈署幾十個,甚至上百個微服務,每一個微服務都是Docker打包的虛擬環境,加總起來,CPU、記憶體的需求會很大,如何確保主機不會負荷過重,也是一個重要的課題。
目前微服務的開發與建置大都採用 Linux + Docker + Java + Spring Bot + NoSQL (e.g. MongoDB) 組合,也可以佈署到雲端,例如Amazon AWS或 Google都提供 Docker container repository service,可以節省自己架構環境的時間與$$$$$$。
引用:
-
Microservices, http://martinfowler.com/articles/microservices.html
-
Pattern: Microservices Architecture, http://microservices.io/patterns/microservices.html
-
Microservices 微服務, http://blog.maxkit.com.tw/2015/07/microservices.html
-
BUILDING A MICROSERVICE ARCHITECTURE WITH SPRING BOOT AND DOCKER, http://www.3pillarglobal.com/insights/building-a-microservice-architecture-with-spring-boot-and-docker-part-i