服务注册与发现是微服务架构中的核心组件,解决了服务实例动态管理的问题:
核心概念:
1. 服务注册(Service Registration)
- 服务启动时向注册中心注册自己的信息
- 注册信息包括:服务名、IP、端口、元数据等
- 定期发送心跳保持注册状态
2. 服务发现(Service Discovery)
- 客户端从注册中心获取服务实例列表
- 支持动态更新服务列表
- 实现负载均衡和故障转移
3. 健康检查(Health Check)
- 定期检测服务实例健康状态
- 自动剔除不健康的实例
- 支持主动和被动检查
主流注册中心对比:
1. Zookeeper
- 特点:基于 ZAB 协议的分布式协调服务
- 优势:
- 成熟稳定,社区活跃
- 强一致性(CP)
- 支持临时节点和持久节点
- 劣势:
- 性能相对较低
- 运维复杂
- 不支持 HTTP 接口
- 适用场景:对一致性要求高的场景
2. Eureka
- 特点:Netflix 开发的服务发现组件
- 优势:
- 简单易用,与 Spring Cloud 集成好
- 支持自我保护机制
- 高可用性(AP)
- 劣势:
- 已停止维护(2.x 版本)
- 一致性较弱
- 不支持跨数据中心
- 适用场景:Spring Cloud 微服务架构
3. Consul
- 特点:HashiCorp 开发的服务网格工具
- 优势:
- 功能全面(服务发现、健康检查、KV 存储)
- 支持 HTTP 和 DNS 接口
- 支持多数据中心
- 支持服务网格
- 劣势:
- 学习曲线较陡
- 资源占用相对较高
- 适用场景:需要多功能集成的场景
4. Nacos
- 特点:阿里巴巴开源的服务发现和配置管理平台
- 优势:
- 功能全面(服务发现、配置管理、DNS)
- 支持 AP 和 CP 模式切换
- 与 Spring Cloud、Dubbo 集成好
- 支持动态配置推送
- 中文文档完善
- 劣势:
- 相对较新,生态不如 Consul 成熟
- 适用场景:国内微服务架构,特别是使用 Spring Cloud Alibaba
5. Etcd
- 特点:CoreOS 开发的分布式键值存储
- 优势:
- 基于 Raft 协议,强一致性
- 性能优秀
- 支持 gRPC 接口
- Kubernetes 的核心组件
- 劣势:
- 功能相对单一
- 运维复杂度较高
- 适用场景:Kubernetes 环境,对一致性要求高的场景
服务发现模式:
1. 客户端发现模式
- 客户端从注册中心获取服务列表
- 客户端自行选择服务实例
- 优点:减少注册中心压力,响应快
- 缺点:客户端逻辑复杂
- 代表:Eureka、Consul
2. 服务端发现模式
- 客户端通过负载均衡器调用服务
- 负载均衡器从注册中心获取服务列表
- 优点:客户端逻辑简单
- 缺点:增加一层代理,可能影响性能
- 代表:Kubernetes Service、Nginx
实现示例(Nacos):
服务提供者:
java@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } // 配置 spring: application: name: user-service cloud: nacos: discovery: server-addr: localhost:8848
服务消费者:
java@RestController public class ConsumerController { @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/call") public String callService() { ServiceInstance instance = loadBalancerClient.choose("user-service"); String url = String.format("http://%s:%s/api/user", instance.getHost(), instance.getPort()); return restTemplate.getForObject(url, String.class); } }
选择建议:
- Spring Cloud 生态:优先选择 Nacos 或 Eureka
- Kubernetes 环境:使用 Etcd 或 CoreDNS
- 需要多功能集成:选择 Consul
- 对一致性要求高:选择 Zookeeper 或 Etcd
- 国内项目:优先选择 Nacos