使用Fabric8在Kubernetes中使用Camel和CDI

序幕

我最近在博客上发表了使用CDI注入Kubernetes服务的信息 。 在本文中,我将更进一步,将Apache Camel带入图片。 因此,我将使用Camel的CDI支持来连接我的组件和路由,以及Fabric8的CDI扩展来自动将Kubernetes服务注入到我的组件中。

我将重用我以前的文章中的内容(如果您还没有读过,请读一读),以构建一个独立的骆驼cdi应用程序,该应用程序将通过http公开数据库的内容(一个简单的http到jdbc并返回再次) 。 一切将在Docker中运行,编排将由Kubernetes完成。

所以第一件事。 骆驼和cdi的工作原理…。

骆驼CDI注册表

Apache Camel正在使用注册表的概念。 它使用注册表来查找路由所需的对象。 这些查找可以按类型或名称进行。

注册表最常见的用法是在处理端点uri时,骆驼将解析该方案,并将按名称查找注册表查找适当的组件。 其他情况包括按名称将bean引用传递给端点,依此类推……

换句话说, Apache Camel可以在运行时在bean注册表上执行查找。

任何需要与Apache Camel完美配合的扩展都需要为bean提供可预测的名称。

@Alias批注

对于任何给定的服务, Fabric8的CDI扩展都可以注册一个以上的bean (每种服务,每种协议每个协议一个) 。 因此, 不可能有以服务命名的服务bean。 用户也不必记住内部使用的命名约定。

“那么,Fabric8如何与依赖“按名称”查找的框架一起玩呢?”

Fabric8提供了@ Alias批注,该批注允许开发人员显式指定注入服务的Bean名称。 这是一个例子:

import javax.inject.Inject;
import io.fabric8.annotations.Protocol;
import io.fabric8.annotations.ServiceName;public class MysqlExampleWithAlias {public MysqlExampleWithAlias(@Inject @Alias("mysqldb") @ServiceName("mysql") String serivceUrl) {System.out.println("Bean Name: mysqldb. Type: String. Value:"+serviceUrl);}
}

“这会发生什么?”

Fabric8 cdi扩展将收到一个事件,该事件存在类型为String的注入点,带有2个限定符:

  1. ServiceName的值为“ mysql ”。
  2. 值为“ mysqldb ”的别名

因此,当它为该服务创建bean和生产者时,将使用“ mysqldb”作为名称。 这就是控制Fabric8托管bean并使名称查找成为可能的原因。

使用@Factory创建或配置Camel组件或端点

在上一篇文章中,我介绍了一些示例,说明如何使用Fabric8的@ Factory批注创建jdbc连接。 现在,我将为jdbc数据源创建一个工厂,然后将其添加到Apache Camel Cdi Bean Registry中 。

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import io.fabric8.annotations.Configuration;
import io.fabric8.annotations.Factory;
import io.fabric8.annotations.ServiceName;import javax.sql.DataSource;public class DatasourceFactory {private static final String TCP_PROTO = "tcp";private static final String JDBC_PROTO = "jdbc:mysql";@Factory@ServiceNamepublic DataSource create(@ServiceName String url, @Configuration MysqlConfiguration conf) {MysqlDataSource ds = new MysqlDataSource();ds.setURL(url.replaceFirst(TCP_PROTO, JDBC_PROTO) + "/" + conf.getDatabaseName());ds.setUser(conf.getUsername());ds.setPassword(conf.getPassword());return ds;}

现在,如果我们想从Apache Camel端点引用此数据源,则必须为端点uri指定数据源的“ 名称 ”。 例如“ jdbc:custmersds ”,其中customersds是数据源的名称。

“但是,如何命名fabric8托管数据源?”

这就是@Alias节省一天的方式:

import io.fabric8.annotations.Alias;
import io.fabric8.annotations.ServiceName;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cdi.ContextName;
import org.apache.camel.model.language.ConstantExpression;import javax.ejb.Startup;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.sql.DataSource;@ContextName("myCdiCamelContext")
@Startup
@ApplicationScoped
public class MyRoutes extends RouteBuilder {@Inject@ServiceName("mysql-service")@Alias("customerds")DataSource dataSource;@Overridepublic void configure() throws Exception {from("jetty:http://0.0.0.0:8080/list/").setBody(new ConstantExpression("select * from customers")).to("jdbc:customerds");}
}

这是基于CDI的Camel应用程序的典型RouteBuilder。 它的特殊之处在于我们注入了一个名为“ customersds”的数据源。

“谁提供数据源?”

简短的答案 Fabric8 。

答案不是那么简短 @ ServiceName (“ mysql”)注释告诉Fabric8 DataSource引用了“ mysql” Kubernetes服务。 Fabric8将为我们获取该服务的URL。 由于字段的类型不是字符串,也不是URL,而是数据源,因此Fabric8将查找能够将字符串转换为数据源的@ Factory方法。 在我们的例子中,它将找到完全做到这一点的DataSourceFactory类。 由于这还不够出色 ,因此DataSourceFactory还接受@ Configuration MysqlConfiguration ,以便我们可以指定数据库名称,凭据等内容(请参阅我的上一篇文章)。

配置数据源

在开始解释如何配置数据源之前,让我退后一步,回顾一下我以前的文章中的MysqlConfiguration :

import org.apache.deltaspike.core.api.config.ConfigProperty;
import javax.inject.Inject;public class MysqlConfiguration {@Inject@ConfigProperty(name = "USERNAME", defaultValue = "admin")private String username;@Inject@ConfigProperty(name = "PASSWORD", defaultValue = "admin")private String password;@Inject@ConfigProperty(name = "DATABASE_NAME", defaultValue = "mydb")private String databaseName;public String getUsername() {return username;}public String getPassword() {return password;}public String getDatabaseName() {return databaseName;}}

正如我在上一篇文章中提到的,我们可以使用环境变量来将配置传递给我们的应用程序。 请记住,此应用程序旨在生活在Docker容器中……。

MysqlConfiguration包含3个字段:

  1. 环境变量USERNAME的字段用户名
  2. 环境变量PASSWORD的字段密码
  3. 环境变量DATABASE_NAME的字段databseName

因此,我们需要3个环境变量,每个字段一个。 然后,我们的DataSourceFactory将被传递给
可以从环境中检索具有任何值的MysqlConfiguration ,以便它创建实际的DataSource。

“但是如何重用MysqlConfiguration来配置多个不同的服务?”

因此,其思想是@ Factory和@ Configuration是可重用的。 毕竟不需要将工厂和模型类绑定到基础服务,对吗?

Fabric8通过使用服务名称作为环境变量的前缀来提供帮助。 它在运行时执行此操作,并且工作方式如下:

  1. Fabric8扩展发现带有@ ServiceName注释的注入点
  2. 它将检查目标类型,并在需要时查找@ Factory
  3. @ Factory接受服务URL和实例MysqlConfiguration
  4. MysqlConfiguration将使用@ ServiceName的值作为环境变量前缀来实例化。

因此,为了使我们的示例正常工作,我们需要将应用程序打包为Docker容器,然后使用以下Kubernetes配置:

{                "image": "camel-cdi-jdbc","imagePullPolicy": "IfNotPresent","name": "camel-cdi-jdbc","env": [{"name": "MYSQL_SERVICE_USERNAME","value": "admin"},{"name": "MYSQL_SERVICE_PASSWORD","value": "password"},{"name": "MYSQL_SERVICE_DATABASE_NAME","value": "customers"}]}

现在,如果我们需要在同一容器内创建一个额外的数据源(例如,从jdbc到jdbc的桥),则我们只需为其他Kubernetes指定其他环境变量即可 。 现在,如果服务的名称是“ mysql-target”,那么我们的Kubernetes配置将需要如下所示:

{                "image": "camel-cdi-jdbc","imagePullPolicy": "IfNotPresent","name": "camel-cdi-jdbc","env": [{"name": "MYSQL_SERVICE_USERNAME","value": "admin"},{"name": "MYSQL_SERVICE_PASSWORD","value": "password"},{"name": "MYSQL_SERVICE_DATABASE_NAME","value": "customers"},{"name": "MYSQL_TARGET_USERNAME","value": "targetUser"},{"name": "MYSQL_TARGET_PASSWORD","value": "targetPassword"},{"name": "MYSQL_TARGET_DATABASE_NAME","value": "targetCustomers"}]}

…我们可以通过在项目中添加带有限定符@ ServiceName (“ mysql-target”)的注入点来使用它。

您可以在Fabric8快速入门中找到类似的示例。 更具体地说,就是camel-cdi-amq快速入门 。

敬请关注

我希望你喜欢它。 不久将有更多相关主题(包括为在Kubernetes上运行的Java应用程序编写集成测试)。

翻译自: https://www.javacodegeeks.com/2015/06/using-camel-cdi-inside-kubernetes-with-fabric8.html

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

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

相关文章

sql双表查询java代码_原生sql 多表查询

Session session Session session super.getSession();session.flush();Connection con session.connection();String uid"";StringBuffer sql new StringBuffer();sql.append("select a.user_Id from user_info as a");//user用户表sql.append( left j…

写lua时需要注意的地方

条件语句判断时,只有false和nil会导致判断为假,其他的任何值都为真。 Lua 的字符串与编码无关; 它不关心字符串中具体内容。标准 Lua 使用 64 位整数和双精度(64 位)浮点数, 但你也可以把 Lua 编译成使用 3…

免费的人脸识别SDK(基于 Java 实现的人脸识别功能)

人脸识别技术是很复杂的,自己用Java手撕一个识别算法有点不切实际, 毕竟实力不允许我这么嚣张,还是借助三方的SDK吧! 免费的人脸识别SDK: ArcSoft:,地址:https://ai.arcsoft.com.cn 基于 Jav…

git信息泄露漏洞

git信息泄露漏洞 当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。 危害 攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据…

java实验文法报告_西安邮电大学编译原理LL文法分析器实验(java).doc

西安邮电大学编译原理LL文法分析器实验(java)《编译原理》实验报告题目: 语法分析器的制作学生姓名:班 级: 软件1202学 号:指导教师:成 绩:西安邮电大学计算机学院2015 年 6 月 7 日一:实验目的熟悉语法分析的过程;理解相关文法的步骤;熟悉Fi…

PHP 数据库 ODBC

PHP 数据库 ODBC ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库)。 创建 ODBC 连接 通过一个 ODBC 连接,您可…

bash简介

目录 Shell 的含义 Shell 的种类 命令行环境 终端模拟器 命令行提示符 进入和退出方法 Shell 和 Bash 的历史 <

功能项目拼图将Java 9引入

因此&#xff0c;拼图项目...我们已经对此颇为了解&#xff0c;但尚未看到计划如何兑现其承诺的细节。 这篇文章将精确地做到这一点&#xff0c;并介绍项目的核心概念和功能。 系列 这篇文章是正在进行的有关拼图项目系列的一部分。 按照推荐的顺序&#xff08;不同于发布顺序…

2021Kali -- 木马免杀制作

​知道为什么梦里的人都看不清脸么&#xff1f;因为怕你当真。。。 ---- 网易云热评 一、通过MSF生成shellcode 1、启动MSF&#xff0c;演示版本是6.0.36 2、通过msfvenom生成相关代码 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 12 -b \x00 l…

Bash脚本教程之基本语法

目录 echo 命令 -n参数 -e参数 命令格式 空格 分号 命令的组合符&&和|| type 命令 快捷键

qq音乐mp3解析php源码,QQ音乐API

QQ音乐API搜索歌曲API&#xff1a;&aggr1&cr1&loginUin{3}&formatjson&inCharsetGB2312&outCharsetutf-8&notice0&platformjqminiframe.json&needNewCode0&p{1}&catZhida0&remoteplacesizer.newclient.next_song&w{0}{0}需…

OpenCV与YOLO学习与研究指南

引言 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;而YOLO&#xff08;You Only Look Once&#xff09;是一个流行的实时对象检测系统。对于大学生和初学者而言&#xff0c;掌握这两项技术将大大提升他们在图像处理和机器视觉领域的能力。 基础知识储备 在深入…

2015年 六·一 儿童节——我

现是2015年的六一儿童节。按说儿童节对于一个己20岁的成年女生来讲已毫无渊渊&#xff0c;于是乎&#xff0c;我花费了将近半个下午的时间来解析自己&#xff1a;是否真的已经成人&#xff1f; 首先在外形上&#xff0c;毋庸置疑&#xff0c;已长成了大人的样子。158cm身高&…

目录爆破工具 -- dirsearch

我记得&#xff0c;以前总会和你聊的很晚很晚&#xff0c;现在我们不再说话了&#xff0c;我还是会熬夜&#xff0c;但我想&#xff0c;不如从今天开始早点睡吧。。。 一、环境&#xff1a;Kali2020.01、Python3.0 二、安装过程&#xff1a; 1、复制dirsearch到本地安装包 gi…

网页 php pdf文件怎么打开是乱码,打开php文件乱码的解决方法

打开php文件乱码的解决方法发布时间&#xff1a;2021-02-14 11:45:35来源&#xff1a;亿速云阅读&#xff1a;94作者&#xff1a;小新小编给大家分享一下打开php文件乱码的解决方法&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家参考一下&#xff…

Bash教程之模式扩展

目录 简介 波浪线扩展 ? 字符扩展 * 字符扩展 方括号扩展 [start-end] 扩展 大括号扩展 {start..end} 扩展

java coin介绍_代码示例中的Java 7:Project Coin

java coin介绍该博客通过代码示例介绍了一些新的Java 7功能&#xff0c;这些项目在Project Coin一词下进行了概述。 Project Coin的目标是向JDK 7添加一组小的语言更改。这些更改确实简化了Java语言语法。 更少的打字&#xff0c;更简洁的代码&#xff0c;愉悦的开发人员&#…

如何设置浏览器禁止使用UC浏览器

通过UA可以判断浏览器是否是UC浏览器 if(navigator.userAgent.indexOf(UCBrowser)>-1) { alert("当前浏览器不支持本站&#xff0c;建议更换为QQ浏览器"); } 转载于:https://www.cnblogs.com/mqingqing123/p/4555188.html

Bash脚本教程之引号和转义

目录 转义 单引号 双引号 Here 文档 Here 字符串 转义 某些字符在 Bash 里面有特殊含义(比如$、&、*)。 $ echo $date$ 上面例子中,输出$date不会有任何结果,因为$是一个特殊字符。 如果想要原样输出这些特殊字符,就必须在它们前面加上反斜杠,使其变成普通字…

php分页教程,php 如何分页 教程

php 如何分页 教程这是一篇初级入门的教程了,我们这个与asp分页有一点的区别了,下面我们就来讲讲最简单的php分页代码吧,我们首先要有一个数据库.假如有我们有了一个数数据库里面有一张表a下面就是我们要讲到的分页代码了.$page $_GET[page]//这里是用来获取当前的页面,下面我…