1.1 什么是服务发现?
在微服务架构中,每个服务通常都是独立部署和扩展的,服务的实例数量、位置可能动态变化。服务发现机制用于在动态环境中,帮助服务相互定位和通信。
1.2 服务发现的核心组件
-
服务注册表(Service Registry):
服务注册表是一个存储服务实例信息的数据库。每当有服务上线或下线时,它会更新记录,以便其他服务能查找到最新信息。 -
服务注册与注销:
- 服务注册:当服务实例启动时,会将自己的地址(IP、端口等)注册到服务注册表中。
- 服务注销:当服务实例关闭或宕机时,会从服务注册表中移除。
-
服务查询:
当一个服务需要与另一个服务通信时,会从服务注册表中获取目标服务的地址信息。
1.3 服务发现的分类
-
客户端发现模式
在客户端发现模式下,服务客户端直接与服务注册表交互,获取目标服务的地址信息。- 优点:服务之间通信简单直接。
- 缺点:客户端需要集成服务发现逻辑,增加了复杂性。
-
服务端发现模式
在服务端发现模式下,服务客户端的请求会通过负载均衡器或 API 网关,由后者查询服务注册表并转发请求。- 优点:客户端逻辑简单,服务发现由网关代理负责。
- 缺点:网关可能成为性能瓶颈。
1.4 常见服务发现工具
- Eureka:由 Netflix 开源,适用于 Java 微服务体系。
- Consul:支持多种语言和跨数据中心的服务注册与发现。
- Zookeeper:高可用性服务协调系统。
- Etcd:一个分布式键值存储,支持服务发现。
1.5 服务发现的挑战与解决方案
- 健康检查: 定期检查服务实例的健康状态,避免返回不可用的实例。
- 负载均衡: 服务发现需配合负载均衡策略(如轮询、最小连接数)实现流量分发。
- 一致性问题: 分布式服务注册表需要解决数据一致性问题,可使用一致性算法(如 Raft)。
1.6 应用场景
- 动态扩展的微服务架构。
- 服务实例频繁上线下线的分布式系统。
- 需要跨数据中心的服务访问。