使用 Apache Camel 和 Quarkus 的微服务(五)

news2025/2/28 6:24:36

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

在本系列的第三部分中,我们了解了如何在 Minikube 中部署基于 Quarkus/Camel 的微服务,这是最常用的 Kubernetes 本地实现之一。虽然这样的本地 Kubernetes 实现对于测试目的非常实用,但其单节点功能并不能满足实际生产环境的要求。因此,为了在类似生产的环境中检查我们的微服务行为,我们需要多节点 Kubernetes 实现。最常见的一种是 OpenShift。

什么是 OpenShift?

OpenShift 是一个基于 Kubernetes 的开源企业级容器应用程序开发、部署和管理平台。它由红帽开发,作为 Kubernetes 集群之上的组件层,既可以作为商业产品,也可以作为免费平台,或者既可以作为本地基础设施,也可以作为云基础设施。下图描绘了这种架构。

与任何 Kubernetes 实施一样,OpenShift 也有其复杂性,将其安装为独立的本地平台并非易事。将其用作 AWS、Azure 或 GCP 等专用云上的托管平台是一种更实用的方法,至少在开始时是这样,但它需要一定的企业组织。

例如,ROSA(Red Hat OpenShift Service on AWS)是一种商业解决方案,有助于快速创建和简单管理完整的 Kubernetes 基础设施,但它并不是一个真正适合开发人员的环境,允许其快速开发、部署和管理。测试云原生服务。

对于后面的用例,红帽提供了 OpenShift Developer's Sandbox,这是一个开发环境,无需任何繁重的安装或订阅过程即可立即访问 OpenShift,开发人员甚至可以在开始实际项目之前就开始练习他们的技能和学习周期。这项完全免费的服务不需要任何信用卡,只需要一个 Red Hat 帐户,在共享的多租户 Kubernetes 集群中提供私有 OpenShift 环境,该集群预先配置了一组开发人员工具,例如 Java、Node .js、Python、Go、C#,包括 Helm 图表目录、s2i 构建工具和 OpenShift Dev Spaces。

在这篇文章中,我们将使用 OpenShift Developer's Sandbox 来部署 Quarkus/Camel 微服务。

在 OpenShift 上部署

为了在 OpenShift 上部署,Quarkus 应用程序需要包含 OpenShift 扩展。当然,这可以使用 Qurakus CLI 来完成,但考虑到我们的项目是一个多模块 Maven 项目,一种更实用的方法是直接在主 POM 中包含以下依赖项:

<dependency>  <groupId>io.quarkus</groupId>  <artifactId>quarkus-openshift</artifactId></dependency><dependency>  <groupId>io.quarkus</groupId>  <artifactId>quarkus-container-image-openshift</artifactId></dependency>

这样,所有子模块都将继承这些依赖项。

OpenShift应该与普通的Kubernetes资源一起工作;因此,我们先前的方案,在我们将微服务部署到Minikube上时,也应该在这里适用。毕竟,Minikube和OpenShift都是同一个事实上的标准:Kubernetes的实现。

如果我们回顾本系列的第三部分,我们基于Jib的构建和部署过程生成了普通的Kubernetes清单文件(kubernetes.yaml)以及Minikube的文件(minikube.yaml)。然后,我们可以选择使用普通生成的Kubernetes资源还是更具体的Minikube资源,我们更喜欢后者。尽管专为Minikube定制的清单文件只能在Minikube上部署,但普通的Kubernetes文件应该在Minikube上以及任何其他Kubernetes实现(如OpenShift)上都能以相同的方式工作。

然而,实际上,情况稍微复杂一些,据我所知,我未能成功地将由Jib生成的普通Kubernetes清单部署到OpenShift上。我需要做的是重命名大多数其名称满足quarkus.kubernetes.模式的属性为quarkus.openshift.。此外,某些普通的Kubernetes属性,例如quarkus.kubernetes.ingress.expose,对于OpenShift有一个完全不同的名称。在这种情况下是quarkus.openshift.route.expose。

但除了这些几乎是美观的改变外,一切都与我们第三部分的前一个方案保持在同一个位置。现在,为了在OpenShift Developer's Sandbox上部署我们的微服务,请按照以下步骤操作。

登录 OpenShift 开发者沙盒

以下是登录 OpenShift Developer Sandbox 所需的步骤:

  1. 启动您首选的浏览器并访问 OpenShift Developer's Sandbox站点

  2. 单击Login右上角的链接(您需要已经注册了 OpenShift Developer Sandbox)

  3. 单击Start your sandbox for free屏幕中央标记的红色按钮

  4. 在右上角,展开您的用户名并单击Copy login command按钮

  5. 在标有标签的新对话框中Log in with ...单击DevSandbox链接

  6. 将显示一个新页面,其中带有标记为 的链接Display Token。单击此链接。

  7. 复制并执行显示的oc命令,例如:

$ oc login --token=... --server=https://api.sandbox-m3.1530.p1.openshiftapps.com:6443

从 GitHub 克隆项目

以下是克隆项目的 GitHub 存储库所需的步骤:​​​​​​​

$ git clone https://github.com/nicolasduminil/aws-camelk.git$ cd aws-camelk$ git checkout openshift

创建 OpenShift Secret

为了连接到 AWS 资源,例如 S3 存储桶和 SQS 队列,我们需要提供 AWS 凭证。这些凭证是访问密钥 ID 和秘密访问密钥。有多种方法可以提供这些凭据,但在这里,我们选择使用 Kubernetes 密钥。以下是所需的步骤:

首先,将您的访问密钥 ID 和秘密访问密钥编码为 Base64,如下所示:​​​​​​​

$ echo -n <your AWS access key ID> | base64$ echo -n <your AWS secret access key> | base64

编辑文件aws-secret.yaml并修改以下行,以便替换...为 Base64 编码值:​​​​​​​

AWS_ACCESS_KEY_ID: ...AWS_SECRET_ACCESS_KEY: ...

创建包含 AWS 访问密钥 ID 和秘密访问密钥的 OpenShift 密钥:

$ kubectl apply -f aws-secret.yaml

启动微服务

为了启动微服务,请运行以下脚本:

$ ./start-ms.sh

该脚本与我们之前第三部分中的脚本相同:​​​​​​​

#!/bin/sh./delete-all-buckets.sh./create-queue.shsleep 10mvn -DskipTests -Dquarkus.kubernetes.deploy=true clean installsleep 3./copy-xml-file.sh

此处用于触发 Camel 文件轮询器的 copy-xml-file.sh 脚本已稍作修改:


#!/bin/sh
aws_camel_file_pod=$(oc get pods | grep aws-camel-file | grep -wv -e build -e deploy | awk '{print $1}')
cat aws-camelk-model/src/main/resources/xml/money-transfers.xml | oc exec -i $aws_camel_file_pod -- sh -c "cat > /tmp/input/money-transfers.xml"

在这里,我们kubectl用命令替换了oc命令。此外,鉴于 OpenShift 具有不仅为微服务而且为构建和部署命令创建 pod 的特殊性,我们需要在正在运行的 pod 列表中过滤掉出现字符串 和 的buildpod deploy。

运行此脚本可能需要一些时间。完成后,确保所有必需的 OpenShift 控制器正在运行:


$ oc get is
NAME              IMAGE REPOSITORY                                                                                                      TAGS                                                       UPDATED
aws-camel-file    default-route-openshift-image-registry.apps.sandbox-m3.1530.p1.openshiftapps.com/nicolasduminil-dev/aws-camel-file    1.0.0-SNAPSHOT                                             17 minutes ago
aws-camel-jaxrs   default-route-openshift-image-registry.apps.sandbox-m3.1530.p1.openshiftapps.com/nicolasduminil-dev/aws-camel-jaxrs   1.0.0-SNAPSHOT                                             9 minutes ago
aws-camel-s3      default-route-openshift-image-registry.apps.sandbox-m3.1530.p1.openshiftapps.com/nicolasduminil-dev/aws-camel-s3      1.0.0-SNAPSHOT                                             16 minutes ago
aws-camel-sqs     default-route-openshift-image-registry.apps.sandbox-m3.1530.p1.openshiftapps.com/nicolasduminil-dev/aws-camel-sqs     1.0.0-SNAPSHOT                                             13 minutes ago
openjdk-11        default-route-openshift-image-registry.apps.sandbox-m3.1530.p1.openshiftapps.com/nicolasduminil-dev/openjdk-11        1.10,1.10-1,1.10-1-source,1.10-1.1634738701 + 46 more...   18 minutes ago
$ oc get pods
NAME                       READY   STATUS      RESTARTS   AGE
aws-camel-file-1-build     0/1     Completed   0          19m
aws-camel-file-1-d72w5     1/1     Running     0          18m
aws-camel-file-1-deploy    0/1     Completed   0          18m
aws-camel-jaxrs-1-build    0/1     Completed   0          14m
aws-camel-jaxrs-1-deploy   0/1     Completed   0          10m
aws-camel-jaxrs-1-pkf6n    1/1     Running     0          10m
aws-camel-s3-1-76sqz       1/1     Running     0          17m
aws-camel-s3-1-build       0/1     Completed   0          18m
aws-camel-s3-1-deploy      0/1     Completed   0          17m
aws-camel-sqs-1-build      0/1     Completed   0          17m
aws-camel-sqs-1-deploy     0/1     Completed   0          14m
aws-camel-sqs-1-jlgkp      1/1     Running     0          14m
oc get svc
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
aws-camel-jaxrs     ClusterIP   172.30.192.74   <none>        80/TCP                                11m
modelmesh-serving   ClusterIP   None            <none>        8033/TCP,8008/TCP,8443/TCP,2112/TCP   18h

如上面的清单所示,所有必需的图像流都已创建,并且所有 Pod 都已完成或正在运行。已完成的 Pod 是与构建和部署操作相关的 Pod。正在运行的服务与微服务相关联。

只有一项服务正在运行:aws-camel-jaxrs。该服务可以aws-camel-jaxrs通过公开路由来与运行微服务的 Pod 进行通信。这是自动完成的,对财产有效quarkus.openshift.route.expose=true。aws-camel-sqs事实上,微服务需要与之通信aws-camel-sqs,因此需要知道通往它的路径。要获取该路由,您可以按照以下步骤操作:


$ oc get routes
NAME              HOST/PORT                                                                      PATH   SERVICES          PORT   TERMINATION   WILDCARD
aws-camel-jaxrs   aws-camel-jaxrs-nicolasduminil-dev.apps.sandbox-m3.1530.p1.openshiftapps.com          aws-camel-jaxrs   http                 None

现在打开application.properties与aws-camel-sqs微服务关联的文件并修改属性,rest-uri如下所示:

rest-uri=aws-camel-jaxrs-nicolasduminil-dev.apps.sandbox-m3.1530.p1.openshiftapps.com/xfer

在这里,您必须将命名空间替换nicolasduminil-dev为对您的情况有意义的值。现在,您需要停止微服务并再次启动它们:​​​​​​​

$ ./kill-ms.sh...$ ./start-ms.sh...

您的微服务现在应该按预期运行,您可以使用以下命令检查日志文件:

$ oc logs aws-camel-jaxrs-1-pkf6n

正如您所看到的,为了获得服务的路由aws-camel-jaxrs,我们需要启动、停止和再次启动我们的微服务。这个解决方案远非优雅,但我没有找到任何其他解决方案,我依靠建议的读者来帮助我改进它。可能可以使用 OpenShift Java 客户端在 Java 代码中执行与命令oc get routes执行的操作相同的操作,但我没有找到具体方法,而且文档也不太明确。

我想对无法在这里提供完整的解决方案表示歉意,但尽管如此,还是享受它吧!

作者:Nicolas Duminil

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

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

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

相关文章

198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则;了解什么是JMS。

目录 JMS 讲解★ RabbitMQ的核心概念★ RabbitMQ工作机制★ Connection&#xff08;连接&#xff09; 与 Channel&#xff08;通信信道&#xff09;★ Exchange★ Exchange与Queue★ Exchange的类型&#xff08;4种&#xff09;及 该类型对应的路由规则 看RabbitMQ 之前&#x…

适合学生写作业的台灯有哪些?双十一学生台灯推荐清单

现在很多家长为了娃的学习需求&#xff0c;基本都会备上一盏台灯&#xff0c;但桌面台灯有其无法避免的局限性&#xff0c;比如&#xff1a;光照范围不够大、光线过度集中、光线均匀度不足、产生眩光等问题&#xff0c;可能会对孩子的视力健康带来不利影响。 因此建议大家选择…

兴趣社如何搭建一个兴趣社区?

社交产品的本质是帮助用户提升社交的质量与效率&#xff0c;而兴趣则是找到本质的捷径。用户对兴趣社区的使用主要是围绕兴趣爱好&#xff0c;社交属性以及粉丝活动三个方向。对感兴趣的话题&#xff0c;用户天然有更强的分享讨论欲&#xff0c;更期待与人社交互动。“越垂直的…

通过Moonbeam路由流动性,如何转移token至Hydra?

在Moonbeam路由流动性&#xff08;Moonbeam Routed Liquidity&#xff09;功能下&#xff0c;用户在简洁的界面即可从如以太坊、Solona、Polygon、Avalanche等生态将流动性转移至波卡平行链。 开始操作前&#xff0c;请先准备以下条件&#xff1a; 原始链上的资产 原始链上的g…

[elasticsearch]使用postman来查询数据

最近需要debug程序&#xff0c;debug的时候需要查找elasticsearch里面的数据是否正确。 第一步建立一个post请求&#xff0c;并按照图下的方式填上ur和参数&#xff1a; 发送post请求&#xff0c;url为&#xff1a; http://ip:port/index_name/_search我这里查询的是title字…

spring cloud config pattern 用法

看了官网,对pattern用法的讲解,感觉讲的不是很清楚,只是讲了 config server端的配置,没有讲清楚如果从 client 端连接 config server 端的话,需要怎么配置,其中最重要的就是怎么对pattern进行识别,摸锁了一段时间,搞清楚了pattern的用法 springboot version:3.0.4 s…

中科院提出“思维传播”,极大增强ChatGPT等模型复杂推理能力

中国科学院自动化研究所与耶鲁大学计算机系研究人员联合发布了&#xff0c;一份名为《思维传播:用大型语言模型进行基于类比的复杂推理》的论文。 ChatGPT等大型语言模型展示出了超强的创造能力&#xff0c;只需简单的文本提示就能生成小说、营销创意、简历等各种文本内容。但…

同城生活广告投放小程序源码系统 带完整搭建教程

今天给大家分享一个同城生活广告投放小程序源码系统&#xff0c;可以通过这个小程序投放广告来获取盈利&#xff0c;操作简单&#xff0c;后台功能强大&#xff0c;新手或小白不用担心。以下是部分核心代码&#xff1a; 系统特色功能如下&#xff1a; 多城市选择&#xff1a;该…

机器视觉公司还是招人?

文章目录 他们是真的在招人吗&#xff1f;裁那么多人&#xff0c;却还要招那么多人&#xff0c;图什么&#xff1f;为什么&#xff1f;闹着玩&#xff1f;我们常见的裁员原因有以下几种&#xff1a;几个小建议&#xff1a; 最近机器视觉搞外包&#xff0c;搞AI外观检测&#xf…

Spring Boot中的JdbcTemplate是什么,如何使用

Spring Boot中的JdbcTemplate是什么&#xff0c;如何使用 Spring Boot是一个流行的Java应用程序开发框架&#xff0c;它简化了Java应用程序的开发过程&#xff0c;并提供了丰富的功能和工具。在Spring Boot中&#xff0c;JdbcTemplate是一个强大的数据库访问工具&#xff0c;它…

如何使用 arrayList.removeAll(Collection<?> c)?

引言 对于 Collection 集合及其实现类都有 removeAll(Collection<?> c)。 对于ArrayList 的实例对象&#xff0c;在数据比较多的情况下&#xff0c;方法 removeAll() 的传参 c 的类型是 HashSet会比是 ArrayList 的情况快的多。 原因 我们来细看一下ArrayList类的re…

redis简介和配置教程

redis简洁版教程 一、概述1、简介2、特点3、优势 二、配置 一、概述 1、简介 Redis是一个高性能的 key-value 数据库。 2、特点 Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-v…

矩阵系统能做什么

矩阵系统可以应用于许多领域&#xff0c;包括但不限于以下方面&#xff1a; 1. 工程领域&#xff1a;在工程项目中&#xff0c;矩阵系统可用于设计和优化结构、系统、网络、电路、热管理等。例如&#xff0c;矩阵系统可以用来分析和预测系统的稳定性、可靠性、响应时间、能耗等…

C++如何让自己变得富有?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测

多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测 目录 多输入多输出 | MATLAB实现CNN-BiGRU-Attention卷积神经网络-双向门控循环单元结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考…

Newman基本使用

目录 简介 安装 使用 官网 运行 输出测试报告文件 htmlextra 使用 简介 Newman 是 Postman 推出的一个 nodejs 库&#xff0c;直接来说就是 Postman 的json文件可以在命令行执行的插件。   Newman 可以方便地运行和测试集合&#xff0c;并用之构造接口自动化测试和持续集成…

基于Java的宠物医院管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领…

mysql面试题47:MySQL中Innodb的事务实现原理

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Innodb的事务实现原理 InnoDB是MySQL中一种常用的存储引擎,它支持事务和行级锁等特性。以下是InnoDB事务实现的简要原理: 事务定义: 事务是指一…

【算法系列 | 10】深入解析查找算法之—线性查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第10讲&#xff0c;讲…

上机实验二 设计单循环链表 西安石油大学数据结构

实验名称:设计单循环链表 (1&#xff09;实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2&#xff09;主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证…