第 13 章:注册中心 & 客户端 —— 实现与设计图解 🖼️
本章目标:用图把「注册中心(Server)」和「客户端(Client)」怎么实现、怎么连、怎么选,一次讲透。
图用 Mermaid 画(GitHub / VS Code 预览可直接渲染)。看不到图时,每张图下方都有 ASCII 备用版。
13.1 先看一张总览图
一个通讯录(Server)+ 若干客户端(每个业务服务)。客户端启动时登记自己,调用别人时先查地址,再直接调。
ASCII 备用版:
┌──────────────────────────┐ │ Eureka Server :8761 │ 通讯录(1 套就够) │ 服务名 → 地址列表 │ └──▲───▲──────────▲───▲────┘ ①注册②心跳│ │③拉名单 │ │ ┌──────┘ └───┐ ┌──┘ └──────┐ ┌────┴─────┐ ┌────┴──┴────┐ │ service-a│◄──④真正调用────►│ service-b │ │ :8080 │ (不经过 Server) │ :8081 │ └──────────┘ └───────────┘
核心记忆点:注册/心跳/拉名单都跟 Server 打交道;真正的业务调用是客户端之间直连,不经过 Server。
13.2 启动顺序(时序图)
谁先启动、每一步发生什么,一图看懂。
ASCII 备用版:
Server 先起 → A 注册 → B 注册 → A/B 定时心跳 → A 问 Server:service-b 在哪? → Server 给地址 → A 直接调 B → B 返回
13.3 怎么实现「注册中心(Server)」
三步:引 server jar → 加@EnableEurekaServer→ 配置。
依赖(注意是-server)
implementation'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'启动类
@SpringBootApplication@EnableEurekaServer// ← 这个注解让它变成注册中心publicclassEurekaServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EurekaServerApplication.class,args);}}配置application.yml
server:port:8761eureka:client:register-with-eureka:false# 我是总台,不登记自己fetch-registry:false# 也不需要拉别人的名单server:enable-self-preservation:true# 自我保护(生产建议开,开发可关)启动后访问http://localhost:8761看到 Dashboard 即成功。
13.4 怎么实现「客户端(Client)」
三步:引 client jar → (可选注解)→ 配defaultZone指向 Server。
依赖(注意是-client)
implementation'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'// 如果要用服务名调用,加上 OpenFeignimplementation'org.springframework.cloud:spring-cloud-starter-openfeign'启动类
@SpringBootApplication@EnableFeignClients// 用 Feign 才需要;只注册不需要publicclassServiceAApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceAApplication.class,args);}}配置application.yml(关键在defaultZone)
spring:application:name:service-a# 我登记的名字(别人用它找我)eureka:client:service-url:defaultZone:http://localhost:8761/eureka/# ← 指向注册中心用「服务名」调用对方(不写 IP)
@FeignClient(name="service-b")// 写对方的 spring.application.namepublicinterfaceServiceBClient{@GetMapping("/api/hello")Stringhello();}13.5 Server vs Client 对比(别搞混)
| 维度 | 注册中心 Server | 业务服务 Client |
|---|---|---|
| 依赖 | ...eureka-server | ...eureka-client(+openfeign) |
| 注解 | @EnableEurekaServer | 一般不用 /@EnableFeignClients |
| 关键配置 | register-with-eureka=false | defaultZone指向 Server |
| 角色 | 被查询的「通讯录」 | 主动登记 + 查询的「用户」 |
13.6 怎么设计 / 怎么选(决策图)
要不要用注册中心?
选型对照(2026 视角)
| 方案 | 适合场景 | 说明 |
|---|---|---|
| 写死地址 | 服务极少、地址固定 | 最省事,无自动发现/负载均衡 |
| 单 Eureka Server | 学习 / 内网 / 开发 | 简单,但单点故障 |
| Eureka 集群 | 生产、高可用 | Server 互相注册,互为备份 |
| Nacos / Consul | 新项目、需配置中心 | 注册+配置一体,社区更活跃 |
详见
第08章-高可用集群.md(集群)与第11章-2026选型提醒.md(选型)。
13.7 高可用:注册中心集群长啥样
多个 Server互相注册、互为副本;客户端defaultZone填多个地址。
客户端配置(填多个,逗号分隔):
eureka:client:service-url:defaultZone:http://host1:8761/eureka/,http://host2:8762/eureka/注意:是「同一个注册中心的多个副本」,不是给每个业务服务各配一个注册中心。
13.8 本章小结
- 一张总览图记牢:注册/心跳/拉名单找 Server;真正调用客户端直连。
- Server =
eureka-serverjar +@EnableEurekaServer+register/fetch=false。 - Client =
eureka-clientjar +defaultZone指向 Server + 用服务名调用。 - 选型:服务少→写死;一般→单 Server;生产→Server 集群;新项目可考虑 Nacos。