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

1、概述

衆所周知,微服務化尤爲對遺留系統進行微服務化通常採用「Lift and Shift」的模式進行。html

Service Fabric做爲一個微服務託管平臺,不只僅能夠在上面跑.NET和Java的原生應用(使用SF編程模型進行微服務開發),同時也能以容器(Linux Container和Windows Container)或來賓可執行程序的方式對遺留系統進行Lift微服務化遷移。java

本文將以Java(Java Web)應用爲例,講述一下如何把遺留系統託管到Service Fabric for Windows集羣中。git


2、準備SF集羣

第一步是建立Service Fabric集羣。github

最簡單的方式固然是在Azure上建立一個開箱即用的Service Fabric集羣:https://docs.microsoft.com/zh-cn/azure/service-fabric/service-fabric-cluster-creation-via-portalweb

或者申請一個臨時性的試用集羣:https://aka.ms/tryservicefabricspring

若是不打算使用Azure,也能夠在本地數據中心安裝Standalone集羣,以前寫過一篇簡單的介紹,見:如何在本地數據中心安裝Service Fabric for Windows集羣docker


3、準備示例應用程序

1,若是是簡單的Tomcat應用,直接使用Tomcat官方提供的Sample最便捷:https://tomcat.apache.org/tomcat-6.0-doc/appdev/sample/apache

2,若是是Spring Boot相似的Web應用,能夠嘗試拿這個作示例:https://code.visualstudio.com/docs/java/java-tutorial編程

若是遺留Java應用是以容器的方式運行在Service Fabric中,那麼就須要對他們進行容器化。容器化主要分爲3個步驟:windows

  1. 準備容器基鏡像
  2. 準備應用容器鏡像
  3. 推送應用容器鏡像到私有鏡像倉庫

若是隻是以來賓可執行程序的方式運行在Service Fabric中,那麼能夠直接跳到第八步。


4、準備容器基鏡像

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。


5、準備應用容器鏡像

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中運行構建好的應用容器鏡像,以驗證鏡像是正確的。


6、推送應用容器鏡像到私有鏡像倉庫

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


7、建立容器化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


8、建立來賓可執行程序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


9、結語

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

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

另外,上述步驟只是一個針對官方文檔的提煉和總結,若是須要深刻了解這方面內容,並指望在生產環境使用此種方式的讀者建議仔細閱讀官方文檔。


10、彩蛋

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

爲了減小源代碼庫的大小,相關jar文件和tomcat,我並無上傳,請自行下載補充。

相關文章
相關標籤/搜索