在Service Fabric上部署Java应用,体验一把微服务的自动切换
虽然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发布或者将应用部署到云上面才能体验了。
在Service Fabric上部署Java应用,体验一把微服务的自动切换的更多相关文章
- 【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】
要求:centOS7上部署的mysql和spring boot服务,要求,mysql的时间.java程序服务的时间和宿主机的时间完全保持一致: ============================ ...
- 阿里云esc服务器上部署java项目
文章中使用centos(6和7版本).Xshell.Xftp 因为部署过程直接从操作服务器开始,如果你还没有连接好服务器请参考http://blog.csdn.net/ctrlxv/article/d ...
- 【Maven篇】---解决Maven线上部署java.lang.ClassNotFoundException和no main manifest attribute解决方法
一.前述 maven 线上部署的话会出现一些问题比如java.lang.ClassNotFoundException或者no main manifest attribute的话,是因为maven 配置 ...
- CentOS上部署JAVA服务【转】
http://www.th7.cn/Program/java/201511/686437.shtml 本文将介绍如何在CentOS上运行Java Web服务,其中将包括如何搭建JAVA运行环境.如何开 ...
- windows server服务器上部署java+tomcat网站域名配置
如果只是部署java项目的话,可以把IIS删除,然后在服务器上安装jdk tomcat 配置好环境变量,就和你在自己计算机上开发一样,把你的项目war包拷到tomcat下的webapps里(任意目录都 ...
- 【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务
问题描述 创建新的Service Fabric集群,可以通过门户,Powershell命令,或者是ARM模板.但是通过门户和PowerShell命令时,创建的SF集群都会自动新建一个虚拟网络而无法使用 ...
- 在 Docker 上运行一个 RESTful 风格的微服务
tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/d ...
- 全)Java从单体到微服务打造房产销售平台 2018年慕课网 高清视频+源码
第1章 课程介绍本章从整体上介绍课程有什么收获,以及课程如何安排,其中包括微服务的两个不同学习阶段--单体开发阶段(基于SpringBoot)和微服务改造阶段(基于SpringCloud),知识点梳理 ...
- 历史上最详细的SpringCloud搭建微服务的过程。(包括注册中心,服务提供者和服务消费者)
首先搭建注册中心,创建一个springboot的maven工程. 工程创建完成之后,先在资源文件中的application.properties中写配置文件. server.port= spring. ...
随机推荐
- 【centos7】设置开机自启动服务--systemd
centos7使用systemd管理开机自启动服务,不提倡rc.local. 假设现在有2个服务,分别为: my111: my222: 希望在开机时自动启动my222服务,但是my222启动需要my1 ...
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- 利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO
原文地址:http://blog.csdn.net/fangzhibin4712/article/details/7179414 前提条件:表sjzdfl 表sjzdxx (使用数据库MySQL) ...
- Akka(一) - akka的wordcount
1. 启动类 object Application extends App{ val _system = ActorSystem("HelloAkka") //构建akka容器 v ...
- Objective C SEl 和@selector是怎么工作的||How do SEL and @selector work in iphone sdk?
SEL is a type that represents a selector in Objective-C. The @selector() keyword returns a SEL that ...
- Form_Form树形结构HTree的开发(案例)
2014-06-09 Created By BaoXinjian
- 系统yum源更新及某些软件官方源安装
一.缘由 想在centos6.6上安装zabbix-agent,可是yum search 之后没有,又不想二进制安装,所以就找各种在线安装方法. 二.解决办法 思路: 1.尝试更新对应版本最新的yum ...
- 触发隐藏链接进行文件下载,click无响应
function invokeClick(element) { if (element.click) element.click(); //判断是否支持click() 事件 else if (elem ...
- PopuWindow_2
点击一个popupwindow窗口之外的区域popupwindow消失,带来的问题!! popupwindow窗口之外的区域popupwindow消失 , 以前说过需要设置: mPopupWindow ...
- Xcode 的正确打开方式——Debugging(转载)
Xcode 的正确打开方式——Debugging 程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...