Pulsar Proxy:理解其作用(简化客户端连接管理、增强安全性)和配置详解
在 Apache Pulsar 的生产部署中,Pulsar Proxy 是一个可选但非常重要的组件。它位于客户端(Producer/Consumer)和 Pulsar Broker 之间,作为反向代理网关,提供连接抽象、安全隔离和访问控制能力。
本文将深入解析 Pulsar Proxy 的核心作用、典型应用场景,并提供详细的配置与部署指南。
一、Pulsar Proxy 是什么?
Pulsar Proxy 是一个轻量级的无状态代理服务,它不参与消息的存储与路由,而是:
- 接收来自客户端的连接请求
- 将请求转发给后端的 Pulsar Broker
- 透明地代理 Producer 发送、Consumer 消费、Admin 操作等所有协议
✅ Proxy 本身不存储数据,也不管理 topic,仅负责网络层的请求转发。
二、Pulsar Proxy 的核心作用
1. 简化客户端连接管理(Connection Abstraction)
问题背景:
Pulsar 的 topic 是动态负载均衡的,可能在多个 Broker 之间迁移。客户端需要:
- 维护与多个 Broker 的连接
- 处理 topic 重定向(Topic Lookup)
- 在 Broker 故障时自动重连
这增加了客户端的复杂性,尤其在多租户、大规模部署中。
Proxy 如何解决:
- 客户端只需连接到 固定的 Proxy 地址(如
pulsar-proxy:6650) - Proxy 负责与后端 Broker 通信,完成 topic lookup 和请求转发
- 客户端无需感知 Broker 拓扑变化
✅ 优势:
- 客户端配置简化(只需一个连接地址)
- 支持 DNS 轮询或负载均衡器统一接入
- 适合云原生、Kubernetes 等动态环境
2. 增强安全性(Security Gateway)
问题背景:
- Broker 直接暴露在公网或内部网络中,存在安全风险
- 不同租户、应用需要不同的认证与授权策略
- 需要集中管理 TLS、认证、ACL
Proxy 如何增强安全:
- 统一入口:所有客户端流量经过 Proxy,Broker 可设置为内网访问
- 集中认证:Proxy 可处理 JWT、TLS、OAuth2 等认证,Broker 只需信任 Proxy
- ACL 控制:可在 Proxy 层实现租户隔离、IP 白名单、速率限制
- TLS 终止:Proxy 可做 TLS 解密,减轻 Broker 负担
✅ 典型场景:
- 多租户 SaaS 平台
- 公网接入(如移动端、IoT 设备)
- 合规要求(如金融、医疗)
3. 支持多协议接入(Protocol Translation)
虽然 Pulsar 原生使用二进制协议(Pulsar Protocol),但 Proxy 可扩展支持:
- Kafka 兼容模式(通过 Pulsar Kafka Proxy)
- WebSocket 支持(用于浏览器客户端)
注意:标准 Pulsar Proxy 不直接支持 Kafka 协议,需额外部署
pulsar-kafka-proxy。
4. 连接复用与资源隔离
- Proxy 可复用与 Broker 的连接,减少 Broker 的连接压力
- 支持按租户、命名空间限制连接数、带宽
- 防止恶意客户端耗尽 Broker 资源
三、Pulsar Proxy 的部署架构
+----------------+ +----------------+ +------------------+
| Producer | | Consumer | | Admin Client |
+-------+--------+ +-------+--------+ +--------+---------+
| | |
| | |
v v v
+-------------------------------------------------------------+
| Pulsar Proxy Cluster |
| (可部署多个,前挂 LB: DNS, Nginx, F5, Kubernetes Service) |
+-------------------------------------------------------------+
| | |
| (内部连接) | (内部连接) | (内部连接)
v v v
+----------------+ +----------------+ +------------------+
| Pulsar | | Pulsar | | Pulsar |
| Broker 1 | | Broker 2 | | Broker N |
+----------------+ +----------------+ +------------------+
| | |
+----------+-----------+-----------------------+
|
v
+--------------------------+
| Apache BookKeeper |
| (Storage Layer) |
+--------------------------+
✅ 建议:
- Proxy 部署为独立集群,前挂负载均衡器(如 Nginx、Kubernetes Service)
- Broker 不对外暴露,仅允许 Proxy 和内部服务访问
四、Pulsar Proxy 配置详解(proxy.conf)
1. 基本配置
# Proxy 监听地址
serviceUrl=pulsar://broker1:6650,broker2:6650,broker3:6650
serviceUrlTls=pulsar+ssl://broker1:6651,broker2:6651,broker3:6651
# Proxy 绑定地址(对外服务)
bindAddress=0.0.0.0
advertisedAddress=pulsar-proxy-host # 外部可见地址
# 监听端口
brokerServicePort=6650
brokerServicePortTls=6651
2. 安全配置(TLS + Authentication)
# 启用 TLS
tlsEnabled=true
tlsCertificateFilePath=/path/to/proxy.cert.pem
tlsKeyFilePath=/path/to/proxy.key-pk8.pem
tlsTrustCertsFilePath=/path/to/ca.cert.pem
# 启用认证
authenticationEnabled=true
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderToken
# JWT 配置
tokenPublicKey=data:;base64,ABCDEFGHIJKLMNOPQRSTUVWXYZ==
# 启用授权
authorizationEnabled=true
authorizationProvider=org.apache.pulsar.broker.authorization.PulsarAuthorizationProvider
3. 连接与线程配置
# Netty IO 线程数
numIOThreads=8
# 工作线程数
numWorkerThreads=8
# 最大连接数
maxConcurrentIncomingRequestsPerClient=10000
4. 租户与命名空间隔离(多租户)
# 允许访问的租户(白名单)
superUserRoles=admin,proxy-admin
# 命名空间级别 ACL(需配合 Broker 配置)
forwardAuthorizationCredentials=true # 将客户端凭证转发给 Broker
✅
forwardAuthorizationCredentials=true是关键,Proxy 不做鉴权决策,而是将原始凭证(如 JWT)转发给 Broker 处理。
五、启动与部署
1. 启动 Proxy
# 在每个 Proxy 节点执行
bin/pulsar proxy
日志路径:logs/pulsar-proxy-*.log
2. Kubernetes 部署示例(Deployment + Service)
apiVersion: apps/v1
kind: Deployment
metadata:
name: pulsar-proxy
spec:
replicas: 3
selector:
matchLabels:
app: pulsar-proxy
template:
metadata:
labels:
app: pulsar-proxy
spec:
containers:
- name: proxy
image: apachepulsar/pulsar:3.0.0
command: ["bin/pulsar", "proxy"]
ports:
- containerPort: 6650
- containerPort: 8080
env:
- name: PULSAR_MEM
value: "-Xms2g -Xmx2g"
apiVersion: v1
kind: Service
metadata:
name: pulsar-proxy
spec:
type: LoadBalancer
ports:
- port: 6650
targetPort: 6650
name: broker
- port: 8080
targetPort: 8080
name: web
selector:
app: pulsar-proxy
六、客户端连接配置
客户端只需连接 Proxy,无需感知 Broker:
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://pulsar-proxy:6650") // 指向 Proxy
.authentication(AuthenticationFactory.token("token-jwt"))
.build();
✅ 优势:
- 客户端配置简单
- 支持 DNS 轮询:
pulsar://proxy-cluster:6650 - 可结合 Service Discovery(如 Consul、Eureka)
七、常见使用场景
| 场景 | Proxy 价值 |
|---|---|
| 多租户平台 | 统一接入、租户隔离、配额控制 |
| 公网接入 | 安全网关、TLS 终止、防攻击 |
| Kubernetes | 通过 Service 统一暴露,避免 NodePort |
| 混合云 | 本地 Proxy 接入云端 Pulsar 集群 |
| 合规审计 | 集中日志、访问控制、IP 白名单 |
八、注意事项与最佳实践
| 项目 | 建议 |
|---|---|
| 性能开销 | Proxy 引入约 0.1~0.5ms 延迟,通常可忽略 |
| 高可用 | 至少部署 2 个 Proxy 实例,前挂 LB |
| 监控 | 监控 Proxy 的连接数、请求率、错误率 |
| 日志 | 开启 DEBUG 日志用于排错(生产环境关闭) |
| 版本兼容 | Proxy 与 Broker 版本应保持一致 |
九、总结
| 功能 | 说明 |
|---|---|
| 连接抽象 | 客户端只需连接 Proxy,无需管理 Broker 拓扑 |
| 安全网关 | 统一 TLS、认证、ACL,保护后端 Broker |
| 多租户支持 | 实现租户隔离、配额、白名单 |
| 协议扩展 | 支持 WebSocket、Kafka 兼容(需额外组件) |
✅ 是否需要部署 Proxy?
| 部署场景 | 建议 |
|---|---|
| 内部服务调用,网络可信 | 可选 |
| 多租户、SaaS 平台 | 强烈推荐 |
| 公网暴露、移动端接入 | 必须部署 |
| Kubernetes 环境 | 推荐(简化服务暴露) |
通过合理部署 Pulsar Proxy,可显著提升系统的安全性、可维护性和可扩展性。
📌 附:常用管理命令
# 查看 Proxy 状态
bin/pulsar-admin proxies list
# 查看连接统计
bin/pulsar-admin proxies stats
26

被折叠的 条评论
为什么被折叠?



