在微服务架构中,由于服务众多且单个服务具有多个实例,同时部署在Kubernetes集群中,实例的IP地址是可能随时变化的,需针对该情况对服务调用进行集中统一管理,因此引入服务注册发现机制。 服务注册和发现的意思是服务进程在注册中心注册自己的位置,客户端应用进程向注册中心发起查询,来获取服务的位置,服务发现的一个重要作用就是提供一个可用的服务列表。 通过统一集中化管理,使得服务直接仅通过服务名称即可调用,无需知道具体实例的IP地址。
Eureka 强调最终一致性(在有限的时间内(例如 3s 内)将数据收敛到一致状态)采用AP ,在牺牲数据一致性的情况下最大程度保障服务的可用性,服务端和客户端都是 Java 编写的,针对微服务场景,并且和 Netflix 的其他开源项目以及 Spring Cloud 都有着非常好的整合,具备良好的生态。 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功,当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。 参考链接:spring.io/projects/sp…
Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的功能:注册中心(服务注册与发现)功能和配置中心功能。 其中注册中心解决了微服务调用中,服务提供者和服务调用者的解耦,让程序开发者可以无需过多的关注服务提供者和调用者的运行细节,只需要通过 Nacos 的注册中心就可以实现两者的互联互通,相当于实现了远程服务本地化,并且提供了健康检查等机制。
Consul 由 HashiCorp 开源,是支持多个平台的分布式高可用系统。Consul 使用 Golang 语言实现,主要用于实现分布式系统的服务发现与配置,基于 Raft 算法,其是分布式、高可用和可横向扩展的,提供以下主要特性:
是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题。ZooKeeper是按照CP原则构建的,也就是说它能保证每个节点的数据保持一致,而为ZooKeeper加上缓存的做法的目的是为了让ZooKeeper变得更加可靠(available)。 Zookeeper的服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,主要分为如下几个步骤: 服务注册:服务提供者(Provider)启动时,会向Zookeeper服务端注册服务信息,即会在Zookeeper服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等),比如注册一个用户注册服务(user/register): 服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。
Etcd 是由 CoreOS 开源,采用 Golang 语言编写的分布式、高可用的 Key/Value 存储系统,主要用于服务发现和配置共享,并通过Raft 一致性算法处理日志复制以保证强一致性。Ectd 的经典应用场景有:
参考:云原生架构之服务发现与注册-Kubernetes中服务注册发现 总体来说K8s的服务注册与发现通过Etcd+CordDNS来实现,其中又包含了endpoints/kube-proxy等组件的协同。
目前业务架构使用consul 进行服务注册发现,将Consul部署在K8s集群中。
Consul Server采用StatefulSet部署,Consul client采用DaemonSet部署。
部署有Consul 相关服务的Node异常重启后,consul server发生变化,单服务内使用HOST仍然为老的consul 地址,造成服务异常,需要深入分析,待dev环境K8s部署完成后,进行模拟测试,进一步复现故障,找寻解决方案。
由于目前业务采用容器部署在在k8s环境中,在考虑上isito之前,尽可能贴近云原生架构进行改造。
南北流量主要为gateway 的服务注册发现使用K8s 原生资源实现。
通常将spring cloud应用上K8s集群,使用spring cloud kubernetes,服务注册依旧为使用k8s服务注册,服务发现利用其discover可以通过K8s api发现一个服务后的一组实例,负载均衡使用spring cloud kubernetes ribbon实现(改方案负责均衡为客户端负载均衡)。
将spring cloud应用上K8s集群,服务注册直接使用K8s service,即为服务绑定service,服务发现使用K8s service(该方案负责均衡为服务端负载均衡)。
springboot gateway 服务利用spring cloud kubernetes进行调用K8s API获取service服务发现,进行路由转发。
留言与评论(共有 0 条评论) “” |