虽然 Service Fabric 的 Java 支持版本还没有正式发布,但是 Service Fabric 本身的服务管理、部署、升级等功能是非常好用的,那么 Java 的开发者可以如何利用上 Service Fabric 的这个功能呢?答案很简单,其实只要利用 Service Fabric 的 Deploy Guest Executable 就好了,也就是说 Service Fabric 是允许部署一个或者多个独立运行的 exe,并且运行在 Service Fabric 的节点中的。详细的信息可以参看官方的这个文档:
下面我就拿部署 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>
- --> -->
- </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>
- -->
- <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,将程序部署到本地的集群里面进行测试了。
这时候打开浏览器访问 这样我们就可以看到我们刚才准备好的 jsp 文件了
从上面的截图,可以看出来 Jetty 是运行在 Node_4 上的,我们试试从 Service Fabric Explorer 里把节点 4 重启一下,
用浏览器访问
这时候,我们会发现 Service Fabric 的群集很快帮我们吧应用迁移到了 Node_0
这样我们很容易就体验到了 Service Fabric 帮我们管理服务的健康,实现应用快速迁移的功能。当然 Service Fabric 还支持服务本身的负载均衡的,但是由于本机没法两个应用同时发布 8080 端口,我们只能等 Java 版本的 Service Fabric Service SDK 发布或者将应用部署到云上面才能体验了。
来源: http://www.cnblogs.com/wing-ms/p/5845520.html