一、概述
眾所周知,微服務化尤其對遺留系統進行微服務化一般採用“Lift and Shift”的模式進行。
Service Fabric作為一個微服務託管平臺,不僅僅可以在上面跑.NET和Java的原生應用(使用SF程式設計模型進行微服務開發),同時也能以容器(Linux Container和Windows Container)或來賓可執行程式的方式對遺留系統進行Lift微服務化遷移。
本文將以Java(Java Web)應用為例,講述一下如何把遺留系統託管到Service Fabric for Windows叢集中。
二、準備SF叢集
第一步是建立Service Fabric叢集。
最簡單的方式當然是在Azure上建立一個開箱即用的Service Fabric叢集:https://docs.microsoft.com/zh-cn/azure/service-fabric/service-fabric-cluster-creation-via-portal
或者申請一個臨時性的試用叢集:https://aka.ms/tryservicefabric
如果不打算使用Azure,也可以在本地資料中心安裝Standalone叢集,之前寫過一篇簡單的介紹,見:如何在本地資料中心安裝Service Fabric for Windows叢集
三、準備示例應用程式
1,如果是簡單的Tomcat應用,直接使用Tomcat官方提供的Sample最便捷:https://tomcat.apache.org/tomcat-6.0-doc/appdev/sample/
2,如果是Spring Boot類似的Web應用,可以嘗試拿這個做示例:https://code.visualstudio.com/docs/java/java-tutorial
如果遺留Java應用是以容器的方式執行在Service Fabric中,那麼就需要對他們進行容器化。容器化主要分為3個步驟:
- 準備容器基映象
- 準備應用容器映象
- 推送應用容器映象到私有映象倉庫
如果只是以來賓可執行程式的方式執行在Service Fabric中,那麼可以直接跳到第八步。
四、準備容器基映象
1,Java環境基映象:
在Windows Container中可用的Java環境基映象,官方的hub上就有提供,訪問:https://hub.docker.com/_/openjdk/,選擇適合自己Windows版本的tag,比如openjdk:8-jdk-nanoserver-sac2016,是Nanoserver-sac2016上的jdk8環境。
如果沒有自己的Windows版本或者出現相容性問題(比如Windows Server 1803),那麼可以根據某個tag的dockerfile自行製作。
2,Tomcat環境基映象:
由於Tomcat的官方映象並沒有提供Windows Container的版本,那麼只能自行製作一個Tomcat環境基映象。
首先從https://tomcat.apache.org/ 下載你需要的Tomcat的版本,複製到dockerfile檔案所在目錄,然後使用如下示例dockerfile進行構建:
FROM openjdk:8-jdk-nanoserver-sac2016
COPY apache-tomcat-7.0.90 ./tomcat/
ENV JRE_HOME=$JAVA_HOME
進行Dockers構建: docker build -f .\dockerfile -t tomcat-windows-base:7.0.90 .
得到名為“tomcat-windows-base:7.0.90”的image。
五、準備應用容器映象
1,War包的映象
把下載的Sample.war包和如下dockerfile放到一個目錄:
FROM tomcat-windows-base:7.0.90
COPY sample.war ./tomcat/webapps/
EXPOSE 8080
WORKDIR ./tomcat/bin
CMD [ "catalina.bat", "run" ]
進行Docker構建:docker build -f .\dockerfile -t sample-war:1.0 .
得到名為“sample-war:1.0”的image。
2,Jar包的映象
把透過VSC的Spring Boot的例子編譯得到的jar包(檔名可能是:gs-spring-boot-0.1.0.jar)和如下dockerfile放到一個目錄:
FROM openjdk:8-jdk-nanoserver-sac2016
ENV JRE_HOME=$JAVA_HOME
COPY . ./app/
WORKDIR /app
CMD [ "run.bat" ]
進行Docker構建:docker build -f .\dockerfile -t gs-spring-boot:1.0 .
得到名為“gs-spring-boot:1.0”的image。
3,嘗試直接在docker中執行構建好的應用容器映象,以驗證映象是正確的。
六、推送應用容器映象到私有映象倉庫
1,首先建立私有映象倉庫
最簡單直接的辦法當然是到Azure去建立:https://azure.microsoft.com/zh-cn/services/container-registry/
2,把上面兩個步驟構建好的映象push到私有映象倉庫,比如最終的tag是:
zygdemo.azurecr.io/sample-war:1.0 和 zygdemo.azurecr.io/gs-spring-boot:1.0
七、建立容器化Service Fabric專案
1,開啟Visual Studio 2017,確保安裝VS的時候選擇了Azure開發的Workload。
2,新建Service Fabric專案,選擇Container專案型別,輸入服務名稱、容器映象名稱、Host埠、容器埠,如下圖:
3,右鍵點選JavaContainerSfApp中的“Services”節點,選擇“Add”>“New Service Fabric Service…”,再建立一個專案,如下圖:
4,右鍵點選JavaContainerSfApp,選擇Publish,Target Profile根據你的開發叢集選擇Local.1Node.xml或者Local.5Node.xml,釋出到本地開發叢集中進行測試,最終效果如下圖所示:
八、建立來賓可執行程式Service Fabric專案
如果不使用容器的方式來執行Java遺留程式,使用來賓可執行程式的方式也是可以的。
不過需要先進行如下準備工作:
- 在叢集的所有節點上安裝應用程式的依賴(相關執行時、框架等),比如JRE或JDK
- 進行一些環境配置,比如JAVA_HOME等(注意:由於SF是跑在Network Service賬號下的,所以相關環境配置必須要全域性的, 當然也可以透過Policy改變執行賬號)
- 規劃或者改變應用程式的暴露埠,避免多個服務產生埠衝突
下面就來建立來賓可執行程式的Service Fabric專案。
1,新建Service Fabric專案,選擇Guest Executable專案型別,輸入服務名稱、選擇執行檔案所在的資料夾、預設使用新增連線的方式、選擇執行檔案為run.bat、工作資料夾選擇為CodePackage,如下圖:
2,由於我們使用的SpringBoot的示例預設埠是8080,一般需要修改ServiceManifest.xml檔案中的“GsSpringBootTypeEndpoint ”替換為:
<Endpoint Name="GsSpringBootTypeEndpoint" Protocol="http" Port="8080" Type="Input" />
如果此服務只是一個FrontWeb的話,此修改不是必須,因為Endpoint主要目的是向SF的命名服務註冊相關端點地址,讓其他服務可以定址訪問,或者進行節點環境的自動配置(比如開啟防火牆配置)。
3,類似步驟七那樣釋出到本地開發叢集,正常執行的話可以看到如下效果:
九、結語
透過上面的步驟,可以讓Java或者任意語言開發的遺留系統很容易的跑在Service Fabric中,從而獲得Service Fabric帶來的資源調控、高可用性、執行狀況監控、應用程式生命週期管理、高密度部署、服務可發現性等優勢。
同時,雖然本文是以Windows環境為例,但是在Linux環境下同樣可以適用(筆者曾經就讓一個Linux C++程式以來賓模式跑在Linux的Service Fabric叢集中)。
另外,上述步驟只是一個針對官方文件的提煉和總結,如果需要深入瞭解這方面內容,並期望在生產環境使用此種方式的讀者建議仔細閱讀官方文件。
十、彩蛋
本文的示例原始碼我已經分享到:https://github.com/heavenwing/JavaRunOnSf。
為了減少原始碼庫的大小,相關jar檔案和tomcat,我並沒有上傳,請自行下載補充。