自研 Pulsar Starter:winfun-pulsar-spring-boot-starter
原文:自研 Pulsar Starter:winfun-pulsar-spring-boot-starter
里程碑
| 版本 | 功能点 | 作者 | 完成 |
|---|---|---|---|
| 1.0.0 | 支持PulsarTemplate发送消息&支持自定义注解实例化Consumer监听消息 | howinfun | |
| 1.1.0 | 支持动态开启/关闭Consumer消费线程池、支持自定义配置Consuemr消费线程池参数 | howinfun | |
| 1.2.0 | 支持Spring容器停止时,释放Pulsar所有相关资源 | howinfun | TODO |
| 1.3.0 | 支持多Pulsar数据源 | howinfun | TODO |
一、背景
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、引入依赖
<dependency>
<groupId>io.github.howinfun</groupId>
<artifactId>winfun-pulsar-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
3.2、加入配置
pulsar.service-url=pulsar://127.0.0.1:6650
pulsar.tenant=winfun
pulsar.namespace=study
pulsar.operation-timeout=30
pulsar.io-threads=10
pulsar.listener-threads=10
3.3、发送消息
/**
* 发送消息
* @author: winfun
**/
@RestController
@RequestMapping("msg")
public class MessageController {
@Autowired
private PulsarTemplate pulsarTemplate;
@Autowired
private PulsarProperties pulsarProperties;
/***
* 往指定topic发送消息
* @author winfun
* @param topic topic
* @param msg msg
* @return {@link String }
**/
@GetMapping("/{topic}/{msg}")
public String send(@PathVariable("topic") String topic,@PathVariable("msg") String msg) throws Exception {
this.pulsarTemplate.createBuilder().persistent(Boolean.TRUE)
.tenant(this.pulsarProperties.getTenant())
.namespace(this.pulsarProperties.getNamespace())
.topic(topic)
.send(msg);
return "success";
}
}
3.4、消费消息
/**
* @author: winfun
* @date: 2021/8/20 8:13 下午
**/
@Slf4j
@PulsarListener(topics = {"test-topic2"},
threadPool = @ThreadPool(
coreThreads = 2,
maxCoreThreads = 3,
threadPoolName = "test-thread-pool"))
public class ConsumerListener extends BaseMessageListener {
/**
* 消费消息
* @param consumer 消费者
* @param msg 消息
*/
@Override
protected void doReceived(Consumer<String> consumer, Message<String> msg) {
log.info("成功消费消息:{}",msg.getValue());
try {
consumer.acknowledge(msg);
} catch (PulsarClientException e) {
e.printStackTrace();
}
}
/***
* 是否开启异步消费
* @return {@link Boolean }
**/
@Override
public Boolean enableAsync() {
return Boolean.TRUE;
}
}
四、源码
源码就不放在这里分析了,大家可到Github上看看,如果有什么代码上面的建议或意见,欢迎大家提MR。
自研 Pulsar Starter:winfun-pulsar-spring-boot-starter的更多相关文章
- Spring Boot Starter 介绍
http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...
- spring -boot s-tarter 详解
Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...
- Spring Boot (一): Spring Boot starter自定义
前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- Spring boot starter pom的依赖关系说明
Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...
- Spring Boot Starter列表
转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...
- 创建自己的Spring Boot Starter
抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...
- 自己写spring boot starter
自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...
- 自定义的Spring Boot starter如何设置自动配置注解
本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...
- 手把手教你定制标准Spring Boot starter,真的很清晰
写在前面 我们每次构建一个 Spring 应用程序时,我们都不希望从头开始实现具有「横切关注点」的内容:相反,我们希望一次性实现这些功能,并根据需要将它们包含到任何我们要构建的应用程序中 横切关注点 ...
随机推荐
- mybatis-7-缓存
1. 一级缓存: SqlSession 级别, 默认开启, 并且不能关闭 操作数据库是需要创建 SqlSession 对象, 在对象中有一个 HashMap 用于存储缓存数据, 不同的 SqlSess ...
- MySQL触发器笔记
当操作了某张数据表时,希望同时触发一些动作或行为,就可以使用触发器完成. 当操作微博表时,同时生成一条日志记录 -- 插入时触发 create trigger tri_weiboAdd after i ...
- Vulnhub -- DC1靶机渗透
信息收集 开启了 22端口,ssh服务 80,http服务 111,RPC服务 先观察80端口 发现采用的是Drupal的cms 目录爆破: 但是,没有找到可以直接利用的点 登录的页面进行SQL注入即 ...
- kubernetes 降本增效标准指南|ProphetPilot:容器智能成本管理引擎
作者 田奇,腾讯云高级工程师,专注大规模离在线混部,弹性伸缩,云原生成本优化,熟悉Kubernetes,关注云原生大数据.AI. 王孝威,腾讯云容器产品经理,热衷于为客户提供高效的 Kubernete ...
- Ubuntu 20.10安装WPS Office、更新Visual Studio Code以及卸载LibreOffice
打造 Ubuntu20.10办公环境,安装WPS Office2019 =================================================== WPS Office20 ...
- KMP子串匹配(只能匹配出唯一子串)
using namespace std; #include <iostream> #include<string> //自定义字符串存储结构String(包括char数组.le ...
- 深入刨析tomcat 之---第4篇 tomcat4.0连接池 实现原理
writedby 张艳涛
- 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性
本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...
- MySQL-20-MySQL优化
MySQL优化哲学 1 为什么优化? 为了获得成就感? 为了证实比系统设计者更懂数据库? 为了从优化成果来证实优化者更有价值? 但通常事实证实的结果往往会和你期待相反!优化有风险,涉足需谨慎! 2 优 ...
- Golang语言系列-05-数组和切片
数组和切片 数组 概念 数组是同一种数据类型元素的集合:数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变 例如:[5]int 和 [10]int 是不同的数组类型 使用时可以修改 ...