硬编码地址为什么走不通
两个服务互相调用时,如果把对方地址写死在配置里,问题马上就来了:服务扩容加了三台机器,调用方配置就得跟着改;某台机器挂了,调用方还一直往死地址发请求。服务实例数量是动态的、地址是会变的,靠人工维护地址清单在微服务规模下根本不可行。
解决办法是引入一个"登记簿":服务启动时把自己的地址报到登记簿,调用方不问具体地址,而是问登记簿"某某服务现在有哪些健康实例"。这个登记簿就是注册中心,顺带还能统一管理配置。
- 注册发现服务上报地址、消费方按名寻址。
- Nacos同时当注册中心与配置中心。
- EurekaAP 优先的经典注册中心。
- 配置中心配置改动后动态推送、免重启。
注册与发现的基本流程
流程分三步:服务提供者启动时,把自己的 服务名 + IP:端口 + 元数据 注册到注册中心;消费者从注册中心拉到一份该服务的实例列表,并在本地做负载均衡;注册中心定期探测实例健康,把宕机的实例剔除。这样扩容、缩容、故障摘除对调用方都是透明的。
Nacos:注册中心上手
Nacos 是国内最常用的选择,一个组件同时承担注册中心和配置中心。Spring Cloud 接入很简单:引入依赖、配置 Nacos 地址、启动类加注解,服务就自动注册上去了。
spring:
cloud:
nacos:
discovery:
server-addr: nacos:8848 # 注册中心地址
在 Nacos 控制台能直接看到所有服务的实例列表、健康状态,并能手动下线某个实例用于灰度发布。
Eureka 与 AP 优先
Eureka 是 Spring Cloud 原生的注册中心,设计上AP 优先:注册中心节点之间互相复制,哪怕某个节点网络分区了,它依然能响应注册和查询请求,宁可返回稍旧的实例列表,也不让整个注册服务不可用。Nacos 则可在 CP/AP 间切换。对可用性要求高、能容忍短暂脏数据的场景,AP 优先往往更稳。
健康检查与上下线
注册中心靠心跳判断实例死活:实例定期发心跳,超过阈值没收到就标记为不健康并摘除。上线、下线要优雅——发布新版本时先从注册中心摘流量、等在途请求处理完,再停进程,避免调用方拿到正在关闭的实例。
配置中心:动态刷新
配置散落在各个服务的本地文件里,改一个阈值就得重新打包发布。配置中心把配置集中托管,应用启动时拉取,配置改动时通过长轮询推送到应用,业务代码加上 @RefreshScope 就能在不重启的情况下让新配置生效。开关、限流阈值、灰度比例这类经常变的参数,放配置中心最省事。
注册中心怎么选
- 国内生态、想注册和配置一套搞定 → Nacos。
- 老 Spring Cloud 体系、AP 优先 → Eureka。
- 强一致要求高 → 考虑 etcd / ZooKeeper 类 CP 方案。
对绝大多数中小团队,Nacos 一个顶俩,是最省心的起点。
落地清单
- 服务地址绝不硬编码,一律走注册中心按名寻址。
- 注册中心集群部署,别单点。
- 配好健康检查与优雅上下线,发布时先摘流量。
- 频繁变动的开关和阈值放到配置中心,动态刷新。
- 消费方本地缓存实例列表,注册中心抖动时不至于全挂。