0%

虽然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

image

在向导的界面上选择我们先将主要参数留空,将Working Folder的选项从默认的Work改成CodeBase

image

创建好工程后,我们在jettyonjavaPkg的目录下创建一个名字为Code的目录,并且将事先下载好的Java的SDK和Jetty拷入Code目录下

image

文件拷贝完成后,就可以编辑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>

<Endpoint Name=“tomcatTypeEndpoint” Protocol=“http” Port=“8080” Type=“Input” />
</Endpoints>
</Resources>

复制代码

在Endpoint的设置里面可以看到发布的8080 http端口跟前面一节的参数里面启动Jetty的参数8080是一致的。

做完这些设置,我们再在jetty的webapps的Root里面放入一个index.jsp,以便验证下我们的jetty是不是发布在Service Fabric上的

image

这个jsp的代码比较简单,就是用来显示下Java版本啥的

复制代码

<html>
<head>
<title>Microsoft Service Fabric on Java - Welcome</title>

</head>

Service Fabric on Java,Node Address is:<%out.print(request.getLocalAddr());%>
    <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(““ + name);
out.print(““ + value );
out.print(““);
}
} %>
</table>
</font>
</div>
</div>
</body>

</html>

复制代码

准备好了,我们就可以在VS上面按F5,将程序部署到本地的集群里面进行测试了。

这时候打开浏览器访问http://localhost:8080/index.jsp 这样我们就可以看到我们刚才准备好的jsp文件了

image

从上面的截图,可以看出来Jetty是运行在Node_4上的,我们试试从Service Fabric Explorer里把节点4重启一下,

用浏览器访问http://localhost:19080

image

这时候,我们会发现Service Fabric的群集很快帮我们吧应用迁移到了Node_0

image                         

这样我们很容易就体验到了Service Fabric帮我们管理服务的健康,实现应用快速迁移的功能。当然Service Fabric还支持服务本身的负载均衡的,但是由于本机没法两个应用同时发布8080端口,我们只能等Java版本的Service Fabric Service SDK发布或者将应用部署到云上面才能体验了。