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设计有三级缓存
- registry:是一个ConcurrentHashMap,在AbstractInstanceRegistry类中,注册表说的就是它,它是实时更新的,UI界面就是从这里获取服务的注册信息。
- readWriteCacheMap:是一个Guava Cache,在ResponseCacheImpl中维护,也是实时更新,缓存的时间是180s。
- 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