微服务·架构组件之注册与发现

引言

微服务架构在现代软件开发中越来越受欢迎,它通过将系统拆分为多个小型、自治的服务来提高可维护性、可扩展性和灵活性。然而随着服务数量的增多,服务之间的通信何发现变得更加复杂。本报告旨在深入探讨微服务中的注册与发现,介绍其背景、核心概念、实现技术以及应用实例。

背景与概念

在微服架构中,服务通常是独立部署的,它们可能会在分布式环境中的不同主机上运行。服务之间需要相互通信,但由于服务的数量和位置的变化,需要一种机制来自动识别和定位服务。这就是服务注册与发现的作用。

服务注册

服务注册是将服务的元数据(如服务的名称、地址、端口等)注册到一个中心化的注册中心或服务注册表中。注册中心充当服务的目录,存储所有可用的服务信息

服务发现

服务发现是指客户端应用程序通过查询注册中心来查询需要调用的服务的位置,客户端不需要硬编码服务的位置,而是通过机制来获取。

实现技术

常用的服务注册中心组件有Consul、Eureka、etcd、Zookeeper、Nacos。接下来会对这些组件进行详细的分析。

数据模型

注册中心的核心数据是服务名称和它对应的网络地址。当服务注册了多个实例时,我们需要对不健康的实例进行过滤或者针对实例的一些特征进行流量的分配,那么需要在实例上存储一些例如健康状态、权重等属性。随着服务规模的扩大,又需要在整个服务级别设定一些权限规则,以及对所有实例都生效的一些开关,于是在服务级别又会设立一些属性。再往后,发现单个服务的实例又会划分为多个子集的需求,例如一个服务是多机房部署的,那么可能需要对每个机房做不同的配置这样又需要在服务和实例之间再设定一个数据级别。

另外需要考虑的是数据的隔离模型,作为一个共享服务的组件,需要能够在多个用户或者业务方使用的情况下,保证数据的隔离和安全。

注册中心数据模型隔离模型
Nacos服务-集群-实例三层模型四层逻辑隔离模型
Zookeeperk-v
Eureka/Consul实例模型

服务的分级模型:

在这里插入图片描述

服务的逻辑隔离模型:

在这里插入图片描述

数据一致性

数据一致性可以归为两类,一种是基于Leader的非对称部署的单点写一致性,一种是对称部署的多写一致性。

注册中心一致性协议特点
Nacos简化的Raft(CP),Distro(AP)具备机房容灾,集群扩展能力
ZookeeperZAB保证数据的强一致性,缺乏机房容灾,无法适应大型场景
EurekaRenew

负载均衡

负载均衡严格的说并不算传统注册中心的功能。一般来说服务发现的完成流程应该是先从注册中心获得服务的实例列表,然后根据自身的需求来选择其中的部分实例或者按照一定的流量分配机制来访问不同的服务提供者,因此注册中心本身一般不限定服务消费者的访问策略。Eureka、Zookeeper包括Consul本身都没有去实现可配置及可扩展的负载均衡机制,Eureka的负载均衡是由Ribbon来完成的,而Consul则是由Fabio做负载均衡。

服务消费者往往不关心所访问的服务提供者的负载均衡,它们只关心以最高效和正确的访问服务提供者的服务。而服务提供者,则非常关心自身被访问的流量的调配。因此服务提供者需要能够完全掌握服务的流量调配,并可以动态调整。目前的负载均衡由基于权重、服务提供者负载、响应时间、标签等策略。

  • Ribbon(客户端负载均衡),主要是选择合适现有的IRule,ServerListFilter等接口,或自己继承这些接口,实现自己的过滤逻辑
    • RoundRobinRule,轮询,Ribbon的默认负载均衡策略
    • RandomRule,随机
    • RetryRule,先按照轮询的策略获取服务,如果获取服务失败则在指定时间内进行重试,获得可用的服务
    • WeightResponseTimeRule,对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
    • BestAvailableRule,先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    • AvailablityFilteringRure,先过滤掉故障实例,在选择并发量较小的实例
    • ZoneAvoidanceRule,默认规则,复合判断server所在区域的性能和servier的可用性选择服务器
  • Nacos(服务端负载均衡),除了提供基于健康检查和权重的负载均衡方式外,还提供了基于第三方CMDB的标签负载均衡器
注册中心负载均衡
Nacosnacos
Zookeeper
Eurekaribbon

健康检查

Zookeeper和Eureka都是实现一种TTL机制,就是如果客户端在一定时间内没有向注册中心发送心跳,则会将这个客户端摘除。Eureka允许在注册服务的时候自定义检查自身状态的健康检查方法。在Dubbo和SpringCloud这两大体系内,也是使用TTL作为默认健康检查机制。Nacos目前支持临时实例使用心跳上报方式维持活性,发送心跳的周期默认是5s,Nacos服务端会在15s没有收到心跳将实例设置为不健康,在30s没有收到心跳时将这个临时实例摘除。

客户端健康检查和服务端健康检查有一些不同的关注点。客户端健康检查只要关心客户端上报心跳的方式,服务端摘除不健康客户端的机制。而服务端健康检查,则关注探测客户端的方式、灵敏度及设置客户端健康状态的机制。Nacos既支持客户端健康检查,也支持服务端健康检查

性能与容量

影响读写性能的因素有很多,一致性协议、机器的配置、集群的规模、存量数据的规模、数据结构以及读写逻辑的设计等。但是并不是性能越高越好,因为追求性能往往需要在其他方面做出牺牲。Zookeeper在写性能上可以达到上万的TPS,但是写逻辑是通过k-v进行的,内部没有聚合,其次Zookeeper舍弃了服务发现的基本功能,如健康检查、友好的查询接口等,最后Paxos协议本身就限制了Zookeeper的集群规模。

注册中心容量
Nacos10W+
Zookeeper百万级
Eureka5000左右

易用性

Zookeeper的易用性比较差,客户端使用比较复杂,没有针对服务发现的模型设计以及响应的API封装,对多语言的支持也不太好,同时也没有比较好用的控制台进行运维管理。

Eureka和Nacos有针对服务注册与发现的客户端,基于springCloud体系的starter,帮助用户以非常低的成本无感知的做到服务注册与发现。同时还暴露标准的HTTP接口,支持多语言和跨平台访问。

集群扩展性

Zookeeper使用的ZAB协议,由于是单点写,在集群扩展上不具备优势。Eurake在协议上说理论可以扩展到很大的规模,因为都是点对点的数据同步,但是性能有很大的问题。

集群扩展性的另一方面是多地域部署和容灾支持。当讲究集群的高可用和稳定性以及网络上的跨地域延迟要求能够在每个地域都部署集群的时候,我们现有的方案有多机房容灾、异地多活、多数据中心等。

多机房容灾问题,基于Leader写的协议是无法支持的,意味着Zookeeper不能在没有人工干预的情况下做到多机房容灾。Eurake的部署模式天然支持多机房容灾,因为Eurake采用的是纯临时实例的注册模式:不持久化、所有数据同通过客户端心跳上报补偿。Nacos支持两种模式的部署,一种是AP协议的部署,可以完美替代当前的Zookeeper、Eurake并支持多机房容灾。另一种是CP模式,不支持多机房容灾。

小结

注册中心数据结构数据一致性负载均衡健康检查容量易用性集群扩展性
Nacos三层(Service-Cluster-instance)Raft, DistronacosTTL10W+推荐支持多机房容灾
Eurake单层(instance)RenewRibbonTTL5000左右推荐支持多机房容灾
Zookeeperk-v结构ZAB-TTL100W不推荐不支持多机房容灾

应用案例

  • Hadoop生态系统使用Zookeeper管理各个组件的状态和位置,实现高可用、故障转移等功能。
  • Nerfix的微服务架构中使用Euraka作为服务注册与发现以及故障转移和负载均衡等功能
  • Nacos作为微服务架构中主流的服务注册与发现中心被广泛使用。

总结和展望

服务注册与发现是微服务架构中的关键组成部分,它为分布式系统提供了自动化的服务管理和通信机制。不同的实现技术适用于不同的场景,开发者可以根据需求选择合适的工具。随着微服务架构的发展,服务注册与发现的技术也在不断演进,未来将更加强调性能、安全性和多云支持等方面的创新。

参考文献

Netflix Eureka Documentation: https://github.com/Netflix/eureka
Apache ZooKeeper Documentation: https://zookeeper.apache.org/doc/r3.7.0/
Nacos架构&原理https://developer.aliyun.com/ebook/36?spm=a2c6h.20345107.ebook-index.18.152c2984fsi5ST

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/97123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NRF52832一主多从ble_app_multilink_central

下载官方SDK后打开路径:nRF5SDK153059ac345\nRF5_SDK_15.3.0_59ac345\examples\ble_central\ble_app_multilink_central\pca10040\s132\arm5_no_packs 下的工程文件,确定把log开启 编译后下载完程序(要下载协议栈,这里用6.1.1的)&#xff0c…

对于论文Semi-Supervised Classification with Graph Convolutional Networks,小白的学习理解

参考笔记:论文笔记:Semi-Supervised Classification with Graph Convolutional Networks_hongbin_xu的博客-CSDN博客 论文笔记:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS_semi supervised classification_饮冰l的博…

Linux CentOS安装抓包解包工具Wireshark图形化界面

1.Wireshark介绍 Wireshark 是一个开源的网络协议分析工具,它能够捕获和分析网络数据包,提供深入的网络故障排除、网络性能优化和安全审计等功能。它支持跨多个操作系统,包括 Windows、macOS 和 Linux。 2.Wireshark主要使用方法 捕获数据…

K8S容器OOM killed排查

背景 数据服务平台南海容器k8s设置的内存上限2GB,多次容器被OOM killed。 启动命令 java -XX:MaxRAMPercentage70.0 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/apps/logs/ ***.jar排查过程 1 当收到实例内存超过95%告警时,把jvm进程堆dump下…

htmx-使HTML更强大

‍本文作者是360奇舞团开发工程师 htmx 让我们先来看一段俳句: javascript fatigue: longing for a hypertext already in hand 这个俳句很有意思,是开源项目htmx文档中写的,意思是说,我们已经有了超文本,为什么还要去使用javascr…

三、原型模式

一、什么是原型模式 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&a…

模拟实现应用层协议

模拟实现应用层协议 文章目录 模拟实现应用层协议应用层再谈协议 序列化和反序列化 网络版计算器自定义协议利用Json进行序列化和反序列化json库的安装条件编译 应用层 应用层(Application layer)是OSI模型的第七层。应用层直接和应用程序接口并提供常见…

Unity 状态机

Enemy状态以及切换图 程序架构 接口 public interface IState {void OnEnter(); //进入状态时void OnUpdate();//执行状态时void OnExit(); //退出状态时 }接口实现及状态切换类 public class IdleState : IState {private FSM manager;private Parameter parameter;public…

开源且强大的网络嗅探分析工具——Wireshark

Wireshark是一款强大的开源网络协议分析工具,旨在帮助用户深入了解网络通信的细节。通过捕获、解析和展示网络数据包,Wireshark能够帮助工程师诊断问题、优化性能,以及解决各种网络难题。无论是深入分析还是快速调试,Wireshark都是…

C++ 多重继承

所谓多重继承就是一个儿子有好几个爹&#xff0c;然后一个人继承了这几个爹的财产。只需注意构造顺序即可&#xff0c;反正析构的顺序也是一样的。 #include <iostream> #include <string.h> using namespace std;class base_a { public:base_a(const char *str){…

华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整

笔记本电脑相较于台式电脑&#xff0c;更易携带&#xff0c;解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足&#xff0c;比如华硕笔记本电脑就经常会出现摄像头倒置的错误&#xff0c;出现这种问题要如何修复呢&#xff1f;下面就来看看详细的调整方法。 华硕笔记…

opencv 案例05-基于二值图像分析(简单缺陷检测)

缺陷检测&#xff0c;分为两个部分&#xff0c;一个部分是提取指定的轮廓&#xff0c;第二个部分通过对比实现划痕检测与缺角检测。本次主要搞定第一部分&#xff0c;学会观察图像与提取图像ROI对象轮廓外接矩形与轮廓。 下面是基于二值图像分析的大致流程 读取图像将图像转换…

C/C++ 个人笔记

仅供个人复习&#xff0c; C语言IO占位符表 %d十进制整数(int)%ldlong%lldlong long%uunsigned int%o八进制整型%x十六进制整数/字符串地址%c单个字符%s字符串%ffloat&#xff0c;默认保留6位%lfdouble%e科学计数法%g根据大小自动选取f或e格式&#xff0c;去掉无效0 转义符表…

LeetCode第6~10题解

CONTENTS LeetCode 6. N 字形变换&#xff08;中等&#xff09;LeetCode 7. 整数反转&#xff08;中等&#xff09;LeetCode 8. 字符串转换整数-atoi&#xff08;中等&#xff09;LeetCode 9. 回文数&#xff08;简单&#xff09;LeetCode 10. 正则表达式匹配&#xff08;困难&…

Flutter 混合开发调试

针对Flutter开发的同学来说&#xff0c;大部分的应用还是Native Flutter的混合开发&#xff0c;所以每次改完Flutter代码&#xff0c;运行整个项目无疑是很费时间的。所以Flutter官方也给我们提供了混合调试的方案【在混合开发模式下进行调试】&#xff0c;这里以Android Stud…

VUE笔记(四)vue的组件

一、组件的介绍 1、组件的作用 整个项目都是由组件组成 可以让代码复用&#xff1a;相似结构代码可以做成一个组件&#xff0c;直接进行调用就可以使用&#xff0c;提高代码复用性 可以让代码具有可维护性&#xff08;只要改一处&#xff0c;整个引用的部分全部都变&#xf…

Java8实战-总结17

Java8实战-总结17 引入流流操作中间操作终端操作使用流 小结 引入流 流操作 java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。再来看一下前面的例子&#xff1a; List<String> names menu.stream() //从菜单获得流 .filter(d -> d.get…

SpringBoot - Google EventBus、AsyncEventBus

介绍 EventBus 顾名思义&#xff0c;事件总线&#xff0c;是一个轻量级的发布/订阅模式的应用模式&#xff0c;最初设计及应用源与 google guava 库。 相比于各种 MQ 中间件更加简洁、轻量&#xff0c;它可以在单体非分布式的小型应用模块内部使用&#xff08;即同一个JVM范围…

xml和json互转工具类

分享一个json与xml互转的工具类&#xff0c;非常好用 一、maven依赖 <!-->json 和 xm 互转</!--><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency&g…