衆所周知,微服務化尤爲對遺留系統進行微服務化通常採用「Lift and Shift」的模式進行。html
Service Fabric做爲一個微服務託管平臺,不只僅能夠在上面跑.NET和Java的原生應用(使用SF編程模型進行微服務開發),同時也能以容器(Linux Container和Windows Container)或來賓可執行程序的方式對遺留系統進行Lift微服務化遷移。java
本文將以Java(Java Web)應用爲例,講述一下如何把遺留系統託管到Service Fabric for Windows集羣中。git
第一步是建立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
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
若是隻是以來賓可執行程序的方式運行在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
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,發佈到本地開發集羣中進行測試,最終效果以下圖所示:
若是不使用容器的方式來運行Java遺留程序,使用來賓可執行程序的方式也是能夠的。
不過須要先進行以下準備工做:
下面就來建立來賓可執行程序的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,我並無上傳,請自行下載補充。