《輕量級微服務架構》讀書筆記

微服務架構要求:

  • 根據業務模塊劃分服務種類
  • 每一個服務可獨立部署且互相隔離
  • 經過輕量級API調用服務
  • 服務需保證良好的高可用

微服務技術選型:

  • 使用Spring Boot開發服務
  • 使用Node.js做爲服務網關反向代理調用服務
  • 使用Zookeeper註冊發現服務
  • 使用Docker封裝/部署/隔離服務
  • 使用Jenkins構建發佈服務

輸入圖片說明

Spring Boot

Spring4.0推薦使用Java代碼和註解方式做爲配置(去xml),Spring Boot遵循相關理念且採用4.0相關特性和技術,集成了主流組件,可建立一個內嵌Servlet容器的jar獨立運行,且提供生產級特性(服務治理)。node

Node.js

Node.js是基於ChromeV8引擎的Javascript運行環境,它使用「事件驅動」且「異步非I/O」的模型使其輕量且高效,Node.js的包管理器NPM是全球最大的開源庫生態系統。docker

Node.js是運行環境,而非Javascript類庫和框架,NPM與Java的Maven殊途同歸,事件驅動把事件加入隊列中輪訓。Node.js採用單線程模型,適用於I/O密集型應用(高併發網站)。緩存

Node.js內置HTTP服務器(模塊),性能和穩定性與Nginx不分伯仲。且模塊體系強大,好比Web框架Express,Web Socket服務Scocket.IO,命令行工具Commander.js,Http代理服務器node-http-proxy Node.js性能不亞於Nginx,但擴展性高於Nginx,能夠動態指定被代理的目標地址,並執行反向代理操做,調用微服務REST API。安全

微服務網關提供反向代理與服務發現,還應具有安全認證,性能監控,數據緩存,請求分片,靜態相應等特性。服務器

Zookeeper

提供分佈式環境下的協調服務,分佈式應用可基於它實現數據發佈與訂閱,負載均衡,命名服務,分佈式協調與通知,集羣管理,領導選舉,分佈式鎖,分佈式隊列等。架構

Zookeeper包含五個特性併發

  • 順序性:從同一個客戶端發送的請求,嚴格按照發送順序
  • 原子性:如同事務的原子性,集羣中全部機器要麼都處理或者都不處理
  • 單一性:客戶端不管連到哪一個服務器,看到的數據據模型都一致。Zookeeper服務器之間可高效進行數據同步
  • 可靠性:服務端數據發生變化會當即存儲,除非另外一請求修改數據,不然數據必定可靠
  • 實時性:當請求被成功處理後,客戶端會馬上獲取服務端的最新數據

Zookeeper內部擁有一個樹狀的內存模型,相似於文件系統,有若干目錄,目錄下有若干文件,統稱爲ZNodeZNode可由Zookeeper客戶端建立,客戶端與服務端創建鏈接後,服務端爲客戶端建立一個Session,客戶端對ZNode的操做均在這個Session中。負載均衡

ZNode有四類節點:框架

ZNode類型 說明
Persistent(持久節點) 當會話結束後,該節點不會被刪除
Persistent Sequential (持久順序節點) 當會話結束後,該節點不會被刪除,且節點名中帶自增數後綴
Ephemeral (臨時節點) 當會話結束後,該節點會被刪除
Ephemeral Sequential (臨時順序節點) 當會話結束後,該節點會被刪除,且節點名中帶自增數後綴

Zookeeper參考了經典的分佈式一致性協議Paxos協議,設計了更輕量級的協議Zab(Zookeeper Atomic Broadcat,Zookeeper原子廣播協議)。異步

Zab分爲兩個階段:Leader Election(領導選舉)與Atomic Boardcast(原子廣播)。

啓動時會選舉出一個Leader,其餘節點Follower,當Leader節點處故障,則自動選舉出新的Leader,並讓全部節點恢復到一個正常狀態。而後經過原子廣播,同步Leader和Follower數據。 全部寫操做都發送到Leader節點,並經過廣播同步到Follower節點。 Zookeeper集羣中各個節點會互相通訊,確保存活,超過半數節點就能夠正常對外提供服務,所以通常提供奇數個節點。客戶端可鏈接任意節點,且與某節點斷開後,會自動鏈接到其餘節點。

啓動Spring Boot服務並註冊到Zookeeper中,依次判斷並建立節點 根節點(持久節點)-服務節點(持久節點)-地址節點(臨時順序節點)。

Node.js經過node-zookeeper-client鏈接Zookeeper,獲取服務地址,執行反向代理。

輸入圖片說明

Docker

Docker引擎(Docker Engine):可理解爲一個運行在服務器上的後臺進程,本質上是一個服務,啓動後,咱們能夠經過發送Docker命令與之通訊

Docker客戶端(Docker Client):分爲Docker命令客戶端和Rest API客戶端

Docker鏡像(Docker Images):如同光盤刻錄數據後,放入光驅中讀取數據。咱們將程序打包到鏡像中,將其載入到Docker引擎中運行

Docker容器(Docker Containers):運行Docker鏡像,會啓動一個Docker容器,該容器中運行鏡像中封裝的程序。若是將鏡像理解爲Java類,容器至關於Java實例。同一個鏡像理論上可運行無數個Docker容器

Docker鏡像註冊中心(Docker Registry):官方提供了Docker Hub的鏡像註冊中心,用於存放公開和私有的Docker鏡像倉庫(Docker Repository)。咱們能夠用Docker Hub中下載鏡像和上傳鏡像。

Docker的四大特色:

  • 快速運行:啓動虛擬機須要幾分鐘,啓動Docker容器僅需幾秒
  • 節省資源:Docker容器運行在Docker引擎上,可利用宿主機硬件資源,無需佔用過多系統開銷
  • 便於交付:傳統軟件交付的程序,Docker時代交付的是鏡像,鏡像不只封裝了程序,也包含了程序運行的環境
  • 容易管理:可經過Docker客戶端直接操做Docker引擎,方便管理Docker鏡像與容器。

Docker提供了Dockerfile的腳本文件,經過一些指令,可快速編寫鏡像的構建腳本,從而讓構建進行作到自動化。

Spring Boot項目中,能夠添加Dockerfile文件,並經過docker-maven-plugin插件,構建Docker鏡像並Push到倉庫。

mvn docker:build 可在target目錄下生成docker目錄,包含classes目錄全部文件,打包jar,Dockerfile。docker-maven-plgin插件在這個目錄下執行docker bulid命令來構建鏡像。

Jenkins

是一款持續集成軟件,可鏈接代碼倉庫,從中獲取源碼並執行自動構建,構建完畢後還可執行後續任務,好比:生成單元測試報告,歸檔程序包,部署程序包到Maven倉庫,發送郵件通知等。Jenkins支持一主多從,構建任務可並行在多臺Slave機器上。

Jenkins可配置構建觸發器,並容許咱們在「構建前」或「構建後」添加執行的Shell腳本。

  1. 開發人員將源碼推送至Gitlib,隨後觸發Jenkins構建任務
  2. Jenkins調用Maven進行構建,編譯生成jar包
  3. 根據構建過程,生成一個Docker鏡像,並推送至局域網的Docker Registry
  4. 根據生成的鏡像,運行一個Docker容器

除此以外,微服務架構還涉及:微服務日誌,微服務安全,服務監控,微服務測試,微服務通訊,微服務治理等。

相關文章
相關標籤/搜索