最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中 Upstream 如何配置 service 发现机制对接微服务架构
时间:2026-08-30 11:01:49 编辑:袖梨 来源:一聚教程网
Nginx需借助外部机制实现服务发现:①DNS SRV解析(≥1.9.13)、②nginx-upsync-module拉取注册中心、③OpenResty+Lua主动调用API、④K8s Ingress Controller自动同步。
Nginx 本身不支持原生服务发现,必须通过外部机制或增强方案实现与微服务注册中心(如 Nacos、Consul、Eureka)的对接。核心思路是:让 upstream 的节点列表能随服务实例上下线自动更新,而非静态写死。
用 resolver + DNS SRV 实现轻量动态发现
适用于中小规模、已接入 DNS 服务发现体系的场景(如 Consul DNS、CoreDNS)。Nginx 通过定期解析 SRV 记录获取实例地址和端口:
- 在 http 块中配置全局 resolver,启用缓存控制:resolver 127.0.0.1 valid=5s;
- upstream 中使用 resolve 关键字:server myapp.service.consul resolve;
- 需确保 DNS 服务返回标准 SRV 记录(含 port 字段),且 Nginx 版本 ≥ 1.9.13
借助第三方模块(如 nginx-upsync-module)
这是开源环境下最成熟的动态 upstream 方案,支持从 Consul/Nacos/ZooKeeper 拉取实例列表并热更新:
- 编译时加入 nginx-upsync-module,启动后通过 HTTP 接口(如 /upsync)获取 JSON 格式的服务列表
- 配置示例:upstream backend { upsync consul:8500/v1/health/service/user-service upsync_timeout=6m upsync_interval=5s upsync_fallback=stale; }
- 自动剔除不健康节点,支持 fallback 到本地缓存,避免注册中心故障导致流量中断
OpenResty + Lua 主动拉取注册中心
灵活性最强,适合需要自定义过滤、权重计算或灰度路由逻辑的场景:
- 在 init_worker_by_lua_block 中定时调用 resty.http 请求 Nacos API:GET /nacos/v1/ns/instances?serviceName=user-service
- 解析响应,提取 healthy=true 的实例 IP:port,存入 shared_dict 缓存
- 在 balancer_by_lua_block 中调用 balancer.set_current_peer(ip, port) 动态选节点
- 配合 TTL 控制刷新频率,避免对注册中心造成压力
对接 Kubernetes Ingress Controller
云原生环境下的标准实践,由 Ingress Controller(如 nginx-ingress)自动监听 Service/Endpoints 变更:
- 无需手动维护 upstream,Ingress 资源定义路径路由,Controller 自动同步后端 Pod 列表
- 支持就绪探针联动,Pod 未就绪时自动从 upstream 移除
- 若需自定义 upstream 行为(如加权、慢启动),可在 Ingress annotation 或 ConfigMap 中配置