您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

谈一谈我所理解的微服务中的注册中心

时间:2020-05-17 16:32:16  来源:  作者:

微服务现在是一个很火的话题,好像不管项目的大小,适用范围都在往微服务上去靠。这也使得现在如果不会微服务出去都没法和别人聊了。

仅从我自己的工作经历来看,尽管我们的项目也是微服务化了的。但是说实话在业务开发过程中并没有体会到微服务的开发和单体项目开发中存在很大的区别(仅业务开发这一块来说)。

微服务的学习单独的写几个demo并没有啥用,现在的框架封装程度都很高,就算是代码跑起来来依旧是云里雾里。微服务的学习更多的是搞清楚微服务中每一个组件到底是什么?为什么有这些组件?没有会怎么样?功能大概是怎么实现的?

搞清楚来这些基本上就可以说对微服务有个大体的掌握了。

为什么需要注册中心

在微服务中首先需要面对的问题就是不同的服务之间如何进行通信呢?在单体服务中如果不同的服务之间需要通信,一般就是服务将接口暴露,然后其他的服务通过http进行请求,那么很明显在微服务中也可以这样。

但这里存在的问题在于单体服务中我们需要请求的目标是我们在请求的url中直接写死的,因为服务不多可以这样。而微服务中需要考虑的是存在大量服务时手动维护服务列表是否合适?如果服务横向扩展时如何通知其他的服务?服务宕机后,如何及时下线等等问题。

注册中心的功能

注册中心的存在是为了更好更方便的管理应用中的每一个服务,是各个分布式节点之间的纽带。注册中心主要提供以下核心功能:

  • 服务注册与发现:动态的增减服务节点,服务节点增减后动态的通知服务消费者,而不需要由消费者来更新配置。
  • 服务配置:动态修改服务配置,并将其推送到服务提供者和服务消费者而不需要重启服务。
  • 健康检查和服务摘除:主动的检查服务健康情况,对于宕机的服务将其摘除服务列表。

注册中心的实现

注册中心的主要功能就是保存服务的具体信息,然后由服务消费者读取这些信息。从整体的流程上来说大概就是这样:

谈一谈我所理解的微服务中的注册中心

 

除了将服务注册到注册中心,实际还存在服务的反注册。

目前对注册中心的实现分为两种模式,分别为客户端(应用内注册)和服务端(应用外注册)。

客户端注册中心

目前客户端实现的注册中心比较有代表性的就是eureka,虽然eureka2.0版本在此前宣布闭源,但目前好像没有太大的影响。后续的话可以考虑阿里开源的nacos。

eureka是一个基于JAVA语言实现的费用与服务发现与注册的组件,包含服务端和客户端两部分。

服务端主要用来存储服务信息,定时进行服务检查。而客户端用于完成向服务端注册服务信息以及从服务端拉取服务信息等。

谈一谈我所理解的微服务中的注册中心

 

上图是eureka官给出的eureka的架构图。

从图中可以很明显的看到eureka的服务端也是作为一个服务部署,而客户端则是通过sdk的方式接入应用。客户端向服务端进行服务注册以及更新服务等,同时客户端从服务端获取服务信息,不同服务之间根据获得的服务信息进行远程调用。

为了满足服务的高可用,通过移动多个eureka server服务,不同eureka server相互注册实现服务的高可用。

服务端注册中心

eureka是由注册中心提供服务端和客户端的SDK,业务端通过引入注册中心提供的SDK,来实现服务的注册和发现。而服务端的注册中心则是通过应用外的组件来实现服务注册功能的。目前用的比较多的服务端注册中心组件如zookeeper、consul等。这里以zookeeper为例。

Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,是目前Dubbo官方主推搭配的注册中心。

谈一谈我所理解的微服务中的注册中心

 

上图是dubbo官网提供的zookeeper作为注册中心的基本原理。

以dubbo为根目录,创建一服务接口全限定名的目录,在其下创建存放服务提供者接口信息的providers目录、存放服务消费者接口信息的consumers目录、存放服务配置信息的configurators目录等。

服务提供者启动的时候在providers下创建一条服务信息,该信息可以被consumer获取。通过zk提供的watcher机制注册一个watcher在服务提供者的providers目录下,这样当服务出现扩容或者宕机的时候就可以立即被consumer消费。

注册中心的问题

在微服务中,注册中心作为一个存储所有服务中心的地方必然不可能是单机的。因为如果注册中心无法使用,那么服务提供者就无法对外暴露自己的服务,消费者也无法获取自己需要调用的服务的具体地址,整个应用将会崩溃。首先需要保证的就是注册中心的高可用。

一致性和可用性的抉择

说到高可用,CAP理论是绕不过去的,CAP简单来说就是我们需要在服务的可用性和服务间的一致性进行一个抉择。是牺牲可用性来保证强一致性还是保证可用性牺牲强一致性呢?

CP类型注册中心

Zookeeper是一个典型的CP类型的高可用组件。zookeeper实现来paxos算法,zookeeper集群有一个节点作为leader,如果leader节点挂了zk会通过ZAB协议来进行leader选举,但是在选举的过程中zk是不能对外提供服务的。

而且当因为网络分区导致zk集群出现脑裂问题时,由于ZAB协议需要半数以上的节点参与,所以可能会有部分或者全部的zk节点无法对外提供服务。但是zk可以保证所有可用节点都数据都是一致,即使节点崩溃,在恢复后也会和其他节点保持一致,这就是zk牺牲了可用性而保证的强一致性。

AP类型注册中心

而类似与eureka的注册中心则是AP类型的。eureka实现高可用是通过启动多个eureka server服务,每一个eureka server即是提供者也是消费者,每个eureka server将自己作为服务注册给其他的eureka server,这样每个eureka server都是其他server 的replica。eureka这种模式中每个节点都是平等的,不存在leader、flower。

当集群中某一个server节点宕机,请求可以直接转移到其他节点。即使发生了网络分区,尽管不同分区之间无法进行通信,但是在每一个分区内的节点是通信并且可以正常对外提供服务,这样就保证了在server节点宕机的情况下的注册中心的可用性。

而问题在于由于不同分区无法通信,就导致可能一部分节点的数据和另一部分有差别,这就是牺牲了强一致性来换取系统可用性。

注册中心的选择

首先我们应该明确的是其实注册中心的存在与否应该是不能直接影响服务的调用的。服务之间的调用时通过http或者rpc等协议直接调用的,注册中心只是提供一个调用地址。服务是否可以正常使用不能直接靠注册中心节点信息来决定。

即使注册中心出现问题,只要服务本身没有宕机,理论上来说还是应该正常对外提供服务。所以很明显对于我们来说AP类型的注册中心是要优于CP类型的注册中心的。

当然在实际实现过程中很多框架都会尽可能的去修补这些问题,比如eureka会定时的同步各个节点的数据,尽可能的做到数据一致性。dubbo的zk注册中心实现过程中也会本地缓存服务信息并不是完全通过zk信息来决定是否剔除服务等。所以实际在选择时还是需要根据自身实际以及是否还有其他需求来确定。

混合语言开发

在微服务中,每一个服务都是一个独立的整体。各个服务之间并不向单体应用中的不同模块大都要求是同一语言实现。现如今各大公司开发语言是多样化的,不同的业务线开发的语言可能都不尽相同,混合语言是我们必须要面对的一个问题,所以出现了多语言之间服务调用的问题。

对于像eureka这样的应用内的注册中心。由于服务的注册与发现都是依赖于SDK,所以如果要使用eureak那需要对应的语言实现的SDK,目前有不少语言都有提供如Python、node.js。目前springclould的Sidecar组件也可以做到将其他语言纳入到springclould体系中来。

对于应用外的注册中心,一般会由这些中间件提供客户端操作实现。然后由语言本身来实现服务注册和治理等功能。目前很多语言实际上也有相关的开源工程。

节点存活判断

前面已经说过了保证CP类型的强一致性注册中心以及AP类型保证可用性的注册中心。而对于一个注册中心来说最重要的就是管理其中的节点信息。服务启动的时候需要将服务信息记录,当服务出现问题的时候需要将服务摘除。

但是问题在于如何实现这个摘除的操作,目前注册中心的实现都是通过心跳检测来判断服务的健康状态。正常情况下如果服务宕机了,心跳检测无法和服务通信判断该节点无法正常服务,将服务从注册中心摘除,这个过程是没有问题的。但是如果发生网络问题,比如网络抖动或者网络分区,这时候心跳检测肯定是无法正常通信的,但如果就因此直接将服务摘除那肯定是有问题的,因为节点实际上是能够正常提供服务的。所以需要有机制来确保这个过程不会粗暴的将节点从注册中心摘除。

客户端判断

目前很多的框架实现都会在本地缓存微服务的节点信息。实际上使用这些节点的是各个服务,服务是否能正常使用,这些节点才是最有发言权的。

客户端缓存了节点信息,当服务端判定服务出现问题后发出更新请求时,客户端并不立刻删除,可以先做一个标识。后续的业务请求过来后,仍旧判定该服务时可用的,只有当发出的请求无法收到正常回应时才将该服务摘除。由客户端来决定节点是否可用,不过这需要容错机制来支持。

动态设置心跳检测

在网络频繁抖动的情况下,注册中心的节点信息会快速变化,也会给客户端发送大量的信息,当服务较多的时候可能会有大量的带宽被占用导致正常的请求都无法处理。

所以需要一种动态的调整注册中心心跳检测频率的机制,当检测到网络抖动频繁时,根据网络情况调整心跳检测的频率,比如调整为正常情况下的1/2,10/1等。在网络正常时心跳检测也恢复正常。

小结

注册中心是微服务架构中一个很关键的组件,其保证来各个服务之间正常调用,以及服务的横向扩容等功能。在进行注册中心选型时需要考虑业务场景。


作者:不能摸鱼啦
链接:
https://juejin.im/post/5ebe0ae36fb9a0432a3c43b6



Tags:微服务   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  Tags: 微服务  点击:(9)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  Tags: 微服务  点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  Tags: 微服务  点击:(35)  评论:(0)  加入收藏
实施微服务架构,我们一直在遵循一个实践原则:每个微服务要有自己独立的数据库,避免数据库层面的耦合。这种理所当然感觉好像不需要多加思考,就是应该这样做; 图片来源:James Lewi...【详细内容】
2021-10-11  Tags: 微服务  点击:(42)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: 微服务  点击:(61)  评论:(0)  加入收藏
今天,字节跳动正式宣布开源 CloudWeGo。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点。项目地址:https://github.com/clo...【详细内容】
2021-09-08  Tags: 微服务  点击:(93)  评论:(0)  加入收藏
1. Spring Boot 与 Spring Cloud Spring Boot 是用于编写微服务的 Java 基础框架。在Spring Cloud 提供了各种构建全栈微服务的功能。构建小型和大型系统都适合。由于控制反...【详细内容】
2021-08-31  Tags: 微服务  点击:(162)  评论:(0)  加入收藏
现有问题在 EFK 日志收集 篇中,我们讲解了如何利用 EFK 收集 Kubernetes 集群日志。但是,还存在如下问题。 Elasticsearch 以单节点的形式部署,不能满足生产环境的要求 Fluentd...【详细内容】
2021-08-13  Tags: 微服务  点击:(104)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: 微服务  点击:(174)  评论:(0)  加入收藏
一、微服务的现状及未来1.服务架构的演变1.1 单体架构  单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问...【详细内容】
2021-07-22  Tags: 微服务  点击:(125)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条