精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手把手教你寫Spring Boot Starter

開發 前端
如果你看過 spring-kafka 的源代碼,那么你會發現所有代碼基本都是仿造其實現。一方面能夠閱讀 kafka client 在 spring 具體如何實現;同時通過編寫自己的 spring starter 模塊,學習 整個 starter 的實現過程。

哈嘍,大家好,我是了不起。

之前寫過關于 Apache Pulsar 的簡單示例,用來了解如何使用 Pulsar 這個新生代的消息隊列中間件,但是如果想要在項目中使用,還會欠缺很多,最明顯的就是 集成復雜,如果你用過其他消息中間件,比如 Kafka、RabbitMq,只需要簡單的引入 jar,就可以通過注解+配置快速集成到項目中。

開始一個 Pulsar Starter

既然已經了解了 Apache Pulsar,又認識了 spring-boot-starter,今天不妨來看下如何寫一個 pulsar-spring-boot-starter 模塊。

目標

寫一個完整的類似 kafka-spring-boot-starter(springboot 項目已經集成到 spring-boot-starter 中),需要考慮到很多 kafka 的特性, 今天我們主要實現下面幾個模板

  • 在項目中夠通過引入 jar 依賴快速集成
  • 提供統一的配置入口
  • 能夠快速發送消息
  • 能夠基于注解實現消息的消費

定義結構

└── pulsar-starter
├── pulsar-spring-boot-starter
├── pulsar-spring-boot-autoconfigure
├── spring-pulsar
├── spring-pulsar-xx
├── spring-pulsar-sample
└── README.md

整個模塊的結構如上其中pulsar-starter作為一個根模塊,主要控制子模塊依賴的其他 jar 的版本以及使用到的插件版本。類似于 Spring-Bom,這樣我們在后續升級 時,就可以解決各個第三方 jar 的可能存在版本沖突導致的問題。

  • pulsar-spring-boot-starter

該模塊作為外部項目集成的直接引用 jar,可以認為是 pulsar-spring-boot-starter 組件的入口,里面不需要寫任何代碼,只需要引入需要的依賴(也就是下面的子模塊)即可

  • pulsar-spring-boot-autoconfigure

該模塊主要定義了 spring.factories 以及 AutoConfigure、Properties。也就是自動配置的核心(配置項+Bean 配置)

  • spring-pulsar

該模塊是核心模塊,主要的實現都在這里

  • spring-pulsar-xx

擴展模塊,可以對 spring-pulsar 做更細化的劃分

  • spring-pulsar-sample

starter 的使用示例項目

實現

上面我們說到實現目標,現在看下各個模塊應該包含什么內容,以及怎么實現我們的目標

  • 入口 pulsar-spring-boot-starter

上面說到 starter 主要是引入整個模塊基礎的依賴即可,里面不用寫代碼。

<dependencies>
<dependency>
<groupId>com.sucl</groupId>
<artifactId>spring-pulsar</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>com.sucl</groupId>
<artifactId>pulsar-spring-boot-autoconfigure</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
  • pulsar-spring-boot-autoconfigure
  1. 添加 spring-boot 基礎的配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
  1. 定義自動配置類PulsarAutoConfiguration:
  • 引入Properties,基于EnableConfigurationProperties與spring-boot-configuration-processor解析 Properties 生成對應spring-configuration-metadata.json文件,這樣編寫 application.yml 配置時就可以自動提示配置項的屬性和值了。
  • 構建一些必須的 Bean,如 PulsarClient、ConsumerFactory、ConsumerFactory 等
  • Import 配置 PulsarAnnotationDrivenConfiguration,這個主要是一些額外的配置,用來支持后面的功能
@Configuration
@EnableConfigurationProperties({PulsarProperties.class})
@Import({PulsarAnnotationDrivenConfiguration.class})
public class PulsarAutoConfiguration {

private final PulsarProperties properties;

public PulsarAutoConfiguration(PulsarProperties properties) {
this.properties = properties;
}

@Bean(destroyMethod = "close")
public PulsarClient pulsarClient() {
ClientBuilder clientBuilder = new ClientBuilderImpl(properties);
return clientBuilder.build();
}

@Bean
@ConditionalOnMissingBean(ConsumerFactory.class)
public ConsumerFactory pulsarConsumerFactory() {
return new DefaultPulsarConsumerFactory(pulsarClient(), properties.getConsumer().buildProperties());
}

@Bean
@ConditionalOnMissingBean(ProducerFactory.class)
public ProducerFactory pulsarProducerFactory() {
return new DefaultPulsarProducerFactory(pulsarClient(), properties.getProducer().buildProperties());
}

}
  1. 配置 spring.factory

在目錄src/main/resources/META-INF下創建spring.factories,內容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.sucl.pulsar.autoconfigure.PulsarAutoConfiguration
  • spring-pulsar
  1. 添加 pulsar-client 相關的依賴
<dependencies>
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
</dependency>
</dependencies>
  1. 定義 EnablePulsar,之前說到過,@Enable 注解主要是配合 AutoConfigure 來做功能加強,沒有了自動配置,我們依然可以使用這些模塊的功能。這里做了一件事,向 Spring 容器注冊了兩個 Bean
  • PulsarListenerAnnotationBeanProcessor 在 Spring Bean 生命周期中解析注解自定義注解 PulsarListener、PulsarHandler,
  • PulsarListenerEndpointRegistry 用來構建 Consumer 執行環境以及對 TOPIC 的監聽、觸發消費回調等等,可以說是最核心的 Bean
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({PulsarListenerConfigurationSelector.class})
public @interface EnablePulsar {

}
  1. 定義注解,參考 RabbitMq,主要針對需要關注的類與方法,分別對應注解@PulsarListener、@PulsarHandler,通過這兩個注解配合可以讓我們監聽到關注的 TOPIC, 當有消息產生時,觸發對應的方法進行消費。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PulsarListener {

/**
*
* @return TOPIC 支持SPEL
*/
String[] topics() default {};

/**
*
* @return TAGS 支持SPEL
*/
String[] tags() default {};
}

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PulsarHandler {

}
  1. 注解@PulsarListener 的處理流程比較復雜,這里用一張圖描述,或者可以通過下面 github 的源代碼查看具體實現

圖片

flow

  • spring-pulsar-sample

按照下面的流程,你會發現通過簡單的幾行代碼就能夠實現消息的生產與消費,并集成到項目中去。

  1. 簡單寫一個 SpringBoot 項目,并添加 pulsar-spring-boot-starter
<dependencies>
<dependency>
<groupId>com.sucl</groupId>
<artifactId>pulsar-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

2.添加配置

cycads:
pulsar:
service-url: pulsar://localhost:6650
listener-topics: TOPIC_TEST

3.編寫對應消費代碼

@Slf4j
@Component
@PulsarListener(topics = "#{'${cycads.listener-topics}'.split(',')}")
public class PulsarDemoListener {

@PulsarHandler
public void onConsumer(Message message){
log.info(">>> 接收到消息:{}", message.getPayload());
}

}
  1. 向 Pulsar Broker 發送消息進行測試
@Slf4j
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {ContextConfig.class})
@Import({PulsarAutoConfiguration.class})
public class ProducerTests {

@Autowired
private ProducerFactory producerFactory;

@Test
public void sendMessage() {
Producer producer = producerFactory.createProducer("TOPIC_TEST");
MessageId messageId = producer.send("this is a test message");
log.info(">>>>>>> 消息發送完成:{}", messageId);
}

@Configuration
@PropertySource(value = "classpath:application-test.properties")
static class ContextConfig {
//
}
}
  1. 控制臺可以看到這樣的結果

2023-02-26 19:57:15.572  INFO 26520 --- [pulsar-01] c.s.p.s.listener.PulsarDemoListener : >>> 接收到消息:GenericMessage [payload=this is a test message, headers={id=f861488c-2afb-b2e7-21a1-f15e9759eec5, timestamp=1677412635571}]

知識點

  • Pulsar Client

基于 pulsar-client 提供的 ConfigurationData 擴展 Properties;了解 Pulsar Client 如何連接 Broker 并進行消息消費,包括同步消費、異步消費等等

  • spring.factories

實現 starter 自動配置的關鍵,基于 SPI 完成配置的自動加載

  • Spring Bean 生命周期

通過 Bean 生命周期相關擴展實現注解的解析與容器的啟動,比如 BeanPostProcessor, BeanFactoryAware, SmartInitializingSingleton, InitializingBean, DisposableBean 等

  • Spring Messaging

基于回調與 MethodHandler 實現消息體的封裝、參數解析以及方法調用;

源碼示例

??https://github.com/sucls/pulsar-starter.git??

結束語

如果你看過 spring-kafka 的源代碼,那么你會發現所有代碼基本都是仿造其實現。一方面能夠閱讀 kafka client 在 spring 具體如何實現;同時通過編寫自己的 spring starter 模塊,學習 整個 starter 的實現過程。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2019-11-12 10:50:13

Spring BootstarterJava

2021-06-29 12:27:19

Spring BootCAS 登錄

2025-02-19 08:00:00

SpringBootOllamaDeepSeek

2021-07-14 09:00:00

JavaFX開發應用

2011-05-03 15:59:00

黑盒打印機

2011-01-10 14:41:26

2025-05-07 00:31:30

2018-05-16 13:50:30

Python網絡爬蟲Scrapy

2018-05-16 15:46:06

Python網絡爬蟲PhantomJS

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

攔截系統調用

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2022-03-08 11:17:54

函數指針回調函數C語言

2022-08-11 07:32:51

Starter自動裝配

2018-05-22 16:28:46

Python網絡爬蟲URL去重
點贊
收藏

51CTO技術棧公眾號

亚洲视频电影| 欧美二区不卡| 日日噜噜夜夜狠狠视频欧美人 | 91网站在线看| 久久网站免费视频| 国产精品久久久午夜夜伦鲁鲁| 国产精品调教视频| 亚洲欧美日韩国产手机在线 | 人人草在线视频| 久久99国产精品麻豆| 亚洲成年网站在线观看| 中文字幕av日韩精品| 黄色大全在线观看| 国内精品久久久久久久影视简单| 亚洲午夜三级在线| 91久久久久久久久久久久久| 国产精品成人久久| 日韩中文字幕| 亚洲视频在线一区| 国产美女精品视频| 蜜桃av乱码一区二区三区| 久草在线视频资源| 91九色精品国产一区二区| 日韩欧美精品免费在线| 狠狠久久综合婷婷不卡| 精品一区二区三区人妻| 91精品国产自产在线丝袜啪| 一区二区三区中文字幕电影| 91视频8mav| 国产女主播喷水视频在线观看| 日韩深夜影院| 色综合色综合色综合 | 成人免费在线电影网| 亚洲欧美一区二区三区国产精品 | 国产欧美日韩成人| 欧美肥老太太性生活| 欧美日韩三级视频| 亚洲自拍三区| 四虎成人免费在线| 久久久久99| 亚洲欧美日韩中文在线| 亚洲人成无码www久久久| 韩国三级av在线免费观看| 久久天堂成人| 日韩色av导航| 久久久久亚洲av片无码v| 污视频在线看网站| 99久久久无码国产精品| 国产97在线亚洲| 久久久久久久久久久久| 欧美v亚洲v综合v国产v仙踪林| 国产精品第四页| 97久久人人超碰caoprom欧美| 精品少妇一二三区| 中文字幕av亚洲精品一部二部| 欧美大片一区二区| 免费在线观看的av网站| 午夜在线观看视频| 国产suv精品一区二区三区| 久久久亚洲网站| 久久精品国产亚洲av久| 亚洲综合伊人| 疯狂欧美牲乱大交777| 一区二区精品视频| 在线观看免费黄色| 成人av午夜影院| 国产精品久久久久久久久久久久久久| 国产真实乱在线更新| 国产乱人伦精品一区| 精品国产1区二区| 色综合天天色综合| 欧美家庭影院| 亚洲丰满少妇videoshd| 亚洲第一在线综合在线| 人妻精品无码一区二区| 日韩在线卡一卡二| 国产精品久久久久久久电影 | 99riav1国产精品视频| 伊人久久免费视频| 超碰91在线播放| 日韩精品av| 欧美午夜宅男影院在线观看| 日本熟妇人妻xxxxx| 国模视频一区| 亚洲第一精品在线| 乱妇乱女熟妇熟女网站| 国产鲁鲁视频在线观看特色| 91美女视频网站| 999国内精品视频在线| www.亚洲欧美| 久久精品国产网站| 国产99久久久欧美黑人| 色婷婷久久综合中文久久蜜桃av| 精品亚洲porn| 国产精品久久色| wwwxxx亚洲| 欧美午夜在线| 久久亚洲国产精品| 鲁丝一区二区三区| 99精品电影| 久久人人爽人人爽人人片av高清| 亚洲天堂一区在线| 久久人体视频| 欧美极品欧美精品欧美视频| 毛片久久久久久| 亚洲肉体裸体xxxx137| 亚洲二区在线播放视频| av网在线播放| 国产尤物精品| 欧美激情欧美激情在线五月| 欧美黑人猛猛猛| 国产精品久久久久久久久久10秀| 久久久久久国产免费| 成人免费一区二区三区| 粉嫩13p一区二区三区| 日本午夜精品一区二区三区| 婷婷在线观看视频| 国产乱码字幕精品高清av | 久久成人免费网站| 激情视频一区二区| 成人国产免费电影| 亚洲色图欧洲色图婷婷| 国产aaa一级片| 欧美电影在线观看一区| 日韩欧美中文一区二区| 久久精品国产露脸对白| **欧美日韩在线| 亚洲欧美国产一区二区三区| 久久久久久久久久99| 另类小说综合欧美亚洲| 欧美日韩高清在线一区| 国产一区二区三区不卡在线| 亚洲国产美女搞黄色| 国产性生活一级片| 香蕉成人app| 日韩亚洲欧美中文在线| 午夜视频网站在线观看| 久久男人中文字幕资源站| 日韩av一区二区三区美女毛片| www.成人.com| 亚洲精品高清视频在线观看| 午夜两性免费视频| 国产一区日韩| 清纯唯美亚洲综合| 中文字幕观看在线| 国产乱码精品一区二区三| 亚洲精品不卡| 亚洲电影有码| 日韩精品中午字幕| 农村妇女精品一区二区| 99riav1国产精品视频| 国产精品乱码视频| 精品影院一区| 色综合久久中文字幕综合网| 野外性满足hd| 日韩中字在线| 欧美激情欧美激情| 韩国av免费在线| 国产午夜亚洲精品午夜鲁丝片 | 亚洲自拍偷拍九九九| 男人插女人视频在线观看| **欧美日韩在线观看| 91精品国产综合久久精品麻豆 | 国内不卡的一区二区三区中文字幕| 91精品免费在线观看| 国产国语老龄妇女a片| 久久动漫网址| 日韩在线视频观看正片免费网站| 黄色一级免费视频| 日韩av一级片| 福利视频一区二区三区| 国产h视频在线观看| 亚洲一区在线观看视频| 亚洲精品第二页| 亚洲作爱视频| 欧洲精品码一区二区三区免费看| 精品亚洲美女网站| 日韩日本欧美亚洲| 女人18毛片水真多18精品| 欧美日韩美女在线观看| 在线观看国产精品一区| 精品一二三四区| 影音先锋成人资源网站| 四虎4545www精品视频| 色婷婷综合久久久久中文字幕1| 国产精品久久久久久免费| 一区二区三区不卡在线观看 | 99国产精品久久久| 精品国产三级a∨在线| 免费成人美女女| 自拍视频国产精品| 欧美一区二区三区不卡视频| 国产精品午夜久久| 成人在线免费观看av| 国产调教一区二区三区| 91久久久在线| 欧美大胆性生话| 久久精品中文字幕| 最近国语视频在线观看免费播放| 亚洲婷婷在线视频| 给我免费观看片在线电影的| 国产在线欧美| 欧美视频小说| 日韩中文一区二区| 国产精品国产福利国产秒拍| 丝袜在线视频| 国产一区二区三区视频在线观看| 国产精品视频免费播放| 国产精品第四页| 18禁裸乳无遮挡啪啪无码免费| 极品美女销魂一区二区三区免费| 欧美爱爱视频免费看| 香蕉久久网站| 91成人伦理在线电影| 国产精品迅雷| 亚洲欧美在线一区二区| 久久久久久在线观看| 亚洲欧美日韩电影| a天堂中文字幕| 成人丝袜视频网| 国产原创popny丨九色 | 欧美精品日韩一本| аⅴ天堂中文在线网| 青青青伊人色综合久久| 成人免费在线网| 中文久久电影小说| 国产欧美精品日韩精品| 亚洲精品**中文毛片| 亚洲免费电影一区| 国模人体一区二区| 91精品国产高清一区二区三区蜜臀| 精品国产xxx| 五月天婷婷综合| 美女久久久久久久久久| 成人免费视频一区| 亚洲妇女无套内射精| 伊人久久亚洲美女图片| 久久99蜜桃综合影院免费观看| 亚洲欧美小说色综合小说一区| 欧美美最猛性xxxxxx| 国模私拍视频在线| 日韩视频免费观看高清完整版 | 91精品黄色片免费大全| 一区二区视频播放| 欧美中文字幕一区二区三区亚洲| 亚洲欧美va天堂人熟伦| 久久你懂得1024| 91精品国产综合久| 久久色.com| 奇米777第四色| 亚洲制服少妇| 亚洲电影一二三区| 精品日韩欧美一区| 91欧美视频网站| 四虎国产精品免费久久| 欧美激情国内偷拍| 18+激情视频在线| 亚洲精品国精品久久99热一| 三级网站在线播放| 日韩欧美在线看| 久久99国产综合精品免费| 色综合色综合色综合色综合色综合| 天天操天天操天天操天天| 色哟哟一区二区在线观看| 无码人妻av免费一区二区三区| 色狠狠综合天天综合综合| 国产女人18水真多毛片18精品| 国产精品电影一区二区三区| 亚洲色图综合区| 亚洲一区二区三区自拍| 黄色激情视频在线观看| 中文字幕二三区不卡| www成人啪啪18软件| 中文字幕亚洲一区二区av在线| 日韩精品123区| 亚洲精品乱码久久久久久| 精品无码人妻一区二区三区| 午夜亚洲福利老司机| 91嫩草丨国产丨精品| 亚洲综合色婷婷| 少妇一级淫片免费放中国| 91精品1区2区| 国产精品久久婷婷| 精品粉嫩超白一线天av| 免费在线超碰| 亚洲成人网久久久| 男男激情在线| 久久久精品999| av在线理伦电影| 久久av.com| av小说在线播放| 日韩男女性生活视频| 亚洲国产综合在线观看| 国产精品午夜av在线| 国产一区国产二区国产三区| 99久re热视频精品98| 国产日韩亚洲欧美精品| 一本久道高清无码视频| 久久精品二区三区| 日本一二三四区视频| 99久久精品免费看国产免费软件| 欧美成人国产精品一区二区| 亚洲人妖av一区二区| 毛片在线免费视频| 欧美一区二视频| 九九在线视频| 国模精品系列视频| 精品亚洲a∨| 精品一区二区视频| 中文精品久久| www.亚洲高清| 免费观看在线色综合| 在线免费观看视频黄| 成人一区在线观看| 久久一级免费视频| 中文字幕一区二区三区不卡| 成年人免费看毛片| 欧美日韩国产一区二区| 国产一区二区小视频| 日韩av中文字幕在线免费观看| 蜜桃久久一区二区三区| 日韩在线观看网址| 男人皇宫亚洲男人2020| 国产精品污www一区二区三区| 久久资源中文字幕| 日韩一级片播放| 免费成人av在线| 黄色录像a级片| 亚洲一区中文日韩| 国产三级小视频| 色妞在线综合亚洲欧美| 欧美aa视频| 欧美日韩精品一区| 亚洲巨乳在线| 免费在线观看毛片网站| 波多野结衣中文字幕一区二区三区| 国产传媒免费在线观看| 欧美日韩免费一区二区三区| 国产在线电影| 国产精品69av| 亚洲欧美在线综合| 午夜精品亚洲一区二区三区嫩草| 欧美hentaied在线观看| 最近免费中文字幕中文高清百度| 成人av午夜电影| 精品小视频在线观看| 精品国产123| www.综合网.com| 国产免费一区二区| 成人精品影视| 人妻av无码专区| 亚洲尤物精选| 久久亚洲AV成人无码国产野外| 精品久久久一区二区| 香蕉视频黄在线观看| 91精品国产一区| 欧美videos粗暴| 中文字幕剧情在线观看一区| 六月丁香综合在线视频| 国产稀缺精品盗摄盗拍| 欧美一区二区福利在线| 国产一二三区在线观看| 99国精产品一二二线| 亚洲女娇小黑人粗硬| 欧美日韩亚洲第一| 欧美国产成人在线| 在线免费看91| 日韩成人av在线播放| 岛国av在线播放| 国产一区欧美二区三区| 农村少妇一区二区三区四区五区| 天堂一区二区三区 | 久久久久国产精品厨房| 日本一二三区在线观看| 欧美一区二区三级| 91黄页在线观看| 欧洲亚洲一区二区| 久久97超碰国产精品超碰| 久久久久香蕉视频| 日韩成人xxxx| 91亚洲视频| 老牛影视免费一区二区| 欧美日本二区| 性色av蜜臀av色欲av| 亚洲在线一区二区三区| 天天干天天色天天| 国产精品久久久久久久久久久久| 亚洲激情中文在线| 久久人妻少妇嫩草av无码专区| 日本韩国一区二区三区| 成人黄视频在线观看| 久久婷婷人人澡人人喊人人爽| 日本va欧美va精品| 青娱乐免费在线视频| 亚洲精品网站在线播放gif| xxx在线免费观看| 亚洲自拍小视频| 日韩国产欧美| 国产一卡二卡三卡四卡| 欧美自拍偷拍午夜视频|