自研 Pulsar Starter:Winfun-Pulsar-Spring-Boot-Starter

自研 Pulsar Starter:Winfun-Pulsar-Spring-Boot-Starter

作者:Howinfun 2021-08-31 09:57:36

云计算 Pulsar 作为新生代云原生消息队列,越来越受到开发者的热爱;而我们现在基本上的项目都是基于 SpringBoot 上开发的,但是我们可以发现,至今都没有比较大众和成熟的关于 Pulsar 的 Starter,所以我们需要自己整一个,从而避免常规使用 Pulsar API 时产生大量的重复代码。

 [[420613]]

里程碑

版本功能点作者完成
1.0.0支持PulsarTemplate发送消息&支持自定义注解实例化Consumer监听消息howinfun
1.1.0支持动态开启/关闭Consumer消费线程池、支持自定义配置Consuemr消费线程池参数howinfun
1.2.0支持Spring容器停止时,释放Pulsar所有相关资源howinfunTODO
1.3.0支持多Pulsar数据源howinfunTODO
 

一、背景

Pulsar 作为新生代云原生消息队列,越来越受到开发者的热爱;而我们现在基本上的项目都是基于 SpringBoot 上开发的,但是我们可以发现,至今都没有比较大众和成熟的关于 Pulsar 的 Starter,所以我们需要自己整一个,从而避免常规使用 Pulsar API 时产生大量的重复代码。

二、设计思路

由于是第一版的设计,所以我们是从简单开始,不会一开始就设计得很复杂,尽量保留 Pulsar API 原生的功能。

2.1、PulsarClient

我们都知道,不管是 Producer 还是 Consumer,都是由 PulsarClient 创建的。

当然了,PulsarClient 可以根据业务需要自定义很多参数,但是第一版的设计只会支持比较常用的参数。

我们这个组件支持下面功能点:

  • 支持 PulsarClient 参数配置外部化,参数可配置在 applicatin.properties 中。
  • 支持 applicatin.properties 提供配置提示信息。
  • 读取外部配置文件,根据参数实例化 PulsarClient,并注入到 IOC 容器中。

2.2、Producer

Producer是发送消息的组件。

  • 这里我们提供一个模版类,可以根据需求创建对应的 Producer 实例。
  • 支持将 Topic<->Producer 关系缓存起来,避免重复创建 Producer 实例。
  • 支持同步/异步发送消息。

2.3、Consumer

Consumer是消费消息的组件。

  • 这里我们提供一个抽象类,开发者只需要集成此实现类并实现 doReceive 方法即可,即消费消息的逻辑方法。
  • 接着还提供一个自定义注解,自定义注解支持自定义 Consmuer 配置,例如Topic、Tenant、Namespace等。
  • 实现类加入上述自定义注解后,组件将会自动识别并且生成对应的 Consumer 实例。
  • 支持同步/线程池异步消费。

三、使用例子

3.1、引入依赖

  1. <dependency> 
  2.     <groupId>io.github.howinfun</groupId> 
  3.     <artifactId>winfun-pulsar-spring-boot-starter</artifactId> 
  4.     <version>1.1.0</version> 
  5. </dependency> 

 

3.2、加入配置

  1. pulsar.service-url=pulsar://127.0.0.1:6650 
  2. pulsar.tenant=winfun 
  3. pulsar.namespace=study 
  4. pulsar.operation-timeout=30 
  5. pulsar.io-threads=10 
  6. pulsar.listener-threads=10 

3.3、发送消息

  1. /** 
  2.  * 发送消息 
  3.  * @author: winfun 
  4.  **/ 
  5. @RestController 
  6. @RequestMapping("msg"
  7. public class MessageController { 
  8.  
  9.     @Autowired 
  10.     private PulsarTemplate pulsarTemplate; 
  11.     @Autowired 
  12.     private PulsarProperties pulsarProperties; 
  13.  
  14.     /*** 
  15.      * 往指定topic发送消息 
  16.      * @author winfun 
  17.      * @param topic topic 
  18.      * @param msg msg 
  19.      * @return {@link String } 
  20.      **/ 
  21.     @GetMapping("/{topic}/{msg}"
  22.     public String send(@PathVariable("topic") String topic,@PathVariable("msg") String msg) throws Exception { 
  23.         this.pulsarTemplate.createBuilder().persistent(Boolean.TRUE
  24.                 .tenant(this.pulsarProperties.getTenant()) 
  25.                 .namespace(this.pulsarProperties.getNamespace()) 
  26.                 .topic(topic) 
  27.                 .send(msg); 
  28.         return "success"
  29.     } 

3.4、消费消息

  1. /** 
  2.  * @author: winfun 
  3.  * @date: 2021/8/20 8:13 下午 
  4.  **/ 
  5. @Slf4j 
  6. @PulsarListener(topics = {"test-topic2"}, 
  7.                 threadPool = @ThreadPool( 
  8.                                         coreThreads = 2, 
  9.                                         maxCoreThreads = 3,  
  10.                                         threadPoolName = "test-thread-pool")) 
  11. public class ConsumerListener extends BaseMessageListener { 
  12.  
  13.     /** 
  14.      * 消费消息 
  15.      * @param consumer 消费者 
  16.      * @param msg 消息 
  17.      */ 
  18.     @Override 
  19.     protected void doReceived(Consumer<String> consumer, Message<String> msg) { 
  20.         log.info("成功消费消息:{}",msg.getValue()); 
  21.         try { 
  22.             consumer.acknowledge(msg); 
  23.         } catch (PulsarClientException e) { 
  24.             e.printStackTrace(); 
  25.         } 
  26.     } 
  27.  
  28.     /*** 
  29.      * 是否开启异步消费 
  30.      * @return {@link Boolean } 
  31.      **/ 
  32.     @Override 
  33.     public Boolean enableAsync() { 
  34.         return Boolean.TRUE
  35.     } 

四、源码

源码就不放在这里分析了,大家可到Github上看看,如果有什么代码上面的建议或意见,欢迎大家提MR。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/236257.html<

(0)
管理的头像管理
上一篇2025-04-21 22:35
下一篇 2025-04-21 22:36

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注