红帽公司最近发布了一个微服务集成工具包,用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点,我将Rider Auto应用程序迁移到一组微服务中,该应用程序已经存在了一段时间,该应用程序用于演示Apache Camel和JBoss Fuse,可以通过Docker容器在OpenShift / Kubernetes上运行。 该博客详细介绍了一些背景知识,并指出了针对非平凡应用程序的“操作方法”的特定示例。 我还将制作一组视频来演示此操作,因此,请关注此博客( http://blog.christianposta.com )进行更新,或者在Twitter @christianposta上关注我。

什么是用于OpenShift的保险丝集成服务(FIS)?

FIS是来自fabric8.io上游社区的一组开发人员工具和Docker映像,用于打包和部署我们的应用程序,该应用程序遵循微服务架构以及围绕应用程序部署,版本控制和生命周期管理的最佳实践,适合模型。 FIS是OpenShift上的Fuse的Red Hat支持的选项。

部署Fuse Integration Services的两种主要方法是通过Fuse传统上使用的基于OSGI的Karaf方法以及一种更简单的平面类加载器选项,该选项从简单的旧Java main引导Camel。 这两个选项都打包并作为Docker容器交付。 两者都是不错的选择,具体取决于您的工作,因此让我们看一下。

骆驼靴

Camel Boot是一个JVM引导程序选项,它使我们可以使用maven项目使用的相同类路径来打包应用程序,并使用Plain Old Java Main来启动Apache Camel集成。 这种方法具有许多优点,可以简化构建,组装,分发和运行我们的微服务。 最重要的是,我们不必猜测我们的应用程序行为是基于复杂的类加载器的层次结构或图形,还是我们是否包含了正确的元数据和依赖项,因此类可能无法解析/碰撞/覆盖/覆盖/动态加载/等等。 。 我们可以通过仅使用单个平面类加载器来简化模型,从而不仅在Dev中而且在整个应用程序生命周期中(例如,在IST,UAT,PM,PROD等)中更轻松地推理应用程序。

由于此选项并不打算部署在任何应用程序服务器(Java EE应用程序服务器,Servlet容器,OSGI容器等)中,因此我们将依靠我们的应用程序来提供“恰到好处”的功能,否则您将在应用服务器-诸如HTTP,JMS,持久性等内容。因此,您可以在我们的应用中嵌入Jetty或Undertow服务器以获取REST或SOAP端点的HTTP服务,并可以嵌入Spring-JMS和ActiveMQ库之类的JMS客户端以获取消息客户。 由于所有这些依赖项都作为应用程序的一部分包含在内,并且可以独立于任何应用程序服务器启动,停止,重新部署等,因此这也使对应用程序进行单元测试变得更加容易。

我建议在大多数用例中使用此Camel Boot选项,在这些用例中,您已经分解了应用程序并对其进行了模块化,并且需要分别运行,调整,扩展和推理它们。 但是,在某些情况下,将服务并置在一起是必要的,并且只要应用程序的类路径不会变得太复杂(即相互依赖的依赖关系),Camel Boot应该是一个不错的选择。 如果由于内聚的,位于同一位置的服务而使微服务变得复杂,请考虑使用Apache Karaf的下一个选项,该选项可让您精细地控制类加载器的行为并在单个应用程序/ JVM进程中隔离模块和API。

“不变”的Apache Karaf

Fuse Integration Services还提供了用于部署到基于Apache Karaf的JVM的选项,尽管该模型略有不同,因为我们遵循“不可变”部署的Docker模型。 在将应用程序热部署/重新部署到正在运行的JVM或从中撤出应用程序之后,很难推断出JVM的状态。 实际上,由于JVM在运行时的这种“动态”可变性,您可能会遇到令人讨厌的,难以识别的JVM泄漏 (尤其是在生产中是个坏主意)。 FIS鼓励的模型是“用旧版本替换旧版本”之一(并依靠集群管理器通过滚动升级或蓝绿色部署等为您精心安排 )

这对于FIS的Apache Karaf意味着什么? 不建议在运行时动态加载和卸载包或更改配置值以更改应用程序状态。 相反,我们鼓励可预测的启动顺序,理解的配置值以及将预烘焙的应用程序移植到JVM中。 如果需要更改,那么您将通过应用程序交付管道来更改/构建/测试/部署新版本(理想情况下是通过CI / CD流程),就像上述Camel-Boot选项一样。 因此,对于Karaf for FIS,您的应用程序及其所有依赖项在构建时就打包,安装,解析并构建到一个Karaf程序集中 ,这是Karaf的自定义发行版,其中包含您的应用程序。 部署时无需再猜测OSGI元数据和类解析; 如果事情无法解决,它们都是预先计算的,并且在构建时会快速失败。 如果构建成功,您将对OSGI应用程序更有信心。

尽管大多数情况下建议使用Camel Boot选项,但对于OpenShift / Kubernetes / Docker之外的现有JBoss Fuse部署,此基于Karaf的选项可能是将现有Fuse工作负载迁移到此模型的最佳选择(并利用CI / CD ,服务发现,集群管理等-已内置在OpenShift中)。 同样,如果您将许多服务并置在一起,最终污染了一个平面类路径,则不变的Karaf选项非常适合提供更精细的类路径隔离和API /模块化建模。

部署到Kubernetes / OpenShift

要部署到OpenShift,我们需要执行以下操作:

  • 打包我们的JVM(骆驼引导或不可变的karaf)
  • 构建我们的Docker容器
  • 生成并应用我们的OpenShift / Kubernetes配置

包装骆驼靴应用

要打包我们的Camel Boot应用程序,我们所需要做的就是包含一个maven <build/>插件,该插件可以为我们处理所有这些事情。

<plugin><groupId>io.fabric8</groupId><artifactId>hawt-app-maven-plugin</artifactId><version>${fabric8.version}</version><executions><execution><id>hawt-app</id><goals><goal>build</goal></goals><configuration><javaMainClass>org.apache.camel.spring.Main</javaMainClass></configuration></execution></executions>
</plugin>

在上述hawt-app-maven-plugin配置中,我们可以看到我们只指定了一个简单的旧Java Main,它将骆驼引导到依赖项注入上下文或您的选择(Spring,CDI等)中,并发现您的所有Spring / CDI资源,以及发现和启动您的骆驼路线。 可以使用的Main.java文件的不同类型是:

  • org.apache.camel.spring.Main –发现您的Spring上下文文件(默认位置META-INF / spring / *。xml
  • org.apache.camel.cdi.Main –加载CDI容器和Camel路由bean
  • org.apache.camel.main.Main –没有依赖项注入容器; 默认的SimpleRegistry实现
  • org.apache.camel.spring.javaconfig.Main –使用Java配置的Spring配置
  • org.apache.camel.guice.Main – Guice依赖注入容器

可能也值得将exec-maven-pluginpom.xml ,以便您可以尝试并通过上述Java Main尝试进行引导:

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.4.0</version><configuration><mainClass>org.apache.camel.spring.Main</mainClass></configuration>
</plugin>

然后,如果您键入mvn exec:java您将获得与与hawt-app-maven-plugin打包的应用程序相同的行为,该应用程序保留了我们独立Camel Boot微服务的Maven类路径的顺序和行为。

在进行Maven构建时,您应该在zip / tar.gz文件中看到打包了其Maven依赖项的应用程序。 如果您解压缩该文件,则会有一个bin/run.sh文件,可用于启动您的骆驼微服务。

要将其转换为Docker映像,请将以下docker-maven-pluginpom.xml

<plugin><groupId>org.jolokia</groupId><artifactId>docker-maven-plugin</artifactId><version>${docker.maven.plugin.version}</version><configuration><images><image><name>our-company/app-name:1.0</name><build><from>jboss-fuse-6/fis-java-openshift:1.0</from><assembly><basedir>/deployments</basedir><descriptorRef>hawt-app</descriptorRef></assembly><env><JAVA_LIB_DIR>/deployments/lib</JAVA_LIB_DIR><JAVA_MAIN_CLASS>org.apache.camel.spring.Main</JAVA_MAIN_CLASS></env></build></image></images></configuration>
</plugin>

有关设置和运行它的更多详细说明,请参阅Rider Auto OpenShift文档。

打包不可变的Karaf应用

如果您使用的是基于Karaf的微服务,我们将遵循与Camel Boot类似的路径。 通过将插件添加到我们的maven构建中,我们将使用karaf-maven-plugin将Karaf应用打包到一个不变的Karaf程序karaf-maven-plugin

<plugin><groupId>org.apache.karaf.tooling</groupId><artifactId>karaf-maven-plugin</artifactId><version>${karaf.plugin.version}</version><extensions>true</extensions><executions><execution><id>karaf-assembly</id><goals><goal>assembly</goal></goals><phase>install</phase></execution><execution><id>karaf-archive</id><goals><goal>archive</goal></goals><phase>install</phase></execution></executions><configuration><karafVersion>v24</karafVersion><javase>1.8</javase><useReferenceUrls>true</useReferenceUrls><!-- do not include build output directory --><includeBuildOutputDirectory>false</includeBuildOutputDirectory><!-- no startupFeatures --><startupFeatures><feature>karaf-framework</feature><feature>shell</feature><feature>jaas</feature><feature>spring</feature><feature>camel-spring</feature><feature>camel-jaxb</feature><feature>camel-cxf</feature><feature>camel-bindy</feature><feature>cxf-http-jetty</feature><feature>activemq-client</feature><feature>activemq-camel</feature></startupFeatures><startupBundles><!--  this needs to be here for spring-dm to resolve properly!!--><bundle>mvn:org.apache.karaf.bundle/org.apache.karaf.bundle.core/3.0.4</bundle><bundle>mvn:io.fabric8.mq/mq-client/2.2.0.redhat-079</bundle><bundle>mvn:io.fabric8/fabric8-utils/2.2.0.redhat-079</bundle><bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle></startupBundles></configuration>
</plugin>

请注意,上面的示例使用我们的微服务模块/ API构建了Karaf的完整发行版,并将所有依赖项烘焙到发行版中。 您可以在配置中看到,我们可以精确控制要预发布到发行版中的功能,包,JRE等。

还应使用docker-maven-plugin为该模块构建Docker映像。 再次,查看Rider Auto OpenShift文档以获取完整的,正在运行的示例。

生成OpenShift / Kubernetes组件清单

目前,FIS有两个用于生成OpenShift / Kubernetes清单文件的选项(json / yaml –尽管目前仅支持JSON选项。在上游社区中,我们也支持yaml选项)。 要生成复制控制器/ Pods /服务,我们需要添加fabric8-maven-plugin和一些maven <properties/>

<plugin><groupId>io.fabric8</groupId><artifactId>fabric8-maven-plugin</artifactId><version>${fabric8.version}</version><executions><execution><id>json</id><phase>generate-resources</phase><goals><goal>json</goal></goals></execution><execution><id>attach</id><phase>package</phase><goals><goal>attach</goal></goals></execution></executions>
</plugin>
<fabric8.service.name>${project.artifactId}</fabric8.service.name><fabric8.service.headless>true</fabric8.service.headless><fabric8.metrics.scrape>true</fabric8.metrics.scrape><fabric8.metrics.port>9779</fabric8.metrics.port><docker.port.container.soap>8183</docker.port.container.soap><fabric8.service.name>${project.artifactId}</fabric8.service.name><fabric8.service.port>80</fabric8.service.port><fabric8.service.containerPort>8183</fabric8.service.containerPort>

使用这些pom.xml条目,我们可以执行mvn fabric8:json并生成kubernetes.json文件到target/classes/kubernetes.json

我们还可以使用类型安全的DSL来增强或生成kubernetes.json文件,从而生成更高级的Kubernetes清单对象,例如PersistentVolumes,Secrets,多种服务等。 有关一些示例和说明,请参见rider-auto-file模块。

Rider Auto微服务回购中展示的功能

请查看Rider Auto项目,以了解有关这些功能的更多详细信息:

  • 使用fabric8 maven插件生成kubrenetes.json文件
  • 使用类型安全的DSL将PersistentVolumes添加到kubernetes.json文件
  • 构建骆驼启动应用
  • 构建不可变的Karaf应用
  • 在kubernetes环境中发现JBoss AMQ
  • 为Camel Boot和不可变的Karaf构建Docker映像
  • 将应用程序部署到OpenShift
  • 如何将多个kubernets.json文件合并到一个kubernetes.json文件中以进行“多合一”部署
  • 连接到本地/远程Docker守护程序/ openshift安装
  • 通过Kubernetes Services公开SOAP和REST HTTP服务
  • 在Karaf中使用Spring
  • Kubernetes与fabric8-arquillian的集成测试

翻译自: https://www.javacodegeeks.com/2016/02/cloud-native-camel-riding-jboss-fuse-openshift.html

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行相关推荐

  1. jboss fuse 教程_使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

    jboss fuse 教程 红帽公司最近发布了一个微服务集成工具包,用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务. 为了帮助人们更好地理解这一点,我将Rid ...

  2. jboss fuse 教程_JBoss Fuse –使用MVEL将您的静态配置转换为动态模板

    jboss fuse 教程 最近,我重新发现了我已经忘记的JBoss Fuse功能,并且我认为其他人可能会从此提醒中受益 . 这篇文章将重点放在JBoss Fuse和Fabric8上,但所有正在寻找最 ...

  3. 窥探JBoss Fuse 6.1的新功能

    我对即将发布的Fuse 6.1版本感到非常兴奋,因为有很多很棒的新功能是我真正想要的,而且已经有一段时间了. HAWT工具. 因此,这是一个快速的先睹为快,主要关注于新版本的Fuse Manageme ...

  4. Cloud Native 介绍

    为什么80%的码农都做不了架构师?>>>    背景 Cloud Native表面看起来比较容易理解,但是细思好像又有些模糊不清:Cloud Native和Cloud关系是啥?它用来 ...

  5. 一篇文章带你了解Cloud Native

    背景 Cloud Native表面看起来比较容易理解,但是细思好像又有些模糊不清:Cloud Native和Cloud关系是啥?它用来解决什么问题?它是一个新技术还是一个新的方法?什么样的APP符合& ...

  6. Cloud Native Infrastructures Meetup|精彩回顾+PPT下载

    12月5日,OpenAnolis社区(Anolis is not just Linux System)联合Open Infrastructure基金会举办了首场线下meetup,围绕「Cloud Na ...

  7. Cloud Native Weekly | 华为云抢先发布Redis5.0,红帽宣布收购混合云提供商 NooBaa

    1--华为云抢先发布Redis5.0 2--DigitalOcean K8s服务正式上线 3--红帽宣布收购混合云提供商 NooBaa 4--微软发布多项 Azure Kubernetes 服务更新 ...

  8. Oracle Cloud Native Framework推出云原生解决方案

    摘要:Oracle Cloud Native Framework云原生平台提供托管云服务和本地软件,同时在现Oracle云基础架构上跨应用程序配置和分析大量服务.developer relations ...

  9. Cloud Native概念

    计算机领域有句名言"计算机科学领域的任何问题, 都可以通过添加一个中间层来解决.云计算能否给应用开发这提供一个 更加接近实际开发需求,能够更加接近实际问题抽象的中间层?作为一个软件工程师,我 ...

最新文章

  1. 一些Jquery操作
  2. python按键盘上哪个键运行_pythonshell哪个键执行命令
  3. SASS 的相关函数
  4. 事业单位计算机知识c语言,事业单位考试计算机基础知识C语言程序设计
  5. 再谈 Formsville
  6. 大数据之有指导数据挖掘方法的模型
  7. php enum 数字类型插入失败的解决办法
  8. 关于webuploader 在ie9上不能触发 input 的 change 事件
  9. css3中border-image的用法(fill 、border-image-outset 、border-image-width)
  10. 新托业模拟考试感言—了解一下参加过托业考试前辈们的经验03
  11. 史上最拉跨的导线平差程序( by C#)
  12. FTP软件的安装及上传/下载方法
  13. 本地使用Idea创建SpringBoot项目并给gitee托管
  14. php+条形码在线怎么生成,php实现在线生成条形码示例分享(条形码生成器)
  15. RLC串联电路的谐振相关参数计算
  16. 北邮 计算机学院数据库实验报告二,北邮数据库_sql实验二报告.doc
  17. 快排两种实现及五种优化
  18. 【项目实战】---商品详情页的制作
  19. Codeforces Round #571 (Div. 2)
  20. 四级英语听力软件测试,公务员考试网上做题 普通话测试软件 英语四级听力技巧...

热门文章

  1. ByteBuffer的使用
  2. Oracle入门(十三C)之高级查询(下)
  3. Mysql的安装与远程登录
  4. Spring Boot定制启动图案
  5. CSS3中的动画示例
  6. 《走遍中国》珍藏版(七)
  7. java实现打印菱形
  8. SparkSQL 内置函数的使用(JAVA与Scala版本)
  9. Mybatisplus 自动生成字段 强制覆盖 null或者空字符串也覆盖
  10. Springboot+MyBatis-plus+postgresSQL 的整合