当前位置: 首页 > news >正文

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

【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等数据库生态工具。

相关文章:

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

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 在本系列的第三部分中&#xff0c;我们了解了如何在 Minikube 中部署基于 Quarkus/Camel 的微服务&#xff0c;这是最常用的 Kubernetes 本地实现之一。虽然这样的本地…...

Ubuntu磁盘满了,导致黑屏

前言 &#xff08;1&#xff09;最近要玩Milk-V Duo&#xff0c;配置环境过程中&#xff0c;发现磁盘小了。于是退出虚拟机&#xff0c;扩大Ubuntu大小&#xff0c;重新开机&#xff0c;发现无法进入Ubuntu界面。 &#xff08;2&#xff09;查了很久&#xff0c;后面发现是磁盘…...

安装sklearn包错误解决以及 scikit-learn简介

安装sklearn包错误解决以及 scikit-learn简介 利用 pip install sklearn时出现错误 pip install sklearn Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting sklearnUsing cached https://mirrors.aliyun.com/pypi/packages/b9/0e/b2a4cfaa9e12b9ca4…...

CSS点击切换或隐藏盒子的卷起、展开效果

<template><div class"main"><el-button click"onCllick">切换</el-button><transition name"slideDown"><div class"info" v-if"isShow">1111</div></transition></di…...

关于信息安全软考的一些记录1

1、网络信息安全的基本属性 机密性&#xff1a;网络信息不泄露给非授权的用户完整性&#xff1a;未经授权必能改的特性可用性&#xff1a;可以及时获取网络信息和服务的特性可控性&#xff1a;责任主体对网络信息系统具有管理、支配的能力【可管理、可支配】扛抵赖性&#xff…...

如何选择UMLChina服务

服务口号&#xff1a;聚焦最后一公里 斐力庇第斯从马拉松跑回雅典报信&#xff0c;虽然已是满身血迹、精疲力尽&#xff0c;但他知道&#xff1a;没有出现在雅典人民面前&#xff0c;前面的路程都是白费。 学到的知识如果不能最终【用】于您自己的项目之中&#xff0c;也同样是…...

关于信息安全软考的记录3

1、网络安全体系的特征 网络安全体系&#xff1a;网络安全保障系统的最高层概念抽象 特征内容整体性网络安全单元按照一定的规则&#xff0c;相互依赖、相互作用而形成人机物一体化的网络安全保护方式协同性通过各种安全机制的相互协作&#xff0c;构建系统性的网络安全保护方…...

API攻防-接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

文章目录 概述什么是接口&#xff1f; 1、API分类特征SOAP - WSDLWeb services 三种基本元素&#xff1a; OpenApi - Swagger UISpringboot Actuator 2、API检测流程Method&#xff1a;请求方法URL&#xff1a;唯一资源定位符Params&#xff1a;请求参数Authorization&#xff…...

【Docker 内核详解】namespace 资源隔离(二):UTS namespace IPC namespace

namespace 资源隔离&#xff08;二&#xff09;&#xff1a;UTS namespace & IPC namespace 1.UTS namespace UTS&#xff08;UNIX Time-sharing System&#xff09;&#xff0c;UTS namespace 提供了 主机名 和 域名 的隔离&#xff0c;这样每个 Docker 容器就可以拥有独…...

EOF() | BOF()相关题目解析

题目 设当前数据库有10条记录(记录未进行任何索引)&#xff0c;在下列3种情况下&#xff0c;当前记录号为1时&#xff1a;EOF()为真时&#xff1b;BOF()为真时&#xff0c;命令RECN()的结果分别是______。 A&#xff0e;1,11,1B&#xff0e;1,10,1C&#xff0e;1,11,0D&#xf…...

spring 注入 当有两个参数的时候 接上面

新加一个int 型的 age 记得写getset方法和构造方法 &#xff08;&#xff08;&#xff08;&#xff08;&#xff08;&#xff08;&#xff08; 构造方法的作用——无论是有参构造还是无参构造&#xff0c;他的作用都是为了方便为对象的属性初始化值 构造方法是一种特殊的方…...

博客文档续更

十、 博客前台模块-异常处理 目前我们的项目在认证出错或者权限不足的时候响应回来的Json&#xff0c;默认是使用Security官方提供的响应的格式&#xff0c;但是这种响应的格式肯定是不符合我们项目的接口规范的。所以需要自定义异常处理 我们需要去实现AuthenticationEntryP…...

OCR让点读笔如虎添翼

点读笔是一种智能学习工具&#xff0c;它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时&#xff0c;点读笔通常会借助OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。下面将详细介绍点读笔如何利用OCR技术实现文…...

棱镜七彩参编!开源领域4项团体标准正式发布

近日&#xff0c;中电标2023年第27号团体标准公告正式发布&#xff0c;《T/CESA 1270.2-2023 信息技术 开源治理 第 2 部分&#xff1a;企业治理评估模型》、《T/CESA 1270.3-2023 信息技术 开源治理 第 3 部分&#xff1a;社区治理框架》、《T/CESA 1270.5-2023 信息技术 开源…...

轻量级Composition

MEF&#xff0c;全称Managed Extensibility Framework&#xff08;托管可扩展框架&#xff09;。MEF是专门致力于解决扩展性问题的框架。MEF 位于 ComponentModel.Composition 程序集中&#xff0c;添加 System.ComponentModel.Composition 和 System.ComponentModel.Compositi…...

Vxlan网络和flannel记录

Vxlan 大二层网络&#xff0c;在三层网络中构建逻辑的2层网络 数据包经过vxlan隧道 用vni标识不同的vxlan网络&#xff08;类似于vlan的vid&#xff09; 通过vtep来封装和解封装&#xff0c;通过UDP传输 Flannel 分配子网和IP地址&#xff1a;Flannel为每个容器或虚拟机分配唯一…...

【已解决】微信小程序-苹果手机日期解析异常

在开发微信小程序时&#xff0c;使用了 uView 的 CountDown倒计时 组件和 uni.$u.timeFrom Api&#xff0c;后台传递了一个时间字符串&#xff0c;前台计算时间戳的差值&#xff0c;来显示还有多久开始&#xff0c;这个功能在模拟器和我自己手机&#xff08;iphon13&#xff09…...

Avalonia如何更改全局背景色

1.项目下载地址&#xff1a;https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia&#xff0c;项目地址 https://github.com/irihitech/Semi.Avalonia 3.ColorView&#xff0c;使用Semi.Avalonia.ColorPicker&#xff0c;Nuget获取就行 4.样式预览 以下是…...

万界星空科技低代码平台云MES系统功能场景

1、 工艺管理 生产工艺规程、岗位操作法、工艺卡片的编制。 生产过程的工艺条件、产品质量指标以及原材料消耗的执行检查、相关数据的统计分析。 2、 工序管理 对人、机、料、法控制&#xff0c;规定产品质量标准及有关完成方法的各项规程&#xff0c;并明确各道工序的管理负责…...

运维大数据平台的建设与实践探索

随着企业数字化转型的推进&#xff0c;运维管理面临着前所未有的挑战和机遇。为应对日益复杂且严峻的挑战&#xff0c;数字免疫系统和智能运维等概念应运而生。数字免疫系统和智能运维作为新兴技术&#xff0c;正引领着运维管理的新趋势。数字免疫系统和智能运维都借助大数据运…...

【Java 进阶篇】创建 HTML 注册页面

在这篇博客中&#xff0c;我们将介绍如何创建一个简单的 HTML 注册页面。HTML&#xff08;Hypertext Markup Language&#xff09;是一种标记语言&#xff0c;用于构建网页的结构和内容。创建一个注册页面是网页开发的常见任务之一&#xff0c;它允许用户提供个人信息并注册成为…...

【JVM系列】- 启航·JVM概论学习

启航JVM概论 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c…...

Windows技巧

Windows应用 Windows应用无限延长Windows10 自动更新时间管理员身份打开cmd输入以下代码设置暂停更新时间 Windows应用 无限延长Windows10 自动更新时间 管理员身份打开cmd 输入以下代码 这里设置的是3000天&#xff0c;需要恢复更新可以将其设置为1天 reg add “HKEY_LOCA…...

Git 应用小记

常用命令 git reset 3种模式 --soft&#xff1a;将HEAD引用指向给定提交&#xff0c;索引&#xff08;暂存区&#xff09;和工作目录的内容不变 --mixed&#xff08;默认&#xff0c;可不写&#xff09;&#xff1a;将HEAD引用指向给定提交&#xff0c;索引&#xff08;暂存区…...

APT攻击与零日漏洞

APT攻击 当谈到网络安全时&#xff0c;APT&#xff08;高级持续性威胁&#xff09;攻击是最为复杂和难以检测的攻击类型之一。APT攻击通常涉及到高度的技术和策略性&#xff0c;而且它们的目标是深入地渗透和长时间地隐藏在目标网络中。 1. 什么是APT攻击&#xff1f; 高级持续…...

leetCode 1143.最长公共子序列 动态规划 + 滚动数组

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串…...

【C++ Miscellany】继承体系非尾端类设计为抽象类

部分赋值问题 用软件来处理两种动物&#xff1a;蜥蜴和鸡 class Animal { public:Animal& operator (const Animal& rhs);... };class Lizard: public Animal { public:Lizard& operator (const Lizard& rhs);... };class Chicken: public Animal {Chicken…...

Leetcode236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…...

Swift SwiftUI CoreData 过滤数据 2

预览 Code import SwiftUI import CoreDatastruct HomeSearchView: View {Environment(\.dismiss) var dismissState private var search_value ""FetchRequest(entity: Bill.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Bill.c_at, ascending: false)…...

解决maven骨架加载慢问题(亲测解决)

1、下载archetype-catalog.xml 网站 &#xff1a; https://repo.maven.apache.org/maven2/ 2、放在这个文件夹下面 3、setting–>build–>Runner : -DarchetypeCataloglocal...