日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用Fabric8在Kubernetes中使用Camel和CDI

發(fā)布時(shí)間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Fabric8在Kubernetes中使用Camel和CDI 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

序幕

我最近在博客上發(fā)表了使用CDI注入Kubernetes服務(wù)的信息 。 在本文中,我將更進(jìn)一步,將Apache Camel帶入圖片。 因此,我將使用Camel的CDI支持來(lái)連接我的組件和路由,以及Fabric8的CDI擴(kuò)展來(lái)自動(dòng)將Kubernetes服務(wù)注入到我的組件中。

我將重用我以前的文章中的內(nèi)容(如果您還沒有讀過(guò),請(qǐng)讀一讀),以構(gòu)建一個(gè)獨(dú)立的駱駝cdi應(yīng)用程序,該應(yīng)用程序?qū)⑼ㄟ^(guò)http公開數(shù)據(jù)庫(kù)的內(nèi)容(一個(gè)簡(jiǎn)單的http到j(luò)dbc并返回再次) 。 一切將在Docker中運(yùn)行,編排將由Kubernetes完成。

所以第一件事。 駱駝和cdi的工作原理…。

駱駝CDI注冊(cè)表

Apache Camel正在使用注冊(cè)表的概念。 它使用注冊(cè)表來(lái)查找路由所需的對(duì)象。 這些查找可以按類型或名稱進(jìn)行。

注冊(cè)表最常見的用法是在處理端點(diǎn)uri時(shí),駱駝將解析該方案,并將按名稱查找注冊(cè)表以查找適當(dāng)?shù)慕M件。 其他情況包括按名稱將bean引用傳遞給端點(diǎn),依此類推……

換句話說(shuō), 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è)限定符:

  • ServiceName的值為“ mysql ”。
  • 值為“ mysqldb ”的別名 。
  • 因此,當(dāng)它為該服務(wù)創(chuàng)建bean和生產(chǎn)者時(shí),將使用“ mysqldb”作為名稱。 這就是控制Fabric8托管bean并使名稱查找成為可能的原因。

    使用@Factory創(chuàng)建或配置Camel組件或端點(diǎn)

    在上一篇文章中,我介紹了一些示例,說(shuō)明如何使用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ù)源,則必須為端點(diǎn)uri指定數(shù)據(jù)源的“ 名稱 ”。 例如“ 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ù)源。

    “誰(shuí)提供數(shù)據(jù)源?”

    簡(jiǎn)短的答案 : Fabric8 。

    答案不是那么簡(jiǎn)短 : @ ServiceName (“ mysql”)注釋告訴Fabric8 DataSource引用了“ mysql” Kubernetes服務(wù)。 Fabric8將為我們獲取該服務(wù)的URL。 由于字段的類型不是字符串,也不是URL,而是數(shù)據(jù)源,因此Fabric8將查找能夠?qū)⒆址D(zhuǎn)換為數(shù)據(jù)源的@ Factory方法。 在我們的例子中,它將找到完全做到這一點(diǎn)的DataSourceFactory類。 由于這還不夠出色 ,因此DataSourceFactory還接受@ Configuration MysqlConfiguration ,以便我們可以指定數(shù)據(jù)庫(kù)名稱,憑據(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)境變量來(lái)將配置傳遞給我們的應(yīng)用程序。 請(qǐng)記住,此應(yīng)用程序旨在生活在Docker容器中……。

    MysqlConfiguration包含3個(gè)字段:

  • 環(huán)境變量USERNAME的字段用戶名
  • 環(huán)境變量PASSWORD的字段密碼
  • 環(huán)境變量DATABASE_NAME的字段databseName
  • 因此,我們需要3個(gè)環(huán)境變量,每個(gè)字段一個(gè)。 然后,我們的DataSourceFactory將被傳遞給
    可以從環(huán)境中檢索具有任何值的MysqlConfiguration ,以便它創(chuàng)建實(shí)際的DataSource。

    “但是如何重用MysqlConfiguration來(lái)配置多個(gè)不同的服務(wù)?”

    因此,其思想是@ Factory和@ Configuration是可重用的。 畢竟不需要將工廠和模型類綁定到基礎(chǔ)服務(wù),對(duì)嗎?

    Fabric8通過(guò)使用服務(wù)名稱作為環(huán)境變量的前綴來(lái)提供幫助。 它在運(yùn)行時(shí)執(zhí)行此操作,并且工作方式如下:

  • Fabric8擴(kuò)展發(fā)現(xiàn)帶有@ ServiceName注釋的注入點(diǎn)
  • 它將檢查目標(biāo)類型,并在需要時(shí)查找@ Factory 。
  • @ Factory接受服務(wù)URL和實(shí)例MysqlConfiguration
  • MysqlConfiguration將使用@ ServiceName的值作為環(huán)境變量前綴來(lái)實(shí)例化。
  • 因此,為了使我們的示例正常工作,我們需要將應(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"}]}

    …我們可以通過(guò)在項(xiàng)目中添加帶有限定符@ ServiceName (“ mysql-target”)的注入點(diǎn)來(lái)使用它。

    您可以在Fabric8快速入門中找到類似的示例。 更具體地說(shuō),就是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

    總結(jié)

    以上是生活随笔為你收集整理的使用Fabric8在Kubernetes中使用Camel和CDI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。