什么是服务注册与发现

我们先来看下什么是服务注册与服务发现?

服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

你可以理解为:

//服务注册
NameServer->register(newServer); //服务发现
NameServer->getAllServer();

服务注册

用了服务注册和服务发现之后,我们的网络请求模块,发生了怎么的变化呢?先来看下,服务注册是怎么操作的。看下面的图:

每一个服务对应的机器或者实例在启动运行的时候,都去向名字服务集群注册自己,比如图中,User服务有6个docker实例,那么每个docker实例,启动后,都去把自己的信息注册到名字服务模块上去,同理Order服务也是一样。

对应的伪代码可以表示如下:

//给User服务申请1个独有的专属名字
UserNameServer = NameServer->apply('User');//User服务下的6台docker实例启动后,都去注册自己
UserServer1 = {ip: 192.178.1.1, port: 3445}
UserNameServer->register(UserServer1);......UserServer6 = {ip: 192.178.1.6, port: 3445}
UserNameServer->register(UserServer6);//给Order服务申请1个独有的专属名字
OrderNameServer = NameServer->apply('Order');//开始注册
OrderServer1 = {ip: 192.178.1.1, port: 3446}
OrderNameServer->register(OrderServer1);//给Search服务申请1个独有的专属名字
SearchNameServer = NameServer->apply('Search');//开始注册
SearchServer1 = {ip: 192.178.1.1, port: 3447}
SearchNameServer->register(SearchServer1);

这样,每个服务的机器实例在启动后,就完成了注册的操作。注册的方式有很多的形式,不同的名字服务软件方式不一样,有HTTP接口形式,有RPC的方式,也有使用JSON格式的配置表的形式的。方式虽然不同,但是结果都是一样。

实例注册到名字服务上之后,接下来就是服务发现了。

服务发现

我们把每个服务的机器实例注册到了名字服务器上之后,接下来,我们如何去发现我们需要调用的服务的信息呢?这就是服务发现了。

我们看下,服务发现是怎么做的:

在上图中,Order服务想要获取User服务相关的信息,首先向注册集群中心发送请求获取,然后就能收到User服务相关的信息。

伪代码可以表示如下:

//服务发现,获取User服务的列表
list = NameServer->getAllServer('User'); //list的内容
[{"ip": "192.178.1.1","port": 3445},{"ip": "192.178.1.2","port": 3445},......{"ip": "192.178.1.6","port": 3445}
]//服务发现,获取Goods服务的列表
list = NameServer->getAllServer('Goods');//list的内容
[{"ip": "192.178.1.1","port": 3788},{"ip": "192.178.1.2","port": 3788},......{"ip": "192.178.1.4","port": 3788}
]

我们通过服务发现,就获得了User模块的所有的ip列表,然后,我们再用一定的负载均衡算法,或者干脆随机取1个ip,进行调用。

当然,也有些注册服务软件也提供了DNS解析功能或者负载均衡功能,它会直接返回给你一个可用的ip,你直接调用就可以了,不用自己去做选择。

这样,我们获取了服务的IP信息后,就可以进行调用了,如图所示:

和服务注册的方式一样,服务发现的方式,不同的名字服务软件的方式也会不一样,有的是得自己发送HTTP接口去轮训调用,如果发现有更新,就更新自己本地的配置文件。有的是可以通过实时的sub/pub的方式实现的自动发现服务,当我订阅的这个服务内容发生了更新,就实时更新自己的配置文件。也有的是通过RPC的方式。方式虽然不同,但是结果都是一样。

这样一来,我们就可以通过服务注册和发现的方式,维护各个服务IP列表的更新,各个模块只需要向名字服务中心去获取某个服务的IP就可以了,不用再写死IP。整个服务的维护也变得轻松了很多。彻底解放了双手!

健康检查

可能你会说,这样加了1个中间代理,饶了一个大圈子,感觉也挺费劲的,难道仅仅是为了解决新增服务,动态获取IP的问题吗?

当然不是!服务注册和服务发现,不仅仅解决了服务调用这种写死IP以及杂乱无章的管理的状态,更重要的一点是它还管理了服务器的存活状态,也就是健康检查。

很多名字服务软件都会提供健康检查功能。注册服务的这一组机器,当这个服务组的某台机器,如果出现宕机或者服务死掉的时候,就会标记这个实例的状态为故障,或者干脆剔除掉这台机器。这样一来,就实现了自动监控和管理。

健康检查有多重实现方式,比如有几秒就发一次健康检查心跳,如果返回的HTTP状态不是200,那么就判断这台服务不可用,对它进行标记。也可以执行一个shell脚本,看执行的返回结果,来标记状态等等。

上图中,用心跳发送的方式来检查健康状态,当有1台机器出现异常,这样我们获取服务的时候,就能知道服务的健康状态了。

比如伪代码如下:

//服务发现,获取User服务的列表
list = NameServer->getAllServer('User'); //list的内容
[{"ip": "192.178.1.1","port": 3445,"status": "success"},{"ip": "192.178.1.2","port": 3445,"status": "success"},......{"ip": "192.178.1.6","port": 3445"status": "error" //故障,出现错误}
]

我们通过判断列表里的status的状态是不是success来确认调用的服务是可用的。有些名字服务会提供DNS解析功能,直接就会把有问题的机器给去掉,你服务发现后的机器服务就是正常可用的。

同时,当服务不可用的时候,有些名字服务软件也会提供发送邮件或者消息功能,及时的提示你服务出现故障。这样一来,我们就通过健康检查功能,来帮我们及时的去规避问题,降低影响。

当出现故障的服务被修复后,服务重新启动后,健康检查会检查通过,然后这台机器就会被标记为健康,这样,服务发现,就又可以发现这台机器了。

这样,整个服务注册和服务发现,就实现了闭环。

市面上业界的解决方案

目前市面上已经有了服务注册和服务发现的解决方案,代表作是:zookeeper、consul、Eureka以及etcd,他们功能强大,安全稳定,高并发高可用,强一致性,目前市面上都是用这几个来实现自己的服务注册和发现的。

其中,consul 是后起之秀,源于它安装简单,功能强大,提供健康检查,web管理后台,支持多数据中心,暴露了方便的HTTP接口,使得它被更多的人所使用,唯一不足的是它不支持sub/pub订阅机制,所以服务发现,得使用者自己去HTTP轮训发现变更。

解决方案 CAP 协议
ZooKeeper CP Zab
Eureka AP 未公布
etcd CP Raft
Consul AP Raft


来源

服务治理-服务发现
深入了解服务注册与发现

【服务治理】服务注册与发现相关推荐

  1. 理解nacos 服务治理(注册中心)、Nacos简介、下载与配置持久化到Mysql

    Nacos简介 什么是Nacos Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流且管理. Nacos帮助您更敏 ...

  2. Spring Cloud之服务治理(注册发现)

    服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...

  3. 微服务架构 — 服务治理 — 服务注册与发现、服务订阅与通知

    目录 文章目录 目录 应用与服务的关系 服务注册与发现(Service Registration and Discovery) Service Registration Service Registr ...

  4. 微服务治理【注册发现】Nacos

    目录 Nacos是什么? Nacos有什么用? 使用 Nacos 服务发现的流程图 Nacos是什么? Nacos是阿里巴巴开源的一个服务发现.配置管理和服务管理平台,是一种基于云原生架构的动态服务发 ...

  5. 浅谈RPC服务治理服务

    面向服务的架构SOA 任何大型网站的发展都伴随着网站架构的演进.网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务的服务化架构.在单应用设计架构体系当中,我们 ...

  6. 微服务架构 — 服务治理 — 服务限流、服务降级、服务熔断

    目录 文章目录 目录 服务限流 服务降级 服务熔断 服务限流 C ⇄ S 的异常问题:C 的请求太多,超出 S 的服务能力,导致 S 不可用.例如:DoS 攻击,企图耗尽被攻击对象的资源,让目标系统无 ...

  7. 微服务架构 — 服务治理 — 服务监控与告警、服务日志与审计

    目录 文章目录 目录 日志与审计 监控与告警 配置中心 文档中心 日志与审计 日志分析组件应该在微服务兴起之前就被广泛使用了.即使单体应用架构,当访问数变大.或服务器规模增多时,日志文件的大小会膨胀到 ...

  8. 微服务架构 — 服务治理 — 服务调用链可视化

    微服务架构所面临的问题 微服务架构中,服务之间会有错综复杂的依赖关系,例如:一个前端请求一般会依赖于多个后端服务,称为 "1=>N 扇出".在实际生产环境中,服务往往不是百分 ...

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

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

最新文章

  1. python中的协程(二)
  2. 谈谈我自己(创业四个多月)
  3. rapidjson官方教程
  4. Java高新技术笔记:反射、多线程、泛型、枚举、javaBean、代理
  5. 检查mysql的replication_MySQL Replication需要注意的问题
  6. 互联网公司各种“花式”裁员,套路特别深,作为程序员你知道吗?
  7. Ethercat解析(二)之获取、编译、安装(debian7)
  8. asp.net mvc(八)
  9. redis 设置不过期_面试时 Redis 内存淘汰总被问,但是总答不好,怎么解决?
  10. Appium探索—Mac OS Python版
  11. linux ntfs 转换 无损,无损数据下NTFS转换FAT32分区
  12. 英特尔图形安装程序的linux,如何在我的系统中安装英特尔图形驱动程序?
  13. python怎么设置颜色深浅变化_【opencv_python学习之三】图像处理(一)更改色彩模式...
  14. 如何在网站集成Payssion的国外支付方式?
  15. 详谈Activity生命周期函数调用时机
  16. oracle10g利用归档恢复,Oracle10g数据库归档与非归档模式下的备份与恢复
  17. Python模拟鼠标键盘:pykeyboard库的使用
  18. 魔百和E900V22C_905L3A(B)_5621DS-安卓9.0-纯净语音
  19. Ethereum price history analysis to usd
  20. ICCV 2021 最新200篇ICCV2021论文分方向汇总

热门文章

  1. 爬虫入门,了解爬虫机制
  2. 【C语言补漏】数据类型
  3. 织梦转pbootcms插件,自动pbootcms插件
  4. Google可能在春节后回归中国市场。
  5. SQL语句中生成UUID方法
  6. 【云原生】promehtheus整合grafana实现可视化监控实战
  7. Redis巡检及优化建议
  8. 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm中的应用
  9. LabVIEW中VI的运行和调试
  10. TAAL新任CEO Jerry Chan访谈:我们将如何从当前危机中引领新经济体制