一、概述

众所周知,微服务化尤其对遗留系统进行微服务化一般采用“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. appache 在windows 中无法启动的测试

    使用phpstudy刚启动就自动停止,排除端口被占用后,总感觉找不到好的调试方法 网上找了一些资料,这个方法不错,所以就记录了下来.最好的办法是找appache的bin目录,打开运行,输入httpd. ...

  2. 微信小程序绘制分享图

    微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...

  3. showdoc 文档管理系统

    ==========================showdoc 简介==========================在线文档管理系统很多, 比如阿里的语雀.腾讯的 TAPD 平台也包括文档管理 ...

  4. (Python3) 运行结果 = 10,40 的困扰我一顿饭时间的 代码

    a=10 b=30 def kzkzkz(a,b):   #定义一个函数 a=a+b return a b= kzkzkz(a,b) print(a,b)

  5. Java中快捷键

    Fond表示字体 size表示字号 IDEA的基本配置 IDEA中常用的快捷键 Intellij IDEA基本快捷键 Ctrl+G 跳转到指定行 Ctrl+F4 关闭当前编辑页面 Ctrl+F 搜索 ...

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

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

  7. pythonのdjango Form简单应用。

    Form表单有两种应用场景: 1.生成HTML标签. 2.验证输入内容. 如果我们在django程序中使用form时,需要在views中导入form模块 from django import form ...

  8. j2ee之监听页面请求

    本博客的起因是我想监听浏览器端每个页面都访问了哪些资源~~: 我是个菜鸡,所以我要记在我的小本本上,我怕忘了又~~~: 代码我是写在springboot2.1中的,有兴趣的同学可以玩一下~ 1:代码如 ...

  9. Mysql的子查询相关知识,少但是精

    Mysql子查询 概念分析: 根据相关性分: (1)不相关子查询:一条Sql语句中含有多条SELECT语句,先执行子查询,再执行外查询,子查询可对立运行 关键字:(1)先子查询,再外查询 (2)可以对 ...

  10. VMware workstation 上克隆CentOS 6.x 系统后网卡无法启动的问题

    在日常学习中,我们往往没有足够的物理机资源来搭建多节点的实验环境,一个比较好的解决方案就是利用虚拟机来模拟物理机完成实验. 这样一来,多节点操作系统的部署就可以利用VMware 自带的系统“克隆”功能 ...