CSNotesCSNotes
MySQL
Java
SSM
Redis
学习路线
TODO
实用工具
GitHub
MySQL
Java
SSM
Redis
学习路线
TODO
实用工具
GitHub
  • 第一章 Spring 核心

    • 一、Spring 总览
    • 二、IoC 控制反转
    • 三、Bean 的生命周期
    • 四、注解(@Component / @Service / @Autowired)
    • 五、AOP 面向切面编程
    • 六、XML 配置方式
    • 七、Maven 依赖管理
    • 八、三层架构(Controller / Service / Dao)
  • 第二章 SpringMVC

    • 一、SpringMVC 总览
    • 二、DispatcherServlet 核心分发器
    • 三、@RequestMapping 注解
    • 四、@RequestParam 注解
    • 五、@RequestHeader 注解
    • 六、REST API 设计规范
  • 第三章 MyBatis

    • 一、常见存储介质
    • 二、数据库表与 Java 实体类的映射关系
    • 三、MyBatis 总览
    • 四、MyBatis XML 标签(select/if/where/foreach)
    • 五、MyBatis 一级缓存与二级缓存
  • 第四章 SpringBoot 自动装配

    • 一、SpringBoot 自动装配原理与 Starters
  • 第五章 单元测试

    • 一、JUnit 单元测试与 Mock
  • 第六章 SpringCloud 微服务

    • 一、微服务架构总览
    • 二、注册中心(Nacos / Eureka)
    • 三、API 网关(Gateway)
    • 四、服务容错与流量控制 Sentinel
    • 五、RPC 框架(Dubbo 等)
    • 六、MQ 消息队列在微服务中的应用

二、注册中心(Nacos / Eureka)

(一)注册实例

将服务实例加入注册表,记录注册时间和最后续约时间

(二)续约(心跳)

更新实例的最后续约时间,防止被过期清理

(三)下线实例

从注册表中移除指定实例

(四)过期清理

(五)实例

实例指的是一个正在运行的服务进程。

每个实例都有自己的

  • 服务名:user-service
  • 实例 ID:唯一标识
  • IP+ 端口:192.168.1.10:8080
  • 状态:健康/不健康

(六)为什么要注册?

提示

如果没有注册中心,订单服务要调用用户服务,需要硬编码写死 IP:192.168.1.10:8080

如果用户服务扩容到 3 台:订单服务不知道新 IP,只能调原来那台

如果某台机器宕机了,订单服务还在往死掉的 IP 发请求,报错

如果用户服务换端口,所有调用方都要改配置,重启

新增了 10 个服务,每个服务都要互相维护 IP 列表,运维噩梦

有了,注册中心

用户服务启动--》项注册中心发送注册请求(register)--〉告诉注册中心:“我在 192.168.1.10:8080 提供服务”

用户服务每 30 秒发送一次心跳(renew),告诉注册中心“我还活着”

订单服务要调用用户服务-》向注册中心查询(listByService)=〉拿到所有健康实例列表【192.168.1.10:8080、192.168.1.11:8080、192.168.1.12:8080】=》从列表中选一个调用(负载均衡)

用户服务实例宕机--〉90 秒没有心跳--》注册中心自动清理(evictExpired)-〉订单服务再也查不到这个死掉的实例

(七)注册中心解决的核心问题

问题解决方案
服务发现调用方动态获取服务提供方的地址列表,无需硬编码
健康检查通过心跳机制自动剔除不健康的实例
负载均衡基础拿到多个实例后,可以轮询/随机/按权重分发请求
弹性伸缩新增实例自动注册,下线实例自动摘除,对调用方透明
故障隔离某个实例挂了,只会影响该实例的流量,不影响整体

类比理解

现实场景微服务场景
美团 APP订单服务(调用方)
附近的餐厅用户服务(提供方)
餐厅有 3 家分店用户服务有 3 个实例
餐厅开门营业实例启动-》注册
餐厅每天向美团报备营业状态定期心跳续约
餐厅关门了实例下线/过期清理
你在 App 上看附近餐厅列表查询服务实例列表

注册中心就是美团后台系统,维护着所有餐厅(服务实例)的实时状态

编辑此页
上次更新: 2026/9/18 20:34
Prev
一、微服务架构总览
Next
三、API 网关(Gateway)