Pulsar 客户端(`pulsar-client`)是 Apache Pulsar 提供的官方客户端 SDK Pulsar 客户端pulsar-client是 Apache Pulsar 提供的官方客户端 SDK用于与 Pulsar 消息系统进行交互。它支持多种编程语言如 Java、Python、Go、C、Node.js 等其中最成熟和常用的是Java 客户端org.apache.pulsar:pulsar-client而 Python 客户端pulsar-clientPyPI 包也广泛使用。核心功能支持 Producer生产者、Consumer消费者、Reader读取器三种角色支持多种订阅模式Exclusive、Shared、Failover、Key_Shared支持消息确认ack、重试、死信队列DLQ、延迟消息、事务需开启事务支持支持 TLS/SSL 加密、认证如 JWT、TLS client auth、OAuth2自动连接管理、负载均衡、分区发现对 topic-partitioned 场景透明异步/同步 API兼顾性能与易用性。Python 示例安装与基础使用pipinstallpulsar-clientimportpulsar clientpulsar.Client(pulsar://localhost:6650)producerclient.create_producer(my-topic)producer.send(bHello, Pulsar!)consumerclient.subscribe(my-topic,my-subscription)msgconsumer.receive()print(fReceived:{msg.data().decode()})consumer.acknowledge(msg)client.close()Java Maven 依赖简要dependencygroupIdorg.apache.pulsar/groupIdartifactIdpulsar-client/artifactIdversion3.3.0/version!-- 请使用最新稳定版 --/dependency⚠️ 注意事项客户端版本应尽量与 Pulsar 集群服务端版本保持一致或兼容参考 Pulsar 官方兼容性矩阵生产环境务必配置合理的ioThreads、listenerThreads、连接超时、重连策略及监控指标如pulsar_client_*Prometheus metricsPython 客户端底层基于 C 客户端封装需确保系统有对应 native 依赖如libpulsar.so/.dylib/.dll。在 Pulsar 客户端中配置 JWT 认证需客户端提供有效 JWT token并由服务端Pulsar Broker通过配置的 JWT provider如JwtAuthenticationProvider校验签名、有效期、issuer、audience 等字段。以下是Java 和 Python 客户端的完整配置方案及安全生命周期管理实践✅ 一、服务端前提Broker 配置确保conf/broker.conf启用 JWT 认证# 启用认证插件 authenticationEnabledtrue authenticationProvidersorg.apache.pulsar.broker.authentication.AuthenticationProviderToken # JWT 公钥或密钥路径推荐使用公钥验证 tokenPublicKey/path/to/public.key # RSA/EC 公钥PEM 格式 # 或使用对称密钥不推荐生产环境 # tokenSecretKeyfile:///path/to/secret.key # 可选强制指定 issuer/audience增强安全性 tokenIssuerhttps://auth.example.com tokenAudiencepulsar-cluster-1⚠️ 重启 Broker 生效并确保公钥文件可读、权限严格如600。✅ 二、客户端配置以 Java 和 Python 为例 Java 客户端pulsar-client 3.ximportorg.apache.pulsar.client.api.PulsarClient;importorg.apache.pulsar.client.impl.auth.AuthenticationFactory;PulsarClientclientPulsarClient.builder().serviceUrl(pulsar://broker.example.com:6650).authentication(AuthenticationFactory.token(()-{// 动态获取 token避免硬编码或长期缓存returnfetchAndRefreshToken();// 自定义逻辑见下文})).build(); Python 客户端frompulsarimportClientdefget_token():returnfetch_and_refresh_token()# 返回字符串 tokenclientClient(pulsar://broker.example.com:6650,authenticationAuthenticationToken(get_token))✅AuthenticationToken支持传入 callablePython或 SupplierJava实现按需刷新 token避免过期失败。✅ 三、安全的 Token 生命周期管理关键实践风险点安全对策❌ Token 硬编码或静态配置✅ 使用外部凭证服务如 HashiCorp Vault、K8s ServiceAccount JWT、OIDC introspection动态获取❌ Token 长期缓存超时后仍重用✅ 在get_token()中每次调用前检查exp声明剩余有效期 30s 则主动刷新❌ Token 泄露日志/内存 dump✅ 不打印 token使用SecureStringJava或secrets模块Python禁用 JVM/Python 内存 dump❌ 缺乏 token 失效机制✅ 服务端启用tokenPublicKey 短期 token建议maxAge15–30min配合 revocation list如 Redis 黑名单 示例Java 中安全的 token 刷新逻辑带缓存与线程安全privatefinalAtomicReferenceStringcachedTokennewAtomicReference();privatefinalScheduledExecutorServicerefreshSchedulerExecutors.newScheduledThreadPool(1);privateStringfetchAndRefreshToken(){StringtokencachedToken.get();if(token!null!isTokenExpired(token)){returntoken;}// 加锁避免并发重复刷新synchronized(this){tokencachedToken.get();if(token!null!isTokenExpired(token)){returntoken;}StringfreshcallAuthServerToGetToken();// HTTP POST to /oauth/tokencachedToken.set(fresh);// 提前 30 秒刷新预留网络延迟longexpiresInextractExpiresIn(fresh)-30_000;refreshScheduler.schedule(this::fetchAndRefreshToken,expiresIn,TimeUnit.MILLISECONDS);returnfresh;}} 提示Pulsar 2.10 支持tokenRefreshIntervalMs参数Java 客户端可自动轮询刷新需 token 支持refresh_token流程。✅ 四、调试与验证开启客户端 debug 日志log4j.logger.org.apache.pulsar.client.impl.authDEBUGBroker 日志检查认证失败原因如Invalid JWT token,Signature verification failed使用jwt.io手动解码 token确认exp,iss,aud,sub字段合规