使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包,用于在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支持的选项。

fabric8-徽标

部署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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 &#xff0c;不得不潜在地寻找…

sql server数据库课程设计分析

课题&#xff1a;能源管理收费系统 系统功能的基本要求&#xff1a; &#xff08;1&#xff09;用户基本信息的录入&#xff1a;包括用户的单位、部门、姓名、联系电话、住址 &#xff1b; &#xff08;2&#xff09;用户水、电、气数据的录入&#xff08;每个月的数据的录入&a…

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Status][Discuss]Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n)&#xff0c;每条边上带有权值。所有权值都可以分解成2^a*3^b的形式。现在有q个询问&…

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明&#xff1a; 1、整站程序上传后台 2、然后导入数据库文件到数据库&#xff0c; 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则&#xff1a; location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理解才能进一步使…

亿联本科java_厦门亿联2018面试题

一、选择器public class EqTest {public static void main(String[] args) {EqTest e new EqTest();}public EqTest() {String s "Java";String s2 "java";//if (s.equalsIgnoreCase(s2)){System.out.println("相等");} else {System.out.pri…

如何将云持久存储添加到JBoss Cool Store

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 上个月&#xff0c;我们提供了一个完整的零售示例&#xff0c;其中的JBoss Cool Store运行在您的堆栈的OpenShift Enterprise层上&#xff0c;由…

mysql 表单属性_php表单常用属性有什么?

程序开发中&#xff0c;必不可少的会使用到form表单&#xff0c;以前只是在前端开发时简单使用&#xff0c;对它的属性不甚了解&#xff0c;最近在后端学习中&#xff0c;不断接触到它的属性,现记录一二。下面本篇文章给大家介绍php表单常用的5个属性。actionaction规定了提交表…

i219 2012驱动_2012年I / O之后

i219 2012驱动从注册到赠品&#xff0c;每年的I / O疯狂都在不断发展。 在今年20分钟内被出售&#xff0c;并没有阻止Google赠送更多的东西。 以这种速度并有望在明年发布Google Glass&#xff0c;明年注册很可能会变得更加混乱&#xff01; 因此&#xff0c;Google&#xff0c…

java的sql的like_[Java教程]SQL like 模糊查询, in

[Java教程]SQL like 模糊查询, in0 2018-09-14 11:00:38​[{"互联网":["网络媒体","微博","墨迹天气","河北天气","其他"]},{"气象部门":["灾害大典","灾情普查","灾情直报&q…

惠而浦:使用Netty和Kafka的微服务

介绍 在上一个博客中 &#xff0c;我介绍了Netty用作Web服务器。 该示例运行良好……只要需要广播服务器即可。 大多数情况下不是很有用。 更有可能的是&#xff0c;每个客户端仅接收针对其的数据&#xff0c;并保留了特殊情况下的广播&#xff0c;例如“服务器在15分钟内停机…

python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...

关于倒排索引搜索引擎通常检索的场景是&#xff1a;给定几个关键词&#xff0c;找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型&#xff0c;通过这个模型我们可以很方便知道某篇文档包含哪些关键词&#xff0c;某…

Spring RESTful Web服务中的异常处理

1.简介 我们可能已经在Spring中遇到了几种处理RESTful Web服务应用程序中异常的方法。 在本文中&#xff0c;我们将尝试探索可以采取的最佳方法来实现有效的异常处理。 2.问题陈述 让我们创建一个简单的应用程序&#xff0c;该应用程序将在REST URI中标识员工姓名。 如果请求中…

java调python画图_Python Matplotlib plot 绘图

1、绘制x和y点plot()函数用于在图中绘制点(标记)。默认情况下&#xff0c;plot()函数在点到点之间画一条线。该函数具有用于在图中指定点的参数。参数1是一个数组&#xff0c;其中包含x轴上的点。参数2是一个包含y轴上的点的数组。如果需要绘制从(1&#xff0c;3)到(8&#xff…

jms activemq_带有ActiveMQ的JMS

jms activemq带有ActiveMQ的JMS JMS是Java消息服务的缩写&#xff0c;它提供了一种以松散耦合&#xff0c;灵活的方式集成应用程序的机制。 JMS以存储和转发的方式跨应用程序异步传递数据。 应用程序通过充当中介的MOM&#xff08;面向消息的中间件&#xff09;进行通信&#x…

【EMV L2】SDA静态数据认证处理流程

【静态数据认证】 静态数据认证处理过程中&#xff0c;卡片没有执行任何处理&#xff0c;终端执行的处理流程&#xff1a;1、认证中心公钥的获取终端使用卡片上的认证中心公钥索引&#xff08;PKI&#xff09;【TAG&#xff1a;8F&#xff0c;Certification Authority Public K…

java取邮箱前缀_java抓取网页或文件中的邮箱号码

java抓取网页或文件中的邮箱号码发布时间&#xff1a;2020-10-18 08:58:32来源&#xff1a;脚本之家阅读&#xff1a;69作者&#xff1a;java大渣渣本文实例为大家分享了java抓取邮箱号码的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下java抓取文件中邮箱号码的具体…

java btrace_BTrace:Java开发人员工具箱中的隐藏宝石

java btrace这篇文章是关于BTrace的 &#xff0c;我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全&#xff0c;动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序&#xff08;类似于DTrace&#xff0c;适用于OpenSolaris应用程序和OS&#xff09…