CAP理论
C:Cansistency -一致性
A:Availability -可用性
P:Partition Tolerance -分区容错性
在分布式系统各种P是客观存在且不可绕过,A和P是不可共存

Eureka

自我保护机制

  • 好死不如赖活着,在某时刻某一个微服务不可以用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存。
  • 自我保护模式中,EurekaServer会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时该EurekaServer节点就会自动退出自我保护模式。它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。
  • 在SpringCloud中,可以使用eureka.server.enable-self-preservation=false禁用自我保护模式【不推荐关闭自我保护机制】

    数据同步

  • Eureka是弱一致性,保证了高可用即AP。在任何时候服务消费者都能拿到服务列表,但不保证数据的强一致性,即消费者可能拿到过期的服务列表。

  • Eureka服务间的数据同步采用对等复制来保证
  • Eureka集群之间的实例都是相互注册的,当server的信息变更,比如client向自己注册,续约,注销请求,就会把最新的信息通知给其他的server。
  • Eureka server在执行复制操作时,使用HERDER_REPLICATION的请求头区分时正常请求还是数据同步请求,通过这个可以保证server集群之间不会相互同步形成死循环。
  • Eureka server数据同步时还会携带一个lastDirtyTimestamp标识最后一次更新的时间,通过这个来判断同步请求携带的数据是老数据还是新数据。
  • Eureka还有心跳机制来进行数据的最终修复,节点之间的数据有可能会复制出错,通过心跳即可发现实例的健康状态,进行数据修复。

    缓存设计

    Eureka设计有三级缓存
  1. registry:是一个ConcurrentHashMap,在AbstractInstanceRegistry类中,注册表说的就是它,它是实时更新的,UI界面就是从这里获取服务的注册信息。
  2. readWriteCacheMap:是一个Guava Cache,在ResponseCacheImpl中维护,也是实时更新,缓存的时间是180s。
  3. readOnlyCacheMap:是一个ConcurrentHashMap,在ResponseCacheImpl中维护,周期更新,默认每30s从二级缓存readWriteCacheMap中同步数据;客户端时从这里获取的服务注册信息,可配置为直接从二级缓存中获取。

    灰度发布

    SpringBoot应用可通过DiscoveryManager.getInstance().shutdownComponent()通知注册中心下线。下线后停60s等业务处理完再重启服务器。

    Eureka参数配置

    Eureka Client 配置项
参数名称 说明 默认值
eureka.client.enable 客户端是否开启 true
eureka.client.registry-fetch-interval-seconds 从eureka服务器获取注册表信息的频率(s) 30
eureka.client.instance-info-replication-interval-seconds 更新实例信息的变化到Eureka服务端的间隔时间,(s) 30
eureka.client.initial-instance-info-replication-interval-seconds 初始化实例信息到Eureka服务端的间隔时间,(s) 40
eureka.client.eureka-service-url-poll-interval-seconds 询问Eureka Server信息变化的时间间隔(s) 300
eureka.client.eureka-server-read-timeout-seconds 读取Eureka Server 超时时间(s),默认8秒
eureka.client.eureka-server-connect-timeout-seconds 连接Eureka Server 超时时间(s),默认5秒
eureka.client.eureka-server-total-connections 获取从eureka客户端到所有eureka服务器的连接总数,默认200个
eureka.client.eureka-connection-idle-timeout-seconds 连接到 Eureka Server 空闲连接的超时时间(s),默认30
eureka.client.heartbeat-executor-thread-pool-size 心跳保持线程池初始化线程数,默认2个
eureka.client.heartbeat-executor-exponential-back-off-bound 心跳超时重试延迟时间的最大乘数值,默认10
eureka.client.register-with-eureka 是否将注册到eureka服务器以供其他服务发现,默认为false
eureka.client.prefer-same-zone-eureka 实例是否使用同一zone里的eureka服务器,默认为true,理想状态下,eureka客户端与服务端是在同一zone下 true
eureka.client.log-delta-diff 是否记录eureka服务器和客户端之间在注册表的信息方面的差异,默认为false
eureka.client.on-demand-update-status-change 客户端的状态更新到远程服务器上,默认为true
eureka.client.allow-redirects 指示服务器是否可以将客户端请求重定向到备份服务器/集群。如果设置为false,则服务器将直接处理请求。如果设置为true,则可以将HTTP重定向发送到具有新服务器位置的客户端。 false
eureka.client.fetch-registry 客户端是否获取eureka服务器注册表上的注册信息,默认为true
eureka.client.filter-only-up-instances 是否过滤掉非up实例,默认为true

服务实例配置项

参数名 说明 默认值
eureka.instance.appname 注册到注册中心的应用名称
eureka.instance.instance-enabled-onit 指示是否应在eureka注册后立即启用实例以获取流量 false
eureka.instance.non-secure-port http通信端口 80
eureka.instance.non-secure-port-enabled 是否启用HTTP通信端口 true
eureka.instance.secure-port HTTPS通信端口 443
eureka.instance.secure-port-enabled 是否启用HTTPS通信端口 false
eureka.instance.secure-virtual-host-name 服务实例安全主机名称(HTTPS) unknown
eureka.instance.virtual-host-name 该服务实例非安全注解名称(HTTP) unknown
eureka.instance.lease-renewal-interval-in-seconds 该服务实例向注册中心发送心跳间隔(s) 30
eureka.instance.lease-expiration-duration-in-seconds 指示eureka服务器在删除此实例之前收到最后一次心跳之后等待的时间(s) 90
eureka.instance.ip-address 该服务实例的IP地址
eureka.instance.prefer-ip-address 是否优先使用服务实例的IP地址,相较于hostname false
eureka.instance.instance-id 该服务实例在注册中心的唯一实例ID
eureka.instance.hostname 该服务实例所在主机名
eureka.instance.environment 该服务实例环境配置

Eureka Server 配置项(eureka.server.*)

eureka.server.enable-self-preservation 启用自我保护机制,默认为true
eureka.server.eviction-interval-timer-in-ms 清除无效服务实例的时间间隔(ms),默认1分钟
eureka.server.rate-limiter-burst-size 限流大小 10
eureka.server.rate-limiter-enabled 是否启用限流 false
eureka.server.rate-limiter-full-fetch-average-rate 平均请求速率 100
eureka.server.rate-limiter-throttle-standard-clients 是否对标准客户端进行限流 false
eureka.server.rate-limiter-registry-fetch-average-rate 服务注册与拉取的平均速率 500
eureka.server.renewal-percent-threshold 15分钟内续约服务的比例小于0.85,则开启自我保护机制,再此期间不会清除已注册的任何服务(即便是无效服务) 0.85
eureka.server.renewal-threshold-update-interval-ms 更新续约阈值的间隔(分钟),默认15分钟
eureka.server.response-cache-auto-expiration-in-seconds 注册信息缓存有效时长(s),默认180秒
eureka.server.response-cache-update-interval-ms 注册信息缓存更新间隔(s),默认30秒

Zookeeper

zk保证了CP原则,保证数据的强一致性。

Nacos

nacos可以启动时指定,它既可以保证AP,也可以保证CP