快捷搜索: 王者荣耀 脱发

分布式篇:对比一下各种服务注册中心

目前业内的微服务解决方案

通常分为两块

1、以 Dubbo 为主的微服务解决方案
2、以 Spring Cloud 为主的微服务解决方案

这两块微服务解决方案都采用了不同的 注册中心

以 Dubbo 作为服务框架的一般会选择 Zookeeper 为注册中心

以ZK作为服务注册和发现的集群模式

这种多台机器的情况下 ZK 会有2个角色 Leader / Follower

只有 Leader 是可以写,也就是服务注册,它可以把注册信息同步给 Follower

读的时候,两个角色都可以读

ZK ,遵循了CAP 中的 CP

它保证了一致性和分区容错性

ZK有一个Leader节点会接收数据,然后同步到其它节点

一旦Leader挂了,这个时候要重新选举Leader,这个过程为了保证C,就牺牲了A,不可用一段时间

一旦Leader选举好了,那么就可以继续写数据了,保证了一致性

以ZK作为服务注册发现的时效性一般秒级可以感知到

不适合大规模的服务实例,因为服务上下线的时候,要瞬间推送数据通知到所以其他服务实例,一旦服务规模过大,上千个的时候,会导致网络带宽被大量占用

以 Spring Cloud 作为服务框架的一般会选择 Eureka 为注册中心

以 Eureka 作为服务注册和发现的集群模式

这种情况下集群里面的机器都是对等的,每个服务都可以进行服务注册与服务发现

并且集群中任意一台机器收到写请求后,会自动同步给其余机器

Eureka ,遵循了CAP 中的 AP

它保证了可用性和分区容错性

Eureka 每个实例的平级的,可能数据还没同步过去,自己就挂了

此时还是可以从别的机器上获取注册表,但是看到的就不是最新的数据,保证了可用性,但是 Eureka 遵循的是最终一致性

以 Eureka 作为服务注册发现的时效性默认配置非常差,服务感知可能几十秒甚至几分钟级别

因为从注册中心的缓存刷新,服务同步注册中心的数据,服务故障检查心跳,都有一个时间间隔

针对这种情况,是肯定不能用默认配置在生产上的

eureka,必须优化参数

## 每隔  3秒 只读 从 只写 缓存 更新缓存
eureka.server.responseCacheUpdateIntervalMs = 3000 

## 客户端获取注册表信息缓存
eureka.client.registryFetchIntervalSeconds = 3000

## 心跳间隔,5秒
eureka.client.leaseRenewalIntervalInSeconds = 5

## 主动失效检测间隔,配置成5秒
eureka.server.evictionIntervalTimerInMs = 5

## 没有心跳的淘汰时间,10秒
eureka.instance.leaseExpirationDurationInSeconds = 10

服务发现的时效性变成秒级,几秒钟可以感知服务的上线和下线

eureka 也很难支持大规模的服务实例

因为每个实例都要接收写请求,需要同步,实例太多扛不住,很难达到几千服务实例

经验分享 程序员 微信小程序 职场和发展