1、为什么需要服务注册中心

微服务时代的服务管理
在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块,这样做的好处是深度解耦,1个模块只负责自己的事情就好,能够实现快速的迭代更新坏处就是服务的管理和控制变得异常的复杂和繁琐,人工维护难度变大。还有排查问题和性能变差(服务调用时的网络开销)

2、什么是注册中心?

注册中心的作用一句话概括就是存放和调度服务,实现服务和注册中心,服务和服务之间的相互通信。注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。

如果没有注册中心?会怎样

 在不用服务注册之前,怎么去维护这种复制的关系网络呢?答案就是:写死!。
  1. 将其他模块的ip和端口写死在自己的配置文件里,甚至写死在代码里,每次要去新增或者移除1个服务的实例的时候,就得去通知其他所有相关联的服务去修改
  2. 随之而来的就是各个项目的配置文件的反复更新、每隔一段时间大规模的ip修改和机器裁撤,非常的痛苦。

而有了注册中心之后,每个服务在调用别人的时候只需要服务的名称就好,调用时会通过注册中心根据服务编码进行具体服务地址进行调用。

常用的注册中心中间件

服务注册中心的作用就是【服务的注册】和【服务的发现】

  • 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
  • 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

你可以理解为:

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

//服务发现
NameServer->getAllServer();

借鉴博客:https://zhuanlan.zhihu.com/p/161277955

服务注册是怎么操作的。看下面的图:

每一个服务对应的机器或者实例在启动运行的时候,都去向名字服务集群注册自己,比如图中,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格式的配置表的形式的。方式虽然不同,但是结果都是一样。

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

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

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

服务发现是怎么做的:


在上图中,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解析功能,直接就会把有问题的机器给去掉,你服务发现后的机器服务就是正常可用的。

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

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

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

微服务:注册中心的作用相关推荐

  1. 微服务 注册中心的作用_102,谈谈微服务注册中心zookeeperamp;Eureka

    首先,大家要明确一点微服务注册中心是一个重要的组件,解决的是服务的注册和发现的问题,而zookeeper,Eureka都只是其中一款落地实现的产品,再比如Nacos也是如此,所以关键是掌握注册中心的工 ...

  2. 微服务 注册中心的作用_SpringCloud(二)服务注册中心与Eureka工作原理介绍

    微服务的注册中心 author:QYX 注册中心可以说是微服务架构中的通讯录,它记录了服务和服务地址的映射关系,在分布式架构中,服务会注册到这里,当服务需要调用其他服务时, 就会在这里找到服务的地址, ...

  3. 微服务 注册中心的作用_微服务架构Dubbo之注册中心(Zookeeper)

    注册中心简介 在微服务架构中,注册中心是核心的基础服务之一.在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中.Dubbo是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用 ...

  4. 如何优化Spring Cloud微服务注册中心架构?

    作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...

  5. 微服务注册中心为什么要使用Consul替代Eureka?

    ---------------- 版权声明:本文为CSDN博主「fishinhouse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://b ...

  6. 【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

    点击上方"蓝字", 右上角选择"设为星标" 周一到周五早11点30,精品文章准时送上! 本文来自石杉的架构笔记 目录: 一.问题起源 二.Eureka Serv ...

  7. SpringCloud微服务注册中心如何承载大型系统的千万级访问?源码及原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 问题起源     Spring Cloud架构体系中,Eureka是一个至关重要的组件,它扮演着微服务注册中心的角色,所有的服 ...

  8. 微服务注册中心如何承载大型系统的千万级访问?

    本文来源:石杉的架构笔记(shishan100) 目录: 一.问题起源 二.Eureka Server设计精妙的注册表存储结构 三.Eureka Server端优秀的多级缓存机制 四.总结 一.问题起 ...

  9. 从零开始搭建系统3.2——微服务注册中心开发及部署

    从零开始搭建系统3.2--微服务注册中心开发及部署 转载于:https://www.cnblogs.com/provence666/p/8638586.html

  10. 主流微服务注册中心浅析和对比

    开源产品受开发者热捧,是因为其代码透明.可以参与共建.有社区进行交流和学习,当然更重要的是开源产品的接入成本低.个人开发者或者中小型公司往往会将开源产品作为选型首选. 开发者通过阅读源代码,理解产品的 ...

最新文章

  1. 图片验证码的JAVA工具类
  2. boost::mp11::mp_set_union相关用法的测试程序
  3. oracle with as内存,oracle中with as子句的用法小结(转)
  4. [react] componentWillUpdate可以直接修改state的值吗
  5. java final resource_java 中的常量定义,final 的问题
  6. PowerBuilder制作纸牌游戏
  7. 服务器显示AL024是什么意思,焦作台达ASD-A2-0241-M伺服驱动器出现报警代码AL024怎么维修...
  8. html中的换行符也占空间,如何解决
  9. office插件开发_OneKeyTools:强大PPT插件
  10. html缓存的图片放在哪里,浏览器图片缓存在哪
  11. mac删除ssh key_好用的mac终端命令仿真工具
  12. 将字符串转化为ASCII码
  13. 在vue中渲染数学公式 - MathJax
  14. 揭秘Internet.org:这是扎克伯格的野心还是使命?
  15. 简单分析一个通过 js 劫持进行案例
  16. H264---码率控制---CBR、VBR、ABR、CVBR四种编码方式
  17. 厂长来了 | 从个人英雄到软件工程,我们经历了什么
  18. 【C++】十进制转化二进制,二进制转化十进制
  19. 周鸿祎:“作恶”的创新?
  20. js:在浏览器中使用原生的 ESM

热门文章

  1. python随机产生一个范围内的整数_python如何生成整数范围内的随机数
  2. 视频转图片,帧率,分辨率
  3. 自定义控件--仿QQ表情面板
  4. 使用Fabric.js实现贝塞尔曲线波浪特效
  5. getpostdata php7.0_php获取post参数的几种方式
  6. RPG单机游戏,C++代码制作圣剑英雄传!「源程序+开发文档」
  7. 一行代码搞定禁用笔记本自带键盘
  8. python获取excel特定区域_python获取excel指定区域数据库-女性时尚流行美容健康娱乐mv-ida网...
  9. 手机怎样升级Android10,国行三星手机Android 10.0升级计划表 Note10明年2月升级
  10. 【操作系统】如何在linux系统下运行C程序