如何把遺留的Java應用託管在Service Fabric中

朱永光發表於2018-09-18

一、概述

眾所周知,微服務化尤其對遺留系統進行微服務化一般採用“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個步驟:

  1. 準備容器基映象
  2. 準備應用容器映象
  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埠、容器埠,如下圖:

image

3,右鍵點選JavaContainerSfApp中的“Services”節點,選擇“Add”>“New Service Fabric Service…”,再建立一個專案,如下圖:

image

4,右鍵點選JavaContainerSfApp,選擇Publish,Target Profile根據你的開發叢集選擇Local.1Node.xml或者Local.5Node.xml,釋出到本地開發叢集中進行測試,最終效果如下圖所示:

image


八、建立來賓可執行程式Service Fabric專案

如果不使用容器的方式來執行Java遺留程式,使用來賓可執行程式的方式也是可以的。

不過需要先進行如下準備工作:

  1. 在叢集的所有節點上安裝應用程式的依賴(相關執行時、框架等),比如JRE或JDK
  2. 進行一些環境配置,比如JAVA_HOME等(注意:由於SF是跑在Network Service賬號下的,所以相關環境配置必須要全域性的, 當然也可以透過Policy改變執行賬號)
  3. 規劃或者改變應用程式的暴露埠,避免多個服務產生埠衝突

下面就來建立來賓可執行程式的Service Fabric專案。

1,新建Service Fabric專案,選擇Guest Executable專案型別,輸入服務名稱、選擇執行檔案所在的資料夾、預設使用新增連線的方式、選擇執行檔案為run.bat、工作資料夾選擇為CodePackage,如下圖:

image

2,由於我們使用的SpringBoot的示例預設埠是8080,一般需要修改ServiceManifest.xml檔案中的“GsSpringBootTypeEndpoint ”替換為:

      <Endpoint Name="GsSpringBootTypeEndpoint" Protocol="http" Port="8080" Type="Input" />

如果此服務只是一個FrontWeb的話,此修改不是必須,因為Endpoint主要目的是向SF的命名服務註冊相關端點地址,讓其他服務可以定址訪問,或者進行節點環境的自動配置(比如開啟防火牆配置)。

3,類似步驟七那樣釋出到本地開發叢集,正常執行的話可以看到如下效果:

image


九、結語

透過上面的步驟,可以讓Java或者任意語言開發的遺留系統很容易的跑在Service Fabric中,從而獲得Service Fabric帶來的資源調控、高可用性、執行狀況監控、應用程式生命週期管理、高密度部署、服務可發現性等優勢。

同時,雖然本文是以Windows環境為例,但是在Linux環境下同樣可以適用(筆者曾經就讓一個Linux C++程式以來賓模式跑在Linux的Service Fabric叢集中)。

另外,上述步驟只是一個針對官方文件的提煉和總結,如果需要深入瞭解這方面內容,並期望在生產環境使用此種方式的讀者建議仔細閱讀官方文件。


十、彩蛋

本文的示例原始碼我已經分享到:https://github.com/heavenwing/JavaRunOnSf

為了減少原始碼庫的大小,相關jar檔案和tomcat,我並沒有上傳,請自行下載補充。

相關文章