精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲免费av一区二区三区| 国内精品国语自产拍在线观看| 国产jk精品白丝av在线观看| 欧美aaa大片视频一二区| 国产精品卡一卡二| 国产精品国产精品| 老熟妇一区二区三区啪啪| 亚洲中无吗在线| 日韩精品一区二区视频| 中日韩av在线播放| av3级在线| 国产精品免费视频观看| 国产精品高清一区二区三区| 羞羞色院91蜜桃| 激情另类综合| 精品国产一区二区在线| 亚洲v在线观看| www.成人在线视频| 精品magnet| 天天干天天色天天爽| 青青草免费观看免费视频在线| 久久激情五月激情| 日本久久久a级免费| 九九九久久久久| 日韩欧美视频| 亚洲美女久久久| 四虎永久免费观看| 日韩欧国产精品一区综合无码| 欧美日韩国产中文字幕| 国产经典久久久| 在线日本中文字幕| 久久影视一区二区| 韩日午夜在线资源一区二区 | 欧美亚男人的天堂| 国产午夜福利在线播放| 任你弄在线视频免费观看| 中文字幕日本乱码精品影院| 免费日韩av电影| 狠狠综合久久av一区二区| 激情文学综合丁香| 国产精品色悠悠| 男人的天堂av网站| 国产精品一二| 国产做受高潮69| 18精品爽视频在线观看| 亚洲欧洲中文字幕| 精品激情国产视频| 国产精品成人69xxx免费视频| 狠狠色丁香婷婷综合影院| 亚洲国产精品va在线看黑人动漫 | 欧美性猛交bbbbb精品| 欧美特黄a级高清免费大片a级| 日韩最新中文字幕电影免费看| 亚洲v国产v欧美v久久久久久| 日韩av三区| 亚洲国产高潮在线观看| 一起草在线视频| 国产精品久久久久av蜜臀| 日韩欧美一区在线| 欧洲成人午夜精品无码区久久| 日韩精品一区二区三区免费视频| 欧美一区二区三区在| 思思久久精品视频| 久久在线观看| 欧美不卡视频一区| 国产精品久久久久久亚洲色| 另类ts人妖一区二区三区| 亚洲精品狠狠操| www.久久国产| 欧美精品尤物在线观看| 中文字幕在线日韩| caoporn91| 欧美日本一区| 4438全国亚洲精品在线观看视频| 六月丁香婷婷综合| 日韩高清中文字幕一区| 国产在线观看精品| 不卡视频免费在线观看| a级高清视频欧美日韩| 久久免费视频1| 在线日本视频| 一区二区三区高清在线| 岳毛多又紧做起爽| 99久久婷婷国产综合精品首页| 欧美剧情电影在线观看完整版免费励志电影 | av在线小说| 色狠狠色噜噜噜综合网| 伊人影院综合在线| 超碰在线亚洲| 国产亚洲精品日韩| 久久久久久久久久久网| 美女91精品| 亚洲综合精品伊人久久| 香蕉av在线播放| 国产精品乱人伦一区二区| 欧美国产视频一区| 日韩制服一区| 亚洲精品一区二区三区福利| 国产jjizz一区二区三区视频| 久久密一区二区三区| 午夜精品一区二区三区av| 国产精品无码一区| av在线这里只有精品| 夜夜爽99久久国产综合精品女不卡 | 国产中文字幕免费观看| 久久av影院| 欧美大胆人体bbbb| 2025中文字幕| 黑人操亚洲人| 久久久久久999| 91porny九色| 毛片av中文字幕一区二区| 国产伦精品一区二区| 91涩漫在线观看| 亚洲成人第一页| av丝袜天堂网| 亚洲综合网狠久久| 中文字幕一区二区三区电影| 亚洲熟女www一区二区三区| 日韩有码一区二区三区| 波多野结衣久草一区| 成年人视频网站在线| 亚洲国产毛片aaaaa无费看| 99视频在线视频| 欧美一性一交| 欧美精品在线网站| 亚洲中文字幕在线一区| wwww国产精品欧美| 超碰超碰超碰超碰超碰| 日韩一级二级| 日韩精品在线观看一区二区| 欧美激情精品久久久久久免费| 水蜜桃久久夜色精品一区的特点| aa日韩免费精品视频一| 午夜精品一区| 91福利国产成人精品照片| 91精品啪在线观看国产| 在线一区免费| 国产精品视频自拍| 免费资源在线观看| 午夜视频在线观看一区| 日韩欧美中文视频| 91精品国产成人观看| 国产精品一二三在线| 欧洲成人av| 福利精品视频在线| 91丝袜在线观看| 狠狠入ady亚洲精品经典电影| 国产综合福利在线| 欧美激情办公室videoshd| 欧美三级电影精品| www.99热| 日本三级亚洲精品| 另类视频在线观看+1080p| 懂色av一区| 欧美videos大乳护士334| 农村妇女精品一区二区| 久久9热精品视频| 亚洲高清视频一区| 国产成人精选| 最新91在线视频| 在线观看色网站| 中文字幕色av一区二区三区| 国产区二区三区| 成人一区不卡| 国产一区二区丝袜| 老司机午夜在线| 7777精品伊人久久久大香线蕉超级流畅 | 91精品福利视频| 久久久精品成人| 寂寞少妇一区二区三区| 中文字幕精品—区二区日日骚| 香蕉久久一区| 欧美高清视频在线观看| 视频一区 中文字幕| 亚洲成av人影院| 37p粉嫩大胆色噜噜噜| 久久国产精品久久w女人spa| 久久国产精品久久| 成人看片网站| 久久久91精品国产| 亚洲国产福利视频| 色婷婷久久综合| 一级免费黄色录像| 国产成人av影院| 欧美在线观看www| 精品一区二区三| 91深夜福利视频| 一本大道色婷婷在线| 伊人成人开心激情综合网| 国产露脸91国语对白| 亚洲成人黄色影院| 中文字幕第24页| 国产曰批免费观看久久久| xxxxxx在线观看| 国产综合久久久| 91系列在线观看| 美女高潮在线观看| 深夜成人在线观看| 日本免费不卡视频| 色综合久久久久综合体| 青娱乐国产精品| 91视频91自| 在线观看免费视频污| 日韩午夜在线| 影音先锋欧美资源| 日韩欧美中文字幕一区二区三区| 国产成人在线一区二区| sm国产在线调教视频| 亚洲精品美女久久久| 91丨porny丨在线中文 | 老司机午夜网站| 日韩高清三区| 7777精品伊久久久大香线蕉语言| 欧美精选视频一区二区| 欧美激情第99页| 91ph在线| 日韩高清av一区二区三区| 亚洲一卡二卡在线观看| 欧美日韩亚洲一区二| 手机在线免费看毛片| 国产日韩av一区| 99精品一区二区三区无码吞精| 免费一级欧美片在线观看| av高清在线免费观看| 欧美一区不卡| 91制片厂免费观看| av中文字幕一区二区| 国产欧美日韩一区二区三区| 国产95亚洲| 国产精品久久久久久中文字| caoporn视频在线| 欧美黑人狂野猛交老妇| 里番在线观看网站| 亚洲无亚洲人成网站77777| 欧美性猛交 xxxx| 日韩一本二本av| 久草热在线观看| 欧美视频一区二区| 中文字幕精品视频在线观看| 精品日韩视频在线观看| 久久影院一区二区| 亚洲精品国产一区二区精华液| 成人在线观看免费完整| 国产精品久久一卡二卡| 美女脱光内衣内裤| 久久夜色精品国产噜噜av| 一级少妇精品久久久久久久| 蜜桃久久精品一区二区| 日本在线一二三区| 日本不卡高清视频| 日韩av一二三四| 日韩国产在线观看一区| 九九视频精品在线观看| 日韩精品亚洲专区| 亚洲最大综合网| 国内精品伊人久久久久av一坑| 99sesese| 黄网站免费久久| 欧美激情国内自拍| 国产精品伊人色| a天堂视频在线观看| av在线不卡电影| 免费观看一级一片| 久久久久国产精品麻豆| 日本高清www| 国产精品国产三级国产三级人妇| 日韩在线视频网址| 亚洲精品乱码久久久久久| 精品小视频在线观看| 婷婷丁香久久五月婷婷| 中文字幕视频一区二区| 欧美精选在线播放| www.av黄色| 亚洲精品www久久久| 免费在线黄色网址| 亚洲天堂av在线免费| 午夜激情在线观看| 欧美肥婆姓交大片| 绿色成人影院| 国产精品久久不能| 成人av地址| 欧美亚洲丝袜| 91久久电影| 日韩a级在线观看| 韩国一区二区三区在线观看| 国产精品少妇在线视频| 久久精品99国产精品日本| 精产国品一区二区三区| 97精品国产97久久久久久久久久久久| 国产原创剧情av| 综合久久一区二区三区| 国产乡下妇女做爰视频| 日本久久一区二区三区| a级片在线视频| 亚洲精品xxx| av大大超碰在线| 日韩美女视频在线观看| 电影一区二区三区久久免费观看| 国产精品久久波多野结衣| 日韩av有码| 国产九九九九九| 麻豆精品一区二区综合av| 91精品啪在线观看国产| 国产精品国产三级国产专播品爱网 | 国产又粗又大又爽| 国产视频综合在线| 国产二区三区在线| 日韩av成人在线观看| 精品视频在线观看网站| 国产一区二区不卡视频| 99精品美女| 欧美两根一起进3p做受视频| 国产盗摄女厕一区二区三区| 在线观看日本中文字幕| 亚洲一区二区在线免费观看视频 | 久久精品一区| 久久久久99人妻一区二区三区| 国产欧美日韩三级| 91香蕉在线视频| 欧美精品99久久久**| 成人av一区| 国产91精品青草社区| 欧美成年网站| 永久久久久久| 久久精品国产在热久久| 免费毛片视频网站| 亚洲va欧美va国产va天堂影院| 91久久精品国产91性色69 | 91超碰中文字幕久久精品| 亚洲综合资源| 亚洲精品中文字幕在线| 国产视频一区免费看| 久久久久成人精品无码中文字幕| 亚洲欧洲精品天堂一级| 中文字幕永久在线| 国产视频欧美视频| 天堂av在线电影| 99视频日韩| 欧美精品日本| 又黄又爽又色的视频| 椎名由奈av一区二区三区| 国产露脸无套对白在线播放| 日韩中文字幕免费| 国产精品久久亚洲不卡| 欧美日韩一区二 | 肥臀熟女一区二区三区| 中文字幕最新精品| 午夜无码国产理论在线| 日韩欧美三级一区二区| 男男视频亚洲欧美| 日本综合在线观看| 欧美精选一区二区| 超碰在线免费播放| eeuss一区二区三区| 自拍偷拍欧美专区| www.污污视频| 亚洲尤物视频在线| 色wwwwww| 欧美在线观看网址综合| 久久综合另类图片小说| 99久久久无码国产精品6| 久久精品视频免费| 自拍偷拍色综合| 神马国产精品影院av| 麻豆精品在线| 久久精品视频16| 久久久久久久久一| 中文字幕精品无码一区二区| 一区二区福利视频| 在线播放成人| 欧美 日韩 国产精品| gogo大胆日本视频一区| 国产一区二区视频免费| 最近2019中文字幕一页二页| 亚洲欧洲日韩精品在线| 奇米777四色影视在线看| 91尤物视频在线观看| 黄色一区二区视频| 欧美成人黑人xx视频免费观看| 国产一区二区在线观| 五月丁香综合缴情六月小说| 久久精品亚洲精品国产欧美kt∨| 一区二区三区精彩视频| 欧美黑人xxxx| 日韩精品欧美激情一区二区| 男女污污视频网站| 亚洲一区二区在线视频| 男女网站在线观看| 91精品国产一区二区三区动漫| 亚洲国产电影| 日本欧美一区二区三区不卡视频| 在线精品观看国产| 男女在线视频| 少妇免费毛片久久久久久久久| 国产美女精品在线| 亚洲免费激情视频| 久久精品人人做人人爽| 午夜精品福利影院| 日本成人xxx|