服务注册与发现

一、etcd

etcd 是一个分布式,一致性的 k-v 存储系统,用于共享配置和服务发现。etcd 使用 go 语言实现,并通过 Raft 一致性算法处理日志复制以保证强一致性。

简单: 可使用 curl 访问的用户 API(HTTP+JSON)
安全: 可选的SSL客户端证书认证
快速: 单实例每秒 1000 次写操作
可靠: 使用Raft保证一致性

 二、Consul

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStack 等相比,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 用 Golang 实现,因此具有天然可移植性(支持 Linux、windows 和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

 三、Zookeeper

Yahoo贡献给Apache基金会的一个顶级开源项目,基于Paxos算法,是Hadoop和HBase的重要组件。Zookeeper是为分布式应用设计的一个高性能协调服务,提供了如下的通用服务,如命名、配置管理、通过锁和分组服务,封装成简单易用的接口而无需开发人员从头编写代码。可以拿来即用,应用的领域有取得共识、分组管理、领导者选举和协议呈现。还可以按需自定义功能。

Zk和etcd的比较:

 四、Netflix的Eureka

Eureka是Netflix的中间层,用于负载均衡和服务发现。在应用服务中既存有服务器组件,也有智能客户端。服务器和客户端都采用java语言编写,这就意味着理想的应用场景是用于采用java编写的服务,或者是与JVM兼容的语言编写的服务。

Eureka服务器用于注册服务。他们推荐在AWS每个可用的区域运行一个Eureka服务器,通过它来形成聚簇。服务器通过异步模式互相复制各自的状态,这意味着在任意给定的时间点每个实例关于所有服务的状态是有细微差别的。

服务的注册由客户端组件处理。服务嵌入在客户端应用程序代码中。在运行时,客户端注册服务并周期性的发送心跳来更新它的租约。

服务的发现也由智能客户端来处理。它从服务器端检索当前注册的信息并把它们缓存在本地。客户端周期性能刷新它的状态同时处理负载均衡和失效备援。

Eureka在设计时就考虑了失败时的恢复。它依托强一致性提供良好的可用性,可在运行在多种不同的失败场景中。如果聚簇中有分片,那么Eureka就转入自我保护模式。它允许在分片期间过行服务的发现和注册,当分片结束时,聚簇中的成员会把它们的状态再次合并起来。

如果一个服务器出现问题,Eureka不需要任何类型的选举,客户端会自动切换并连接到一个新的Eureka服务器。当它恢复时,可以自动加入Eureka节点集群。而且,按照设计,它可以在零停机的情况下处理更广泛的网络分区问题。在出现网络分区的情况下,Eureka将继续接受新的注册并发布。这可以确保新增服务仍然可以供分区同侧的任意客户端使用。

Eureka有一个服务心跳的概念,可以阻止过期数据:如果一个服务长时间没有发送心跳,那么Eureka将从服务注册中将其删除。但在出现网络分区、Eureka在短时间内丢失过多客户端时,它会停用这一机制,进入“自我保护模式”。网络恢复后,它又会自动退出该模式。这样,虽然它保留的数据中可能存在错误,却不会丢失任何有效数据。

Eureka在客户端会有缓存。即使所有Eureka服务器不可用,服务注册信息也不会丢失。缓存在这里是恰当的,因为它只在所有的Eureka服务器都没响应的情况下才会用到。

Eureka就是为服务发现而构建的。它提供了一个客户端库,该库提供了服务心跳、服务健康检查、自动发布及缓存刷新等功能。使用ZooKeeper,这些功能都需要自己实现。

管理简单,很容易添加和删除节点。它还提供了一个清晰简洁的网页,上面列出了所有的服务及其健康状况。

Eureka还提供了REST API,使用户可以将其集成到其它可能的用途和查询机制。

 五、SkyDNS

SkyDNS是一个相对新的项目它采用Go语言编写,使用了RAFT用于一致性,并提供了HTTP和DNS两种客户端API.它与Etcd和Spotify的DNS模型有点类似,事实上它采用了和Etcd,go-raft同样的RAFT实现。

SkyDNS服务器聚簇在一起,使用RAFT协议,并选择出一个主服务。SkyDNS服务器暴露不同的结点用于服务注册和发现。

为了注册服务,服务会使用基于HTTP的API创建带有TTL的入口。服务必须周期性地通过心跳报告它们的状态。SkyDNS也使用了SRV记录,但它对记录做了扩展用于支持服务版本、环境和地区。

为了发现,客户端使用DNS并检索它们需要连接的服务的SRV记录。客户端需要实现负载均衡或者失效备援,并且周期性的缓存和刷新服务位置数据。

与Spotify使用DNS不同的是,SkyDNS支持服务的动态注册,并且能够在不依赖像Zookeeper或者Etcd的情况下动态注册。

如果你使用了docker,skydock,你应当去检查一下你的容器与SkyDNS自动的集成。

总之,SkyDNS是一个混合了传统的(DNS)和新的(Go,RAFT)技术的项目,它值得你去分析一下项目是如何推进的。

总结

posted @ 2017-01-04 13:59  掉进书洞里的猫  阅读(435)  评论(0编辑  收藏  举报