众所周知,微服务化尤为对遗留系统进行微服务化通常采用“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,我并无上传,请自行下载补充。