zoukankan      html  css  js  c++  java
  • 如何把遗留的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个步骤:

    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端口、容器端口,如下图:

    image

    3,右键点击JavaContainerSfApp中的“Services”节点,选择“Add”>“New Service Fabric Service…”,再创建一个项目,如下图:

    image

    4,右键点击JavaContainerSfApp,选择Publish,Target Profile根据你的开发集群选择Local.1Node.xml或者Local.5Node.xml,发布到本地开发集群中进行测试,最终效果如下图所示:

    image


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

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

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

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

    下面就来创建来宾可执行程序的Service Fabric项目。

    1,新建Service Fabric项目,选择Guest Executable项目类型,输入服务名称、选择执行文件所在的文件夹、默认使用添加连接的方式、选择执行文件为run.bat、工作文件夹选择为CodePackage,如下图:

    image

    2,由于我们使用的SpringBoot的示例默认端口是8080,一般需要修改ServiceManifest.xml文件中的“GsSpringBootTypeEndpoint ”替换为:

          <Endpoint Name="GsSpringBootTypeEndpoint" Protocol="http" Port="8080" Type="Input" />

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

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

    image


    九、结语

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

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

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


    十、彩蛋

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

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

  • 相关阅读:
    leetcode Convert Sorted List to Binary Search Tree
    leetcode Convert Sorted Array to Binary Search Tree
    leetcode Binary Tree Level Order Traversal II
    leetcode Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
    证明中序遍历O(n)
    leetcode Maximum Depth of Binary Tree
    限制 button 在 3 秒内不可重复点击
    HTML 和 CSS 画三角形和画多边行基本原理及实践
    在线前端 JS 或 HTML 或 CSS 编写 Demo 处 JSbin 与 jsFiddle 比较
  • 原文地址:https://www.cnblogs.com/redmoon/p/9668934.html
Copyright © 2011-2022 走看看