Neon proxy云端控制面

核心接口(ControlPlaneApi trait)

proxy 通过 ControlPlaneApi trait 与控制面通信,共有 4 个方法:

  1. get_role_access_control --- 获取角色密码
  • HTTP: GET {base}/get_endpoint_access_control?session_id=...&endpointish=<endpoint>&role=<role>

  • Header: Authorization: Bearer <control_plane_token>

  • 响应体 (GetEndpointAccessControl):

{

"role_secret": "<SCRAM secret>",

"allowed_ips": "8.8.8.8", "10.0.0.0/8",

"allowed_vpc_endpoint_ids": "vpce-xxx",

"block_public_connections": false,

"block_vpc_connections": false,

"project_id": 123,

"account_id": 1,

"rate_limits": {

"connection_attempts": { "tcp": {"rps": 10, "burst": 20} }

}

}

  • 注意: 如果 endpoint 不存在或无权限,返回 HTTP 404(proxy 会视为无密码 = 允许无密码连接)

  • role_secret 是 SCRAM 格式的密码哈希(SCRAM-SHA-256$<iterations>:<salt>:<stored_key>:<server_key>)

  1. wake_compute --- 获取计算节点连接信息
  • HTTP: GET {base}/wake_compute?session_id=...&endpointish=<endpoint>

  • 响应体 (WakeCompute):

{

"address": "192.168.1.100:5432",

"server_name": null,

"aux": {

"endpoint_id": "ep-xxx",

"project_id": "proj-xxx",

"branch_id": "br-xxx",

"compute_id": "compute-xxx",

"cold_start_info": "warm"

}

}

  • cold_start_info 枚举值: warm / vm_pool_hit / vm_pool_miss / unknown

  • address 格式: host:port(支持 IPv6 ::1:5432)

  • server_name 非空时 proxy 启用 SSL

  1. get_endpoint_jwks --- 获取 JWT 验证规则(可选,JWT 认证时才会调用)
  • HTTP: GET {base}/endpoints/{endpoint}/jwks?session_id=...

  • 响应体 (EndpointJwksResponse):

{

"jwks": [

{

"id": "rule-1",

"jwks_url": "https://auth.example.com/.well-known/jwks.json",

"provider_name": "auth0",

"jwt_audience": "my-app",

"role_names": 1, 2

}

]

}

  • 不使用 JWT 认证时可以返回空数组

管理通道(PostgreSQL 协议)

proxy 还暴露了一个本地管理 API(mgmt.rs),这是一个 PostgreSQL 兼容的连接,用于控制台重定向认证流程(console redirect auth)。

  • 接受 PostgreSQL 客户端连接

  • 查询体是一个 JSON 字符串,格式为 KickSession:

{

"session_id": "abc123",

"result": {

"Success": {

"host": "127.0.0.1",

"port": 5432,

"dbname": "postgres",

"user": "user",

"password": "pass",

"aux": { ... }

}

}

}

  • 如果你不走 console_redirect 认证流程,这个不需要实现。 默认使用 control plane token 认证时不会触发这个机制。

最小化实现总结

功能 必须? 说明
GET /get_endpoint_access_control ✅ 必须 提供角色密码 + IP 访问控制
GET /wake_compute ✅ 必须 提供计算节点地址
GET /endpoints/{ep}/jwks ❌ 可选 仅 JWT 认证时需要
PostgreSQL mgmt 接口 ❌ 可选 仅 console redirect 流程需要

最简要求:只需实现两个 HTTP GET 端点,支持 Bearer token 认证即可。proxy 内置了缓存、锁、限流等机制,控制面不需要关心这些。

proxy 代码中客户端侧已经完全实现,它调用的是外部控制面服务。梳理如下:

已有实现(proxy 作为客户端)

组件 文件 角色
ControlPlaneApi trait control_plane/mod.rs:164 定义接口(4个方法)
NeonControlPlaneClient control_plane/client/cplane_proxy_v1.rs 生产实现 --- 发 HTTP 请求到控制面
MockControlPlane control_plane/client/mock.rs 开发测试实现 --- 查本地 PostgreSQL
ControlPlaneClient enum control_plane/client/mod.rs 组合以上,对外暴露

proxy 侧不需要你写任何代码,它已经能:

  • 调用 get_role_access_control → GET {base}/get_endpoint_access_control?endpointish=...&role=...

  • 调用 wake_compute → GET {base}/wake_compute?endpointish=...

  • 调用 get_endpoint_jwks → GET {base}/endpoints/{ep}/jwks

  • 管理缓存、锁、限流、重试

需要你实现的(外部服务)

你需要构建一个独立的 HTTP 服务,响应上述 GET 请求。proxy 启动时通过 --control-plane-endpoint 参数指向你的服务地址。

启动 proxy 时指定你的控制面地址

proxy --control-plane-endpoint https://your-control-plane.local \

--control-plane-token <your-token>

总结

  • proxy 已经实现了所有调用逻辑(HTTP 请求发送、响应解析、缓存、错误处理)

  • 你需要实现的只是一个 HTTP 服务,返回符合协议格式的 JSON 响应

  • 这个服务不需要是 PostgreSQL,可以是任意 Web 框架(FastAPI、Express、Gin 等)

相关推荐
这个DBA有点耶11 小时前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G11 小时前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备11 小时前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远11 小时前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_9622186113 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren13 小时前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安13 小时前
MySQL-触发器
数据库·mysql
白远山13 小时前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro14 小时前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_9651481114 小时前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘