当前位置:首页 > > 充电吧
[导读]一、概述众所周知,微服务化尤其对遗留系统进行微服务化一般采用“Lift and Shift”的模式进行。Service Fabric作为一个微服务托管平台,不仅仅可以在上面跑.NET和Java的原生应

一、概述

众所周知,微服务化尤其对遗留系统进行微服务化一般采用“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-sac2016COPY 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.90COPY sample.war ./tomcat/webapps/EXPOSE 8080WORKDIR ./tomcat/binCMD [ "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 ”替换为:


 

如果此服务只是一个FrontWeb的话,此修改不是必须,因为Endpoint主要目的是向SF的命名服务注册相关端点地址,让其他服务可以寻址访问,或者进行节点环境的自动配置(比如打开防火墙配置)。

3,类似步骤七那样发布到本地开发集群,正常运行的话可以看到如下效果:


九、结语

通过上面的步骤,可以让Java或者任意语言开发的遗留系统很容易的跑在Service Fabric中,从而获得Service Fabric带来的资源调控、高可用性、运行状况监控、应用程序生命周期管理、高密度部署、服务可发现性等优势。

同时,虽然本文是以Windows环境为例,但是在Linux环境下同样可以适用(笔者曾经就让一个Linux C++程序以来宾模式跑在Linux的Service Fabric集群中)。

另外,上述步骤只是一个针对官方文档的提炼和总结,如果需要深入了解这方面内容,并期望在生产环境使用此种方式的读者建议仔细阅读官方文档。


十、彩蛋

本文的示例源代码我已经分享到:https://github.com/heavenwing/JavaRunOnSf。

为了减少源代码库的大小,相关jar文件和tomcat,我并没有上传,请自行下载补充。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭