服务注册与发现(上)

1,556 阅读3分钟

服务注册与发现

服务注册

服务注册是指服务提供者向注册中心注册服务实例,主要将其服务信息如服务名称、IP 地址、端口等注册到注册中心。

服务发现

服务发现是指服务消费者需要调用其他服务时,注册中心将服务提供者的服务信息如服务名称、IP 地址、端口等告知服务消费者。

Eureka

Eureka 提供的是一种客户端注册的方式进行服务注册和发现。Eureka 是 Netflix 公司的开源项目之一,和 Spring-cloud-netflix 项目集成可以快速实现 SpringBoot 项目的云化集成部署。部署方式可以选择普通虚拟机或者用 Docker。Netflix 除了提供 Eureka,还有成套的负载均衡 Ribbon、网关路由 Zuul、熔断机制 Hystrix,下面会逐一介绍。

  • Eureka 是 SpringCloud Netflix 的核心子模块
  • Eureka 包含:Eureka Server 和 Eureka Client
  • Eureka Server 提供服务注册服务,存储所有可用服务节点
  • Eureka lient 用于简化与Server 通讯复杂度

服务发现、注册的过程(Eureka)

  • (1)服务注册

微服务实例(客户端实例)启动后,将服务信息发送给 EurekaServer,EurekaServer 会将这个注册信息(服务名、IP、Port、服务在线(UP)、离线(DOWN)等信息记录在自己的服务注册表中)。 注册后会间隔一段时间(由客户端配置)发送心跳信息,如果一段时间收不到心跳则会将该节点从服务列表中去除。如果客户端实例停止服务,会主动发消息给 EurekaServer 将其下线。

  • (2)客户端获取 EurekaServer 中的服务注册信息。

  • (3)EurekaServer 将服务注册表发给客户端实例。

  • (4)微服务 B 想要请求微服务 A 的某个 RestAPI,此时 Ribbon 会将列表中所有可用的微服务 A 的实例以 round robin 算法进行负载均衡,决定请求到哪个具体的微服务的容器实例,也即将 /serviceA/xx/{xxid} 请求地址转化为: http://123.12.12.123:12345/xx{xxid}

Eureka 服务注册

  • Eureka Client 在第一次心跳时向Eureka Server 注册
  • 注册时会提供自身元数据:主机名、端口、健康指标URL等

Eureka 服务续约

  • Eureka Client 通过发送心跳进行续约
  • 默认情况下每30秒发送一次心跳
  • 如90s 内Eureka Server 未收到续约,则进行服务剔除

Eureka 服务下线

  • Eureka Client 优雅退出时会发送cancel命令
  • Eureka Server 收到cancel命令时会删除该节点

注: kill -9 强制杀进程不属于优雅退出

获取注册列表信息

  • Eureka Client 会缓存由Server获取的注册表信息
  • Eureka Client 会定期更新注册表信息【默认30秒】
  • Eureka Client 会处理注册表的合并等内容

Eureka 注册慢

  • 根本原因:Eureka 的 AP 特性
  • Eureka Client 延迟注册,默认30秒
  • Eureka Server 的响应缓存,默认30秒
  • Eureka Server 的缓存刷新,默认30秒

Eureka 的自我保护

  • Eureka Server 会自动更新续约阈值
  • Eureka Server 续约更新频率低于阈值则进入保护模式
  • 自我保护模式下 Eureka Server 不会剔除任何注册信息