二、注册中心(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 上看附近餐厅列表 | 查询服务实例列表 |
注册中心就是美团后台系统,维护着所有餐厅(服务实例)的实时状态
