一、概述

众所周知,微服务化尤其对遗留系统进行微服务化一般采用“Lift and Shift”的模式进行。

Service Fabric作为一个微服务托管平台,不仅仅可以在上面跑.NET和Java的原生应用(使用SF编程模型进行微服务开发),同时也能以容器(Linux Container和Windows Container)或来宾可执行程序的方式对遗留系统进行Lift微服务化迁移。

本文将以Java(Java Web)应用为例,讲述一下如何把遗留系统托管到Service Fabric for Windows集群中。

二、准备SF集群

第一步是创建Service Fabric集群。

最简单的方式当然是在Azure上创建一个开箱即用的Service Fabric集群:https://docs.microsoft.com/zh-cn/azure/service-fabric/service-fabric-cluster-creation-via-portal

或者申请一个临时性的试用集群:https://aka.ms/tryservicefabric

如果不打算使用Azure,也可以在本地数据中心安装Standalone集群,之前写过一篇简单的介绍,见:如何在本地数据中心安装Service Fabric for Windows集群

三、准备示例应用程序

1,如果是简单的Tomcat应用,直接使用Tomcat官方提供的Sample最便捷:https://tomcat.apache.org/tomcat-6.0-doc/appdev/sample/

2,如果是Spring Boot类似的Web应用,可以尝试拿这个做示例:https://code.visualstudio.com/docs/java/java-tutorial

如果遗留Java应用是以容器的方式运行在Service Fabric中,那么就需要对他们进行容器化。容器化主要分为3个步骤:

  1. 准备容器基镜像
  2. 准备应用容器镜像
  3. 推送应用容器镜像到私有镜像仓库

如果只是以来宾可执行程序的方式运行在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

七、创建容器化Service Fabric项目

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,发布到本地开发集群中进行测试,最终效果如下图所示:


八、创建来宾可执行程序Service Fabric项目

如果不使用容器的方式来运行Java遗留程序,使用来宾可执行程序的方式也是可以的。

不过需要先进行如下准备工作:

  1. 在集群的所有节点上安装应用程序的依赖(相关运行时、框架等),比如JRE或JDK
  2. 进行一些环境配置,比如JAVA_HOME等(注意:由于SF是跑在Network Service账号下的,所以相关环境配置必须要全局的, 当然也可以通过Policy改变运行账号)
  3. 规划或者改变应用程序的暴露端口,避免多个服务产生端口冲突

下面就来创建来宾可执行程序的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,我并没有上传,请自行下载补充。

如何把遗留的Java应用托管在Service Fabric中的更多相关文章

  1. How to deploy JAVA Application on Azure Service Fabric

    At this moment, Azure Service Fabric does not support JAVA application natively (but it's on the sup ...

  2. 115道Java经典面试题(面中率最高、最全)

    115道Java经典面试题(面中率最高.最全) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可 ...

  3. 在 Linux 上创建第一个 Service Fabric Java 应用程序

    先决条件 开始之前,请安装 Service Fabric SDK.Azure CLI,并在 Linux 开发环境中设置开发群集. 如果使用 Mac OS X,则可使用 Vagrant 在虚拟机中设置 ...

  4. java视频教程 Java自学视频整理(持续更新中...)

    视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...

  5. java.io.IOException: 您的主机中的软件中止了一个已建立的连接解决办法

    问题现象和http://hi.baidu.com/cara_cloud/item/193a3ee327546d395a2d64be描述的一样,就是在eclipse的console栏中一直显示java. ...

  6. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  7. JAVA文件夹导入到Eclipse中方法:

    将JAVA文件夹导入到Eclipse中方法:方法一: 直接将java文件夹复制,然后粘贴到项目下:方法二:1.打开eclipse,点击项目的空白处,选择import:2.选择Existing Proj ...

  8. [Java Web] 2、Web开发中的一些架构

    1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸 ...

  9. java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

    在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...

随机推荐

  1. 51nod1237 最大公约数之和

    题目链接 题意 其实就是求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 思路 建议先看一下此题的一个弱化版 推一下式子 \[\sum\limi ...

  2. 谈谈JavaScript中继承方式

    聊一聊js中的继承 一.简单继承---使用原型赋值的方式继承,将实例化的对象,赋值给子级的原型 父级构造函数 function Parent(param) { this.name = 'parent' ...

  3. js重点--this关键字

    推荐博客:https://www.cnblogs.com/huaxili/p/5407559.html this是JavaScript的一个关键字,表示的不是对象本身,而是指被调用的上文. 主要用于以 ...

  4. ElasticSearch query_string vs multi_match cross_fields query

    ElasticSearch query_string vs multi_match cross_fields query 本文记录以字段为中心的查询和以词为中心的查询这两种查询方式的区别以及在Elas ...

  5. Swift 4 经典数据结构 Data Struct大全

    快速看看吧,看看大神是如何写出最swifty的算法.我先fork一下,以表敬意. https://github.com/Imputes/swift-algorithm-club

  6. C#使用Selenium+PhantomJS抓取数据

    本文主要介绍了C#使用Selenium+PhantomJS抓取数据的方法步骤,具有很好的参考价值,下面跟着小编一起来看下吧 手头项目需要抓取一个用js渲染出来的网站中的数据.使用常用的httpclie ...

  7. typescript + echarts-for-react 制作渐变柱状图, 提示[ts] 类型“Graphic”上不存在属性“LinearGradient”

    更新: 2019/03 无意间发现Graphic上已有 LinearGradient属性 

  8. 迅为IMX6Q PLUS开发板烧写Android6.0系统方法

    平台:迅为IMX6Q PLUS开发板工具:MfgTool2 工具 镜像文件在光盘目录“03 镜像_android 6.0.1 文件系统”下.其中商业级核心板为 2G内存镜像,工业级核心板为 1G 内存 ...

  9. 简单的Web日志处理细节

  10. 记我在github上参与的Star增长最快的十万级项目。。。

    前言 GitHub作为程序员的圣地. 用了两三年,一直都觉得,他可以代码托管,项目管理,为项目建立静态主页,个人简历,找工作,面试加分. 然而>>>....昨天才认识到我还是太年轻, ...