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 等)

相关推荐
AIgorithmGEEK4 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
唠点键盘之外的6 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
云和恩墨6 小时前
数据库监控简史:监控不止于告警——从图表大爆发到健康管理闭环
数据库
ly76896 小时前
MongoDB 事务开销实测:快照隔离下的写冲突、重试与分片事务边界
数据库·mongodb·事务·分片集群·快照隔离·写冲突
豆角焖肉6 小时前
Spring AOP 自定义注解实现系统操作日志
数据库·自定义注解·springaop·操作日志·aop 切面
金伟API10248 小时前
不会写复杂SQL怎么办?
数据库·sql
执笔为剑8 小时前
2.1.2-1、V8R3迁移到V8R6-Oracle兼容特性
数据库
geovindu8 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__8 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_931803759 小时前
MySQL 锁机制详解
数据库·mysql