js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI
js中使用camel框架
序幕
我最近在博客上發(fā)表了使用CDI注入Kubernetes服務(wù)的信息 。 在本文中,我將更進(jìn)一步,將Apache Camel帶入圖片。 因此,我將使用Camel的CDI支持來連接我的組件和路由,以及Fabric8的CDI擴(kuò)展來自動(dòng)將Kubernetes服務(wù)注入到我的組件中。
我將重用以前的文章中的內(nèi)容(如果您還沒有讀過,請(qǐng)仔細(xì)閱讀),以構(gòu)建一個(gè)獨(dú)立的駱駝cdi應(yīng)用程序,該應(yīng)用程序?qū)⑼ㄟ^http (向jdbc并返回的簡(jiǎn)單http)公開數(shù)據(jù)庫的內(nèi)容再次) 。 一切將在Docker中運(yùn)行,而編排將由Kubernetes完成。
所以第一件事。 駱駝和CDI的工作原理…。
駱駝CDI注冊(cè)中心
Apache Camel正在使用注冊(cè)表的概念。 它使用注冊(cè)表來查找路由所需的對(duì)象。 這些查找可以按類型或名稱進(jìn)行。
注冊(cè)表最常見的用途是在處理端點(diǎn)uri時(shí),駱駝將解析該方案,并將按名稱查找注冊(cè)表以查找適當(dāng)?shù)慕M件。 其他情況涉及按名稱將bean引用傳遞給端點(diǎn),依此類推……
換句話說, Apache Camel可以在運(yùn)行時(shí)在bean注冊(cè)表上執(zhí)行查找。
任何需要與Apache Camel完美配合的擴(kuò)展都需要為bean提供可預(yù)測(cè)的名稱。
@Alias批注
對(duì)于任何給定的服務(wù), Fabric8的CDI擴(kuò)展都可以注冊(cè)一個(gè)以上的bean (每種服務(wù),每種協(xié)議每個(gè)協(xié)議一個(gè)) 。 因此, 不可能有以服務(wù)命名的服務(wù)bean。 用戶也不必記住內(nèi)部使用的命名約定。
“那么,Fabric8如何與依賴“按名稱”查找的框架一起玩呢?”
Fabric8提供@ Alias批注,該批注允許開發(fā)人員顯式指定注入服務(wù)的Bean名稱。 這是一個(gè)例子:
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);} }“這會(huì)發(fā)生什么?”
Fabric8 cdi擴(kuò)展將收到一個(gè)事件,該事件存在類型為String的注入點(diǎn),帶有2個(gè)限定符:
因此,當(dāng)它為該服務(wù)創(chuàng)建bean和生產(chǎn)者時(shí),將使用“ mysqldb”作為名稱。 這就是控制Fabric8托管bean并使名稱查找成為可能的原因。
使用@Factory創(chuàng)建或配置Camel組件或端點(diǎn)
在上一篇文章中,我介紹了一些示例,說明如何使用Fabric8的@ Factory批注創(chuàng)建jdbc連接。 現(xiàn)在,我將為jdbc數(shù)據(jù)源創(chuàng)建一個(gè)工廠,然后將其添加到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;}現(xiàn)在,如果我們想從Apache Camel端點(diǎn)引用此數(shù)據(jù)源,則必須將數(shù)據(jù)源的“ 名稱 ”指定給端點(diǎn)uri。 例如“ jdbc:custmersds ”,其中customersds是數(shù)據(jù)源的名稱。
“但是,如何命名fabric8托管數(shù)據(jù)源?”
這就是@Alias節(jié)省一天的方式:
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應(yīng)用程序的典型RouteBuilder。 它的特殊之處在于我們注入了一個(gè)名為“ customersds”的數(shù)據(jù)源。
“誰提供數(shù)據(jù)源?”
簡(jiǎn)短的答案 : Fabric8 。
答案不是那么簡(jiǎn)短 : @ ServiceName (“ mysql”)注釋告訴Fabric8數(shù)據(jù)源引用了“ mysql” Kubernetes服務(wù)。 Fabric8將為我們獲取該服務(wù)的URL。 由于字段的類型不是字符串,也不是URL,而是數(shù)據(jù)源,因此Fabric8將查找能夠?qū)⒆址D(zhuǎn)換為數(shù)據(jù)源的@ Factory方法。 在我們的例子中,它將找到確實(shí)做到這一點(diǎn)的DataSourceFactory類。 由于這還不夠出色 ,因此DataSourceFactory還接受@ Configuration MysqlConfiguration ,以便我們可以指定數(shù)據(jù)庫名稱,憑據(jù)等內(nèi)容(請(qǐng)參閱我的上一篇文章)。
配置數(shù)據(jù)源
在開始解釋如何配置數(shù)據(jù)源之前,讓我退后一步,回顧一下我以前的文章中的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;}}正如我在上一篇文章中提到的,我們可以使用環(huán)境變量來將配置傳遞給我們的應(yīng)用程序。 請(qǐng)記住,此應(yīng)用程序旨在存放在Docker容器中……。
MysqlConfiguration包含3個(gè)字段:
因此,我們需要3個(gè)環(huán)境變量,每個(gè)字段一個(gè)。 然后,我們的DataSourceFactory將傳遞一個(gè)的實(shí)例
可以從環(huán)境中檢索具有任何值的MysqlConfiguration ,以便它創(chuàng)建實(shí)際的DataSource。
“但是如何重用MysqlConfiguration來配置多個(gè)不同的服務(wù)?”
因此,想法是@ Factory和@ Configuration是可重用的。 畢竟不需要將工廠和模型類綁定到基礎(chǔ)服務(wù),對(duì)嗎?
Fabric8通過使用服務(wù)名稱作為環(huán)境變量的前綴來提供幫助。 它在運(yùn)行時(shí)執(zhí)行此操作,并且工作方式如下:
因此,為了使我們的示例正常工作,我們需要將應(yīng)用程序打包為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"}]}現(xiàn)在,如果我們需要在同一容器內(nèi)創(chuàng)建一個(gè)額外的數(shù)據(jù)源(例如,從jdbc到j(luò)dbc的橋),則只需為其他Kubernetes指定其他環(huán)境變量即可 。 現(xiàn)在,如果服務(wù)的名稱是“ 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"}]}…我們可以通過在項(xiàng)目中添加帶有限定符@ ServiceName (“ mysql-target”)的注入點(diǎn)來使用它。
您可以在Fabric8快速入門中找到類似的示例。 更具體地說,就是camel-cdi-amq快速入門 。
敬請(qǐng)關(guān)注
我希望你喜歡它。 不久將有更多相關(guān)主題(包括為在Kubernetes上運(yùn)行的Java應(yīng)用程序編寫集成測(cè)試)。
翻譯自: https://www.javacodegeeks.com/2015/06/using-camel-cdi-inside-kubernetes-with-fabric8.html
js中使用camel框架
總結(jié)
以上是生活随笔為你收集整理的js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: huni凯南天赋(新赛季凯南天赋)
- 下一篇: Lumia 950 XL刷入Win10