服务注册与发现的来源

首先,服务注册与发现是来自于微服务架构的产物。

在传统的服务架构中,服务的规模处于运维人员的可控范围内。当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定。而在微服务应用中,服务实例的数量和网络地址都是动态变化的,这对系统运维提出了巨大的挑战。

而且服务集群的跨度很大、数量很多(数以百计甚至更多),为保障系统的正常运行,必然需要有一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是服务器的名称、地址、数量等,并且这些服务器组件还拥有被监听功能等(服务发现)。

这就是服务注册与发现的来源,在微服务架构中,服务注册与发现组件是必不可少的,常用的服务协调器有:Eureka、Zookeeper,ANS、Dubbo、Etcd等。

下面我分别从:服务注册发现主要解决的问题、特点、原理和Zookeeper的实现方式四个维度详细介绍。

服务注册与发现主要解决的问题

在一个分布式系统中,服务注册与发现组件主要解决两个问题:服务注册和服务发现

1.服务注册

服务实例将自身服务信息注册到注册中心。这部分服务信息包括服务所在主机IP和提供服务的Port,以及暴露服务自身状态以及访问协议等信息。

2.服务发现

服务实例请求注册中心获取所依赖服务信息。服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务。

除此之外,服务注册与发现需要关注监控服务实例运行状态等问题。

3.监控

微服务应用中,服务处于动态变化的情况,需要一定机制处理无效的服务实例。一般来讲,服务实例与注册中心在注册后通过心跳的方式维系联系,一旦心跳缺少,对应的服务实例会被注册中心剔除。

关系调用说明:

  • 服务生产者启动时,向服务注册中心注册自己提供的服务
  • 服务消费者启动时,在服务注册中心订阅自己所需要的服务
  • 注册中心返回服务提供者的地址信息个消费者
  • 消费者从提供者中调用服务

服务注册与发现的特点

1.高可用

由多个服务节点构成,就算有些节点挂掉也不影响正常运行,避免了单点故障。

2.方便配置

本身是一个分布式,一致性的 k-v 存储系统。提供方启动的时候将自身配置信息向协调器中进行注册,提供方下线的时候向协调器进行反注册。

3.可监控

提供心跳机制,如果对方程序意外挂掉,没有进行反注册,协调器也会超时剔除不可用的提供方。

服务注册发现的实现方式

我从服务注册发现实现的早期到现在主流的Zookpeer介绍,这样可以更加直观的了解到对应的优劣势,更有利于今后的选型升级。

1. DNS(早期)

DNS作为服务注册发现的一种方案,它比较简单。只要在DNS服务上,配置一个DNS名称与IP对应关系即可。定位一个服务只需要连接到DNS服务器上,随机返回一个IP地址即可。由于存在DNS缓存,所以DNS服务器本身不会成为一个瓶颈。

这种基于Pull的方式不能及时获取服务的状态的更新(例如:服务的IP更新等)。

如果服务的提供者出现故障,由于DNS缓存的存在,服务的调用方会仍然将请求转发给出现故障的服务提供方。

2.Zookeeper

Zookeeper是google开源的在Java语言上实现的分布式协调服务,是Hadoop和Hbase的重要组件,提供了数据/发布订阅、负载均衡、分布式同步等功能。

Zookeeper也是基于主从架构,搭建了一个可高扩展的服务集群,其服务架构如下:

  • Leader-Server:Leader负责进行投票的发起和决议,更新系统中的数据状态
  • Server:Server中存在两种类型:Follower和Observer。其中Follower接受客户端的请求并返回结果(事务请求将转发给Leader处理),并在选举过程中参与投票;Observer与Follower功能一致,但是不参与投票过程,它的存在是为了提高系统的读取速度
  • Client:请求发起方,Server和Client之间可以通过长连接的方式进行交互。如发起注册或者请求集群信息等。

3.Dubbo

Dubbo的服务发现模块基于zookeeper实现。
Eureka是spring cloud之下一个专门负责微服务服务注册和发现的组件,Eureka就是为了服务发现而设计的。是Dubbo对应的概念的一个部分。

4.Eureka

Eureka 是 Netflix 出品的用于实现服务注册和发现的工具。 Spring Cloud 集成了 Eureka,并提供了开箱即用的支持。其中, Eureka 又可细分为 Eureka Server 和 Eureka Client。

上图是来自eureka的官方架构图,这是基于集群配置的eureka 
– 处于不同节点的eureka通过Replicate进行数据同步 
– Application Service为服务提供者 
– Application Client为服务消费者 
– Make Remote Call完成一次服务调用

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

Zookeeper与Eureka的区别

想要了解Zk与eureka的区别首先要知道CAP定理

CAP定理

1. Zookeeper保证CP
当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

2.Eureka保证AP

Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务 
2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用) 
3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

你可能也喜欢:

  1. 微服务系列:Dubbo与SpringCloud的Ribbon、Hystrix、Feign的优劣势比较
  2. 如何从0到1设计一个类Dubbo的RPC框架
  3. RPC框架的实现原理,及RPC架构组件详解
  4. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解
  5. 阿里P8架构师谈:Zookeeper的原理和架构设计,以及应用场景
  6. 阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

微服务系列:服务注册与发现的实现原理、及实现优劣势比较相关推荐

  1. 微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)

    1.什么是落地SOA(面向服务架构)? SOA面向服务架构,是一种架构思想,是跨语言和平台的.SOA宗旨简单明了,根据项目服务完成架构搭建,以服务为基准点完成组件化和模块化.提供服务是项目的基本内容, ...

  2. nacis服务注册原理_服务注册和发现之Eureka原理篇

    概念 在传统应用组件间调用,通过接口规范约束来实现的,从而实现不同模块间良好协作:但是被拆分成微服务后,每个微服务实例的数量和网络地址都可能动态变化,使得原来硬编码的地址极不方便,故需要一个中心化的组 ...

  3. 分布式系统服务注册与发现概念和原理

    在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握. 引入服务注册与发现组件的原因 先来看一个问题,假如现在我 ...

  4. 消息中间件系列(八):Kafka、RocketMQ、RabbitMQ等的优劣势比较

    在高并发业务场景下,典型的阿里双11秒杀等业务,消息队列中间件在流量削峰.解耦上有不可替代的作用. 之前介绍了MQ消息队列的12点核心原理总结,以及如何从0到1设计一个MQ消息队列,以及RPC远程调用 ...

  5. springcloud微服务系列之服务注册与发现组件Eureka

    一.Eurake的简介 二.使用Eureka进行服务的注册消费 1.创建一个服务注册中心 2.创建服务的提供者 3.创建服务的消费者 总结 一.Eurake的简介 今天我们来介绍下springclou ...

  6. 微服务系列:Dubbo与SpringCloud的Ribbon、Hystrix、Feign的优劣势比较

    在微服务架构中,分布式通信.分布式事务.分布式锁等问题是亟待解决的几个重要问题. Spring Cloud是一套完整的微服务解决方案,基于 Spring Boot 框架.确切的说,Spring Clo ...

  7. 分布式与微服务系列 - Dubbo

    一.前言 本内容仅用于个人学习笔记,如有侵扰,联系删除 视频教程:尚硅谷Dubbo教程(dubbo经典之作) 二.基础知识 1.分布式基础理论 1.1.什么是分布式系统? <分布式系统原理与范型 ...

  8. 源码分析Dubbo服务注册与发现机制RegistryDirectory)

    RegistryDirectory,基于注册中心的服务发现,本文将重点探讨Dubbo是如何实现服务的自动注册与发现.从上篇文章,得知在消息消费者在创建服务调用器(Invoker)[消费者在初始时]时需 ...

  9. 8、Zookeeper服务注册与发现原理浅析

    了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与 ...

最新文章

  1. 二维数组 赋值_3.9数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)...
  2. 【LeetCode】剑指 Offer 42. 连续子数组的最大和
  3. Golang结构体与面向对象
  4. iso硬盘安装 凤凰os_凤凰os系统下载_凤凰系统phoenix os官方下载-188软件园
  5. ansys_apdl使用教程
  6. 在使用vue-video-player时,切换页面浏览器报错:TypeError: this.el_.vjs_getProperty is not a function**
  7. 【安全科普】AD域安全管理(一)
  8. GoogLeNet 神经网络结构
  9. Nginx 配置多个SSL域名指向不同端口
  10. 【UE4 Cesium】加载离线地图
  11. 昆石VOS3000/VOS2009 Web手机管理说明
  12. Day 3 Linux(目录篇 、文件操作篇 、压缩解压相关命令, 编辑器vi 、编译器gcc 、调试器gdb、 makefile工程管理器初学)
  13. 【功能测试】part2
  14. Tensorflow框架初识
  15. MATLAB | 如何在MATLAB中使用python全部colormap配色
  16. 商业级4G代理搭建指南【搭建篇之Docker版】
  17. java 操作AD域代码(跳过证书版)
  18. echart 世界地图发光_echarts世界地图设置高亮
  19. 象棋残局之“以退为进”
  20. 关于java运算符以及优先级的整理

热门文章

  1. 【Maven入门教程】Maven的基本概念
  2. SRTP参数及数据包处理过程
  3. 时间复杂度和空间复杂度,一看就懂,面试前必过一遍
  4. 度量时间差和jiffies计数器
  5. Linux下修改SSH登录端口
  6. STM32——系统滴答定时器
  7. CTF 这个看起来有点简单
  8. 回溯 皇后 算法笔记_算法笔记-回溯法
  9. python os renames_Python3 os.renames() 方法
  10. python爬虫用什么软件写_python爬虫怎么写