js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI

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框架

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

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

相关文章

程序员必知的10个C语言技巧

点击蓝字关注我们硬件设计师最常见的工作内容,就是通过写代码来测试硬件。这10个C语言技巧(C语言仍然是常见的选择)可以帮助设计师避免因基础性错误而导致某些缺陷的产生,并造成维护方面的困扰。为了成功的推出一个产品&#xff0…

一万字详解C语言中长度为零的数组

点击蓝字关注我们零长度数组概念:众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性的扩展, 零长度数组(Arrays of Length Zero) 就是其中一个知名的扩展.多数情况下, 其应用在变长数组中, 其定义如下:struct Packet {int state…

计算机网络自顶向下方法实验报告,计算机网络自顶向下方法试验三报告.doc

计算机网络自顶向下方法试验三报告陕西师范大学 计算机网络 实验报告年级: 2010级 姓名: 陈翠萍    学号:实验日期: 2012.9.24实验名称:Wireshark Lab: HTTP1至7题总的截图:1. Is your browser runnin…

app访问java web_Java Web App体系结构

app访问java web我曾经利用Servlet,JSP,JAX-RS,Spring框架,Play框架,带有Facelets的JSF和一些Spark框架。 以我的拙见,所有这些解决方案都远非面向对象和优雅的。 它们都充满了静态方法,不可测试…

电路中滤波电容和退耦电容_详解电源滤波电路中的高频滤波电容电路

图2-12所示是电源滤波电路中的高频滤波电路。电路中,一个容量很大的电解电容C1(2200F)与一个容量很小的电容C2(0.01F)并联,C2是高频滤波电容,用来进行高频成分的滤波,这种一大一小两个电容相并联的电路在电源电路中十分常见。1.高…

计算机驱动空间不够,Win8.1系统如何释放驱动器空间解决可用空间不足问题

现在越来越多用户安装升级win8.1系统,在操作使用过程中难免遇到一些奇奇怪怪的问题。相信有很多win8.1系统用户会遇到电脑的可用空间不足的提示,用户感到很疑惑,自己的电脑又没装什么软件怎么会这么提示。有什么办法可以解决此问题&#xff0…

python编程入门单例_Python单例模式实例详解

本文实例讲述了Python单例模式。分享给大家供大家参考,具体如下: 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。 实现某个类只有一个实例的途径: 1,让一个全局变量使得一个对象被访问&a…

java 8入门与实践_30个Java入门技巧和最佳实践

java 8入门与实践Java是最流行的编程语言之一-无论是Win应用程序,Web应用程序,移动,网络,消费电子产品,机顶盒设备,Java随处可见。 在Java上运行的设备超过30亿。 据Oracle称 ,正在使用50亿张J…

css中会计算的属性,2017年12月聚合文章--calc() ---一个会计算的css属性 | 码友网

最近这个月一直在赶项目开发,遇到的问题和学到的前端知识没有更新到博客园,现在闲了下来,就整理一下前端知识。在项目开发中,在样式这方面花费的时间较多,因为针对于数字的变化特别多,本人不爱记数字&#…

C/C++ 中公认的三个难点

点击蓝字关注我们C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎是公认级别的。0x01 指针指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。指针之所以难理解,因…

python 字符串分割_如何使用python语言split方法对不同字符串分割

在JavaScript中,可以使用split()将字符串分割成字符串数组;而在python语言中,split()方法也可以将字符串进行分割,分割之后的结果放置在列表中。下面利用几个实例说明split()方法的用法,操作如下:工具/原料…

java 拼图_功能项目拼图将Java 9引入

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

win7 蓝牙4.0 ble驱动_初识物联网无线通信技术之蓝牙4.0BLE协议栈

[本文属原创,转载请附上原文出处链接。]一、需要的软件工具1、BLE协议栈(BLE-CC254x-1.4.0)2、IAR开发软件(IAR Embedded Workbench8.20.2)注:1.4.0协议栈使用8.20.2的iar版本,1.3.2协议栈等使用的是8.10.4的iar版本。二、BLE协议栈安装目录下…

spring javaee_开发人员对Spring vs JavaEE的看法

spring javaee在Java社区中,Spring vs JavaEE是一个永无止境的争论。 在这样的辩论中,人们组成一个团体,由两个传播者,建筑师和一个平台的核心粉丝组成,并且不断进行辩论。 参与辩论的人可能是负责平台选择的架构师。 …

C语言:谈谈指针!

点击蓝字关注我们指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程…

C/C++ 中的 #pragma once 作用是什么?

点击蓝字关注我们1、#pragma once有什么作用?为了避免同一个头文件被包含(include)多次,C/C中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,…

rowmapper_Spring Integration Jdbc RowMapper示例

rowmapperJDBC入站通道适配器的基本功能是执行SQL查询,提取数据并将以Message形式封装的结果集传递到本地通道。 您可以在JDBC入站通道适配器的示例中阅读有关此内容的更多信息。 有效负载的类型由行映射策略决定。 默认结果是产生类型为List的有效负载&#xff0c…

python做大数据的框架_Python+大数据计算平台,PyODPS架构手把手教你搭建

原文链接:http://click.aliyun.com/m/13965/ 在2016年10月的云栖社区在线培训上,来自阿里云大数据事业部的秦续业分享了《双剑合壁——Python和大数据计算平台的结合实战》。他主要介绍了数据分析和机器学习的方法、DataFrame整体架构以及基础API、前端、…

武魂觉醒s系列服务器,[多线]星河斗罗——新服开荒丨高程度剧情还原丨3D坐骑丨魂环丨武魂觉醒[1.12.2]...

[服务器介绍]星河斗罗 全新原创开荒斗罗大陆服务器前言:超高还原小说真实性,独特的武魂贴图,魂兽建模,坐骑建模,开放性冒险地图,让您更加体验斗罗大陆的真实性。进服送新手大礼包:装备&#xff…

C++ 的万能头文件,你知道多少?

点击蓝字关注我们C 中万能头文件 bits/stdc.h 的介绍很多小伙伴估计看有的代码会碰见没有多余的其它头文件比如 algorithm、cmath、iostream 而是用了一行 #include<bits/stdc.h> 这样的头文件并感到诧异&#xff0c;想这是什么。其实这是一个包含了 C 所有头文件的一个头…