如何把遗留的Java应用托管在Service Fabric中
一、概述
众所周知,微服务化尤其对遗留系统进行微服务化一般采用“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个步骤:
- 准备容器基镜像
- 准备应用容器镜像
- 推送应用容器镜像到私有镜像仓库
如果只是以来宾可执行程序的方式运行在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遗留程序,使用来宾可执行程序的方式也是可以的。
不过需要先进行如下准备工作:
- 在集群的所有节点上安装应用程序的依赖(相关运行时、框架等),比如JRE或JDK
- 进行一些环境配置,比如JAVA_HOME等(注意:由于SF是跑在Network Service账号下的,所以相关环境配置必须要全局的, 当然也可以通过Policy改变运行账号)
- 规划或者改变应用程序的暴露端口,避免多个服务产生端口冲突
下面就来创建来宾可执行程序的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中的更多相关文章
- 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 ...
- 115道Java经典面试题(面中率最高、最全)
115道Java经典面试题(面中率最高.最全) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可 ...
- 在 Linux 上创建第一个 Service Fabric Java 应用程序
先决条件 开始之前,请安装 Service Fabric SDK.Azure CLI,并在 Linux 开发环境中设置开发群集. 如果使用 Mac OS X,则可使用 Vagrant 在虚拟机中设置 ...
- java视频教程 Java自学视频整理(持续更新中...)
视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...
- java.io.IOException: 您的主机中的软件中止了一个已建立的连接解决办法
问题现象和http://hi.baidu.com/cara_cloud/item/193a3ee327546d395a2d64be描述的一样,就是在eclipse的console栏中一直显示java. ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- JAVA文件夹导入到Eclipse中方法:
将JAVA文件夹导入到Eclipse中方法:方法一: 直接将java文件夹复制,然后粘贴到项目下:方法二:1.打开eclipse,点击项目的空白处,选择import:2.选择Existing Proj ...
- [Java Web] 2、Web开发中的一些架构
1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸 ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
随机推荐
- appache 在windows 中无法启动的测试
使用phpstudy刚启动就自动停止,排除端口被占用后,总感觉找不到好的调试方法 网上找了一些资料,这个方法不错,所以就记录了下来.最好的办法是找appache的bin目录,打开运行,输入httpd. ...
- 微信小程序绘制分享图
微信小程序绘制分享图例子: demo下载地址:https://gitee.com/v-Xie/wxCanvasShar 大致代码会再以下说明 实际开发项目: 基础知识点: 了解canvas基础知识 w ...
- showdoc 文档管理系统
==========================showdoc 简介==========================在线文档管理系统很多, 比如阿里的语雀.腾讯的 TAPD 平台也包括文档管理 ...
- (Python3) 运行结果 = 10,40 的困扰我一顿饭时间的 代码
a=10 b=30 def kzkzkz(a,b): #定义一个函数 a=a+b return a b= kzkzkz(a,b) print(a,b)
- Java中快捷键
Fond表示字体 size表示字号 IDEA的基本配置 IDEA中常用的快捷键 Intellij IDEA基本快捷键 Ctrl+G 跳转到指定行 Ctrl+F4 关闭当前编辑页面 Ctrl+F 搜索 ...
- 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
平台:迅为IMX6Q PLUS开发板工具:MfgTool2 工具 镜像文件在光盘目录“03 镜像_android 6.0.1 文件系统”下.其中商业级核心板为 2G内存镜像,工业级核心板为 1G 内存 ...
- pythonのdjango Form简单应用。
Form表单有两种应用场景: 1.生成HTML标签. 2.验证输入内容. 如果我们在django程序中使用form时,需要在views中导入form模块 from django import form ...
- j2ee之监听页面请求
本博客的起因是我想监听浏览器端每个页面都访问了哪些资源~~: 我是个菜鸡,所以我要记在我的小本本上,我怕忘了又~~~: 代码我是写在springboot2.1中的,有兴趣的同学可以玩一下~ 1:代码如 ...
- Mysql的子查询相关知识,少但是精
Mysql子查询 概念分析: 根据相关性分: (1)不相关子查询:一条Sql语句中含有多条SELECT语句,先执行子查询,再执行外查询,子查询可对立运行 关键字:(1)先子查询,再外查询 (2)可以对 ...
- VMware workstation 上克隆CentOS 6.x 系统后网卡无法启动的问题
在日常学习中,我们往往没有足够的物理机资源来搭建多节点的实验环境,一个比较好的解决方案就是利用虚拟机来模拟物理机完成实验. 这样一来,多节点操作系统的部署就可以利用VMware 自带的系统“克隆”功能 ...