自研 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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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