js中使用camel框架

序幕

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

我将重用以前的文章中的内容(如果您还没有读过,请仔细阅读),以构建一个独立的骆驼cdi应用程序,该应用程序将通过http (向jdbc并返回的简单http)公开数据库的内容再次) 。 一切将在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数据源引用了“ 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

js中使用camel框架

js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI相关推荐

  1. 使用Fabric8在Kubernetes中使用Camel和CDI

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

  2. ios swift请求框架_使用Swift在iOS中创建二进制框架

    ios swift请求框架 We all use a lot of frameworks in our daily development routine. We just type the magi ...

  3. 框架中建立浮动框架_建立代理,而不是框架

    框架中建立浮动框架 自从引入Java注释以来,它已成为大型应用程序框架API的组成部分. 此类API的很好示例是Spring或Hibernate的示例,其中添加了几行注释代码可实现非常复杂的程序逻辑. ...

  4. ux设计中的各种地图_如何在UX设计中使用颜色

    ux设计中的各种地图 Color is the mother tongue of the subconscious. 颜色是潜意识的母语. - Carl Jung -荣格 Color has more ...

  5. 如何提取edit control中输入的数据_如何在Power Query中提取数据——列表篇(1)

    表名为列表,第一步骤名称为源 (一)从头开始提取 1. 获取列表第一个 List.First(list as list, optionaldefaultValue as any)as any 返回列表 ...

  6. set集合判断集合中是否有无元素_一文了解 JavaScript 中的 Set(集合)- 对 Set 的扩展...

    阅读全文需要 4 分钟.主要介绍对 ES6 中的 Set 集合方法的扩展.阅读本文后,你能创建出对 Set 方法扩展,并且结合下期内容,将其发布到 NPM 中. 往期回顾 一文了解 JavaScrip ...

  7. java中字符串的创建_【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  8. python向mysql中添加数据标签_用python在MySQL中写入数据和添加数据

    在笔者之前的博文中,已介绍了用python连接与mysql数据库的知识.包括如何安装python连接mysql的pymysql包,如何通过cusor语句将python与mysql连接起来,以及如何用p ...

  9. IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)

    文章目录 IDEA 如何获取项目的模块数据 从项目源中选择模块加入当前项目中 如何移除项目中的模块 方式一,选择模块的根目录(Content Root),鼠标右键 Remove 方式二,打开[项目结构 ...

最新文章

  1. OU/Group/Group Policy组织单元、组和组策略
  2. php对称算法_php里简单的对称加密算法
  3. 闲鱼对Flutter-Native混合工程解耦的探索
  4. 腾讯视频视频下载_如何下载腾讯视频
  5. 高温保护_【美的空调维修案例】P2压缩机高温保护 不定时出现P1过欠压保护...
  6. 最新公开的SEO优化公式
  7. ehcache 的 diskStore path
  8. gnu grub version 2.0.2设置启动顺序_如何修复grub异常
  9. 自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,quot;掏粪男孩Gifquot;顺便再提提onWindowFocusChanged)...
  10. 两个常见小故障的修复
  11. 网页小工具(学习中国象棋)
  12. Adminlte数据分页设置
  13. c3300 京瓷km5050_京瓷复印机通用维修代码2
  14. xlsxwriter去掉网格线_用XlsxWriter设置Excel的表格边框
  15. 夜神模拟器99%卡死打不开问题
  16. 舆情传染病时空分析文献阅读笔记
  17. OSPF——LSA讲解
  18. 转:宁愿在真实前颤抖,也不愿在催泪弹下哭泣(今何在)
  19. 系统问题导致的笔记本部分按键失灵
  20. PS制作各种证件照及换背景色

热门文章

  1. CF755G-PolandBall and Many Other Balls【倍增FFT】
  2. P4357-[CQOI2016]K远点对【K-Dtree】
  3. CF966E-May Holidays【虚树,分块】
  4. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  5. P1090-合并果子【离散化,队列,时间复杂度O(n)】
  6. SpringCloud Greenwich(七)集成dubbo先启动消费者(check=false),然后启动提供者无法自动发现注册
  7. 一篇文章彻底了解清楚什么是负载均衡
  8. jsoup解析HTML用法小结
  9. 漫画:什么是HashMap
  10. 0-MyBatis简介