隨著微服務架構的普及,如何有效地佈署和管理大量的微服務成為一個關鍵挑戰。容器化技術,特別是 Docker,提供了一個輕量級且可移植的解決方案。本文將以一個幫助台應用程式為例,探討如何利用 Docker 和 DC/OS 叢集構建一個可擴充套件且高可用性的微服務架構。首先,我們會將應用程式拆分成多個獨立的微服務,例如產品目錄、票務系統和搜尋服務。接著,我們會使用 Dockerfile 定義每個微服務的執行環境,並構建 Docker 映像檔。然後,我們將使用 DC/OS 叢集作為佈署平台,利用 Marathon 進行微服務的佈署和管理,並透過 Marathon-LB 實作負載平衡。最後,我們將驗證整個系統的運作,並探討如何根據實際需求進行彈性擴充套件。
第13章:容器化幫助台應用程式案例研究
在第12章「遷移到微服務的案例研究」中,我們根據需求和整本文所學的標準建立了三個微服務。下一個問題是,如何擴充套件這個模型?在現實世界中,大型應用程式可能擁有數百到數千個微服務。在本章中,我們利用對Docker容器的瞭解來按需佈署和擴充套件微服務。
容器化微服務
在本文中,我們將容器化第12章中建立的產品目錄微服務。根據我們目前的知識,容器化微服務涉及以下步驟:
- 列出每個微服務所需的依賴項。
- 編譯微服務所需的二進位檔案、WAR檔案等。
- 建立一個包含前兩步驟內容的Docker映像檔。
- 使用步驟3中建立的映像檔啟動一個或多個容器。
內容解密:
上述步驟是容器化微服務的基本流程。讓我們逐一分析每一步的作用和邏輯:
- 列出依賴項:這一步驟確保我們瞭解每個微服務正常執行所需的外部依賴,例如資料函式庫連線、第三方API等。
- 編譯二進位檔案或WAR檔案:這一步驟涉及將微服務的原始碼編譯成可執行的格式,例如Java的WAR檔案。
- 建立Docker映像檔:透過Dockerfile定義如何構建包含微服務及其依賴項的映像檔。這使得微服務的佈署變得標準化和可重複。
- 啟動容器:使用建立的Docker映像檔,可以輕鬆地在不同環境中啟動一個或多個容器例項,從而實作微服務的快速佈署和擴充套件。
// 一個簡單的Dockerfile範例,用於構建Java微服務映像檔
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/microservice.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
內容解密:
這個Dockerfile範例展示瞭如何構建一個Java微服務的Docker映像檔。主要步驟包括:
- 使用
openjdk:8-jdk-alpine作為基礎映像檔,確保Java執行環境。 - 將編譯好的JAR檔案複製到映像檔中,並重新命名為
app.jar。 - 定義容器啟動時執行的命令,即執行
app.jar。
單體式應用程式的變更
我們的單體式應用程式部分將繼續按原樣執行,但我們將對其進行適當的更改,以便與容器化的微服務部分進行互動。
微服務的優勢
透過將應用程式遷移到微服務架構並容器化,我們能夠更有效地解決單體式架構面臨的挑戰,包括:
- 選擇性擴充套件:每個微服務都可以獨立擴充套件,無需擴充套件整個應用程式。
- 容錯性:單個微服務的故障不會導致整個應用程式當機。
將幫助台應用程式容器化:案例研究
列出依賴項
要執行產品目錄微服務,需要以下軟體(依賴項):
- Tomcat:執行應用程式(產品目錄)程式碼
- Java:Tomcat 正常執行的依賴項
- MySQL 聯結器:Tomcat 連線到 MySQL 的依賴項
- Apache Maven:安裝在構建微服務的系統上(參考:https://maven.apache.org/install.html)
編譯二進位制檔案和 WAR 檔案
識別執行目錄微服務所需的依賴軟體後,下一步是取得 WAR 檔案(二進位制檔案)本身。請按照以下步驟構建並生成目錄微服務的 WAR 檔案。
首先,從 GitHub 倉函式庫克隆我們的目錄微服務程式碼:https://github.com/kocherMSD/Helpdesk_Microservices.git。
由於我們正在構建第一個微服務,因此應該利用最新的工具集。在這種情況下,我們使用 Apache Maven 而不是 Apache Ant(像我們在單體式應用程式中那樣)來構建 WAR 檔案,因為 Maven 是一個更先進的構建自動化工具。例如,它還會下載專案所需的函式庫依賴項。
下一步是驗證 Apache POM 檔案是否位於克隆程式碼的根目錄中。POM 檔案包含依賴項,例如 Java Runtime 版本、Maven 中央倉函式庫資訊和所需的 JAR 檔案列表。
如果一切就緒,下一步是構建 WAR 檔案。在專案根目錄下的命令列中執行 mvn install,或在 Eclipse 編輯器中右鍵點選 POM 檔案並選擇 mvn install。根目錄下應該會建立一個名為 Target 的資料夾,其中包含 WAR 檔案。
建立 Docker 映像
讓我們看看如何為產品目錄服務建立 Docker 映像。為其他微服務(如票務系統)建立映像的方法相同,只是您需要包含所選微服務的適當二進位制檔案和環境依賴項。
正如我們在前面的章節中所學到的,建立 Docker 映像的正確方法是透過 Dockerfile,其中包括所有前面提到的依賴項。構建該 Dockerfile 將為我們提供佈署服務所需的映像。
讓我們開始編寫 Dockerfile。請注意,我們將分多步編寫這個檔案,以便於解釋內容。如果您要平行執行操作,請確保不要建立多個檔案。
# 根據 Ubuntu 17.04
FROM ubuntu:17.04
# 安裝 Tomcat 7 的環境變數;您可以根據需要更改 Tomcat 的次要版本。
# 要更改主要版本(例如,Tomcat 8),您還必須更改 TOMCAT_LOCATION 變數。
ENV TOMCAT_VERSION=7.0.81
ENV TOMCAT_FILENAME=apache-tomcat-$TOMCAT_VERSION.tar.gz
ENV TOMCAT_DIRECTORY=apache-tomcat-$TOMCAT_VERSION
ENV TOMCAT_LOCATION=http://www-eu.apache.org/dist/tomcat/tomcat-7/v$TOMCAT_VERSION/bin/$TOMCAT_FILENAME
內容解密:
FROM ubuntu:17.04指定了基礎映像為 Ubuntu 17.04,這是我們的微服務將執行的環境。ENV命令定義了可以在 Dockerfile 中使用的環境變數,用於指定 Tomcat 的版本和其他相關資訊。
接下來,我們需要提取並安裝所有依賴項。將以下內容追加到現有的檔案中:
# 下載 Tomcat;安裝所需的實用程式,如 wget 和 JDK1.8。
# 清理 apt 快取,因為 "apt-get update" 總是會破壞快取。
RUN apt-get update && \
apt-get install -y wget && \
apt-get install -y default-jdk && \
rm -fr /var/lib/apt/lists/* && \
wget $TOMCAT_LOCATION
內容解密:
apt-get是 Ubuntu 中的套件管理器,簡化了套件的生命週期(安裝/更新/刪除)。apt-get update取得 Ubuntu 倉函式庫中套件及其版本的最新列表。apt-get install命令安裝 Wget 套件和 Java 開發工具包,分別用於下載檔案和作為 Tomcat 的依賴項。rm -fr /var/lib/apt/lists/*清除了/var/lib/apt/lists/目錄中的內容,這是一個最佳實踐,以避免使 Docker 映像過大。
下載 Tomcat 後,我們繼續安裝它:
# 在 /opt 下安裝 Tomcat,並將目錄重新命名為 "tomcat"
RUN tar -xf $TOMCAT_FILENAME -C /opt && \
mv /opt/$TOMCAT_DIRECTORY /opt/tomcat
內容解密:
- 這裡,我們將 Tomcat 安裝到
/opt目錄下,並將其重新命名為/opt/tomcat,以便於管理。
最後,佈署我們的微服務:
# 將產品目錄服務佈署到 Tomcat
ADD catalog-svc.war /opt/tomcat/webapps/
# 向主機系統暴露埠
EXPOSE 8080
內容解密:
ADD catalog-svc.war /opt/tomcat/webapps/將我們的 WAR 檔案新增到 Tomcat 的 webapps 目錄下,從而佈署了我們的微服務。EXPOSE 8080向外界暴露了容器的 8080 埠,使得我們可以從主機系統存取 Tomcat。
將微服務容器化
本章節將探討如何將微服務容器化,並以一個幫助台應用程式為案例進行詳細說明。
容器化的好處
容器化是一種將應用程式及其依賴項封裝成一個獨立的容器的技術。這種技術可以提供許多好處,包括提高應用程式的可移植性、可擴充套件性和可靠性。
建立Dockerfile
要容器化一個微服務,首先需要建立一個Dockerfile。Dockerfile是一個文字檔案,其中包含了一系列的指令,用於建立一個Docker映像。
以下是一個範例Dockerfile,用於建立一個Tomcat伺服器的映像:
# 根據Ubuntu 17.04
FROM ubuntu:17.04
# 環境變數,用於安裝Tomcat 7
ENV TOMCAT_VERSION=7.0.81
ENV TOMCAT_FILENAME=apache-tomcat-$TOMCAT_VERSION.tar.gz
ENV TOMCAT_DIRECTORY=apache-tomcat-$TOMCAT_VERSION
ENV TOMCAT_LOCATION=http://www-eu.apache.org/dist/tomcat/tomcat-7/v$TOMCAT_VERSION/bin/$TOMCAT_FILENAME
# 下載Tomcat並安裝所需的工具,如wget和JDK 1.8
RUN apt-get update && \
apt-get install -y wget && \
apt-get install -y default-jdk && \
rm -fr /var/lib/apt/lists/* && \
wget $TOMCAT_LOCATION
# 在/opt下安裝Tomcat並重新命名目錄為tomcat
RUN tar -xf $TOMCAT_FILENAME -C /opt && \
mv /opt/$TOMCAT_DIRECTORY /opt/tomcat
# 將產品目錄服務佈署到Tomcat
ADD catalog-svc.war /opt/tomcat/webapps/
# 將Tomcat的埠暴露給主機系統
EXPOSE 8080
# 在前景執行Tomcat
CMD ["/opt/tomcat/bin/catalina.sh", "run"]
內容解密:
FROM ubuntu:17.04:指定基礎映像為Ubuntu 17.04。ENV指令:設定環境變數,用於指定Tomcat的版本和其他相關資訊。RUN指令:執行多個命令,包括更新apt、安裝wget和JDK 1.8、下載Tomcat、安裝Tomcat等。ADD指令:將catalog-svc.war檔案複製到Tomcat的webapps目錄下。EXPOSE指令:將Tomcat的8080埠暴露給主機系統。CMD指令:指定預設命令,在容器啟動時執行Tomcat。
建立Docker映像
要建立Docker映像,需要使用docker build命令。以下是範例命令:
docker build -t catalog-svc:1.0 .
內容解密:
docker build:用於建立Docker映像的命令。-t:指定建立的映像的名稱和標籤。catalog-svc:1.0:映像的名稱和標籤。.:指定Dockerfile所在的目錄。
設定DC/OS叢集
要執行微服務,需要設定一個DC/OS叢集。DC/OS是一個分散式作業系統軟體,根據Apache Mesos,可以提供一個簡單的方式來設定Mesos、Marathon和Marathon-lb。
以下是設定DC/OS叢集的步驟:
- 在AWS控制檯中,建立一個新的Key Pair。
- 使用AWS控制檯,建立一個新的DC/OS叢集。
此圖示展示了設定DC/OS叢集的步驟。
將幫助台應用程式容器化:DC/OS 叢集佈署實戰
在現代化的軟體開發與佈署過程中,容器化技術已經成為不可或缺的一環。本文將透過一個實際案例,詳細介紹如何將一個幫助台應用程式(Helpdesk Application)容器化,並佈署到 DC/OS 叢集中。
準備 AWS 環境與建立金鑰對
首先,我們需要在 AWS 上建立一個金鑰對(Key Pair),這將用於稍後的 DC/OS 叢集建立過程。
- 登入 AWS 管理控制檯,導航至 EC2 服務頁面。
- 在左側導航欄中選擇「金鑰對」,然後點選「建立金鑰對」。
- 為金鑰對命名並下載私鑰檔案,將其儲存在安全的位置。
建立 DC/OS 叢集
接下來,我們將使用 AWS CloudFormation 範本來建立 DC/OS 叢集。
- 前往 DC/OS 官方檔案頁面,找到 AWS 上的安裝,並點選「Launch the DC/OS template」。
- 選擇叢集型別(單主節點或多主節點)。對於測試目的,單主節點足夠;但對於生產環境,強烈建議使用多主節點設定以避免單點故障。
- 在後續的畫面中,接受預設設定並點選「下一步」。
- 在「Create Stack」頁面中,指定叢集名稱,並從下拉選單中選擇之前建立的金鑰對。
- 選擇公有和私有代理節點的數量,或保留預設值。
- 繼續接受後續畫面中的預設設定,完成堆積疊建立。
整個過程大約需要 10 至 15 分鐘。我們可以在 CloudFormation → Stacks 中監控堆積疊建立的狀態。
組態 DC/OS 叢集
一旦堆積疊建立完成,我們需要進行一些組態。
- 前往「Outputs」標籤頁,複製 Mesos-master URL 並在瀏覽器中開啟,應可看到 DC/OS 使用者介面(UI)成功啟動。
- 在叢集 UI 中,導航至左側的「Universe」,搜尋 Marathon,並安裝 Marathon 和 Marathon-lb。
應用程式邏輯架構
在成功安裝 DC/OS 叢集後,我們來看看應用程式的整體邏輯架構,如圖 13.7 所示: 此圖示展示了我們的幫助台應用程式如何被拆分成多個微服務(catalog、ticketing、search),並佈署在 DC/OS 叢集中,而其他部分仍保持原狀。這些微服務繼續使用相同的資料函式庫。
圖示解說:
- 左側為原有的龐雜應用程式(Rest of the monolithic application)。
- 中間部分為 DC/OS 叢集,其中包含了被容器化的微服務(Catalog service、Ticketing service、Search service)。
- 右側展示了這些微服務如何透過 Marathon 進行管理和擴充套件,並使用 Marathon-LB 進行負載平衡。
邏輯佈署檢視
圖 13.8 展示了我們的佈署在 DC/OS 叢集上的邏輯檢視:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 容器化微服務佈署DCOS叢集實戰
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml
圖示解說:
- 此圖進一步闡述了微服務在 DC/OS 叢集中的佈署情況。
- Marathon 負責管理這些微服務的生命週期,並支援彈性擴充套件。
- Marathon-LB 為這些服務提供了負載平衡的能力。
重點回顧:
- 使用 AWS CloudFormation 成功建立了 DC/OS 叢集。
- 正確組態了 DC/OS 環境,包括安裝 Marathon 和 Marathon-LB。
- 將幫助台應用程式的部分功能拆分成微服務並容器化。
- 成功將這些微服務佈署到 DC/OS 叢集中,並實作了負載平衡和彈性擴充套件。
這些步驟不僅展示了容器化技術的強大之處,也為我們未來在微服務架構上的探索提供了寶貴的經驗。