目录
文章目录
- 目录
- 应用与服务的关系
- 服务注册与发现(Service Registration and Discovery)
- Service Registration
- Service Registry
- Service Discovery
- 基于 DNS 的 Service Discovery
- 服务订阅与通知
应用与服务的关系
- Provider Applications(提供商应用),提供 Value Added Services(增值服务)。
- Consumer Applications(消费应用),提供 Business Services(业务服务)。
服务注册与发现(Service Registration and Discovery)
微服务体系中,Service Registration and Discovery 是最核心的模块之一。例如:ServiceA 调用 ServiceB 时,需要通过 Service Discovery 从 Service Registry(注册中心)得到 Service Catalog(服务目录),继而得到 ServiceB 的 Endpoint 列表,而 ServiceB 的 Instance 在启动时需要把提供服务的 Endpoint 注册到 Service Registry 的 Service Catalog 中。
Service Registration
Service Registration 通常有三种:
第三方注册:存在一个第三方的系统负责自动维护 Service Registry 的 Service Catalog。
注册中心主动同步:将 APP 的调度或发布系统与 Service Registry 打通,Service Registry 主动同步并维护最新的 Service Catalog。典型例子就是 Kubernetes 体系中,CoreDNS 会自动订阅 API Server 发布并登记解析记录。
Service Registry
Service Registry(注册中心)除了需要完成 Service Registration 的工作之外,还需要提供以下功能:
- 主动与被动的健康检查:
- 主动健康检查:由 Service Registry 主动定期发送健康检查探测包,探测 Producer APP 是否正常提供服务。主动探测的好处在于服务提供方不用做任何改动即可快融入微服务架构。
- 被动健康检查:则是指由 Producer APP 自动通过心跳方式保持活性。
- 负载均衡策略:通过 VIP 的方式为多个同类型的 Producer APPs 提供负载均衡。
注:在 Kubernetes 中,服务发现与负载均衡的实现就是 Kubernetes Service。
Service Discovery
在 Consumer APP 发起真正的服务调用之前,Consumer APP 需要从 Service Registry 获取 Service Catalog,即服务发现。服务发现从对应用的侵入性上可以分为两大类:
- SDK-Based 服务发现方式:需要 Consumer APP 安装相应的 SDK,显式调用 SDK 代码才可以实现服务调用,对业务有侵入性。
- DNS-Based 服务发现方式:DNS 可以满足简单的服务发现场景,如:双方约定好端口、序列化协议等等。
基于 DNS 的 Service Discovery
DNS 协议是目前最为通用的协议之一,其天然具有跨语言特性,也是快速接入微服务体系最快的一个方式。
要实现基于 DNS 的 Service Discovery,首先 Service Registry 的数据应该可以以 DNS 的数据格式暴露出来。让任何 DNS 客户端都可以通过 DNS 协议来获取 Service Catalog 列表。
独立 DNS 服务器:这种架构中,需要独立的 DNS 服务器。DNS 服务器从 Service Registry 获取 Service Catalog。APP 通过 DNS 查询得到某个 Service 的 IP 列表,然后发起调用。
DNS Filter:这种架构中,需要把 DNS 服务器集成到 Consumer APP 中。首先要保证 ServiceA 的 DNS 查询都被拦截到本地的 DNS 服务器上(127.0.0.1:53),在获取到服务的 IP 列表后发起调用。由于这种方式把 DNS 服务器前置到实际调用的机器上,所以它解决了独立 DNS 服务器模式的单点问题,完全 P2P 的模式。但由于需要在应用机器上安装 DNS 服务器,其维护和升级成本较前者高一些。
服务发现还会跟客户端负载均衡配合使用。由于应用服务已经同步服务地址列表在本地了,所以访问微服务时,可以自己决定负载策略。甚至可以在服务注册时加入一些元数据(服务版本等信息),客户端负载则根据这些元数据进行流量控制,实现 A/B 测试、蓝绿发布等功能。
服务发现功能有很多组件可以选择,比如:ZooKeeper、Eureka、Consul、ETCD 等。