雖然Service Fabric的Java支持版本還沒有正式發布,但是Service Fabric本身的服務管理、部署、升級等功能是非常好用的,那么Java的開發者可以如何利用上Service Fabric的這個功能呢?答案很簡單,其實只要利用Service Fabric的Deploy Guest Executable就好了,也就是說Service Fabric是允許部署一個或者多個獨立運行的exe,並且運行在Service Fabric的節點中的。詳細的信息可以參看官方的這個文檔:
https://azure.microsoft.com/zh-cn/documentation/articles/service-fabric-deploy-existing-app/
下面我就拿部署Java的Jetty做個樣例:
首先我們用Visual Studio創建一個Service Fabric的Application
在向導的界面上選擇我們先將主要參數留空,將Working Folder的選項從默認的Work改成CodeBase
創建好工程后,我們在jettyonjavaPkg的目錄下創建一個名字為Code的目錄,並且將事先下載好的Java的SDK和Jetty拷入Code目錄下
文件拷貝完成后,就可以編輯ServiceManifest.xml了。主要是要修改EntryPoint這一節
<EntryPoint> <ExeHost> <Program>java\bin\java.exe</Program> <Arguments>-Djetty.port=8080 -Djetty.base=..\..\jetty -jar ..\..\jetty\start.jar</Arguments> <WorkingFolder>CodeBase</WorkingFolder> <!-- Uncomment to log console output (both stdout and stderr) to one of the service's working directories. --> <!-- <ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/> --> </ExeHost> </EntryPoint>
其中Program里面我們會調用Java.exe文件,然后在Arguments里面填入Jetty的相關參數,這里要注意的是Program里面不能使用批處理文件,因為Service Fabric的服務監控需要跟蹤Exe的進程ID,以便當進程出問題時能夠及時切換到其他節點里去。如果你的Program里面指定的是批處理文件.bat的話,雖然這個批處理會執行,但是由於拿不到進程ID,所以Service Fabric會不斷的去Call這個批處理的,這也是為什么我選擇Jetty而不是常見的Tomcat容器的原因。
編輯好了EntryPoint了,因為jetty是要提供Web服務的,我們需要告訴Service Fabric,這個Application提供的是什么端口服務,所以我們還需要編輯Resources節
<Resources> <Endpoints> <!-- This endpoint is used by the communication listener to obtain the port on which to listen. Please note that if your service is partitioned, this port is shared with replicas of different partitions that are placed in your code. --> <Endpoint Name="tomcatTypeEndpoint" Protocol="http" Port="8080" Type="Input" /> </Endpoints> </Resources>
在Endpoint的設置里面可以看到發布的8080 http端口跟前面一節的參數里面啟動Jetty的參數8080是一致的。
做完這些設置,我們再在jetty的webapps的Root里面放入一個index.jsp,以便驗證下我們的jetty是不是發布在Service Fabric上的
這個jsp的代碼比較簡單,就是用來顯示下Java版本啥的
<!DOCTYPE html> <html> <head> <title>Microsoft Service Fabric on Java - Welcome</title> </head> <body bgcolor="#00abec" > <div id="feature"> <div id="content"> <h2>Service Fabric on Java,Node Address is:<%out.print(request.getLocalAddr());%></h2> <br/> <table width="750" frame="below"> <tr bgcolor="rgb(13,188,242)"> <th align="left" width="200"> Java Property </th> <th align="left" width="500"> Value </th> </tr> <%@ page import="java.util.*" %> <% ArrayList<String> mainPageProps = new ArrayList<String>(); mainPageProps.add("java.version"); mainPageProps.add("java.vendor"); mainPageProps.add("os.arch"); mainPageProps.add("catalina.base"); mainPageProps.add("jetty.base"); mainPageProps.add("user.timezone"); for(String name : mainPageProps) { String value = System.getProperty(name); if(value != null) { out.print("<tr><td>" + name); out.print("</td><td>" + value ); out.print("</td></tr>"); } } %> </table> </font> </div> </div> </body> </html>
准備好了,我們就可以在VS上面按F5,將程序部署到本地的集群里面進行測試了。
這時候打開瀏覽器訪問http://localhost:8080/index.jsp 這樣我們就可以看到我們剛才准備好的jsp文件了
從上面的截圖,可以看出來Jetty是運行在Node_4上的,我們試試從Service Fabric Explorer里把節點4重啟一下,
用瀏覽器訪問http://localhost:19080
這時候,我們會發現Service Fabric的群集很快幫我們吧應用遷移到了Node_0
這樣我們很容易就體驗到了Service Fabric幫我們管理服務的健康,實現應用快速遷移的功能。當然Service Fabric還支持服務本身的負載均衡的,但是由於本機沒法兩個應用同時發布8080端口,我們只能等Java版本的Service Fabric Service SDK發布或者將應用部署到雲上面才能體驗了。