当前位置: 首页 > news >正文

[Spring Cloud][5] 注册中心详解,CAP 理论,什么是 Eureka

背景

问题描述

上篇文章的例子中可以看到,远程调用时,我们的 URL 是写死的

String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();

当更换机器,或者新增机器时,这个 URL 就要跟着变更,就需要去通知所有的相关服务求修改。随之而来的就是各个项目的配置未见反复更新,各个项目的频繁部署。这种没有具体意义,但又不得不做的工作,会让人非常痛苦

解决思路

试想生活中的场景:
我们的生活,避免不了和各个机构(医院,学校,政府部门等)打交道,就需要保存各个机构的电话号码。如果机构换了电话号码,就需要通知各个使用方,但这些机构的使用方群体是巨大的,没法做到一一通知,怎么处理呢?

机构电话如果发生变化,通知 114。用户需要联系机构时,先打 114 查询电话,然后再联系各个机构。114 查号台的作用主要有两个:

  • 号码注册:服务方把电话上报给 114
  • 号码查询:使用方通过 114 可以查到对应的号码image.png

同样的,微服务开发时,也可以采用类似的方案

  • 服务启动/变更时,向注册中心报道。注册中心记录应用和 IP 的关系
  • 调用方调用时,先去注册中心获取服务方的 IP,再去服务方进行调用

什么是注册中心

在最初的架构体系中,集群的概念还不那么流行,且机器数量也比较少,此时直接使用 DNS + Nginx 就可以满足几乎所有服务的发现。相关的注册信息直接配置在 Nginx

  • 但是随着微服务的流行与流量的激增,机器规模逐渐变大,并且机器会有频繁的上下线行为,这种时候需要运维手动地去维护这个配置信息是一个很麻烦的操作
  • 所以开发者们开始希望有这么一个东西,它能维护一个服务列表,哪个机器上线了,哪个机器宕机了,这些信息都会自动更新到服务列表上,客户端拿到这个列表,直接进行服务调用即可
  • 这个就是注册中心

注册中心主要有三种角色:

  • 服务提供者(Server):一次业务中,被其他微服务调用的服务。也就是提供接口给其他微服务
  • 服务消费者(Client):一次业务中,调用其他微服务的服务。也就是调用其他微服务提供的接口
  • 服务注册中心(Registry):用于保存 Server 的注册信息,当 Server 节点发生变更时,Registry 会同步变更。服务与注册中心适用于一定机制通信,如果注册中心与某服务长时间无法通信,就会注销该实例

他们之间的关系以及工作内容,可以通过两个概念来描述:

  • 服务注册:服务提供者在启动时,向 Registry 注册自身服务,并向 Registry 定期发送心跳,汇报存活状态
  • 服务发现:服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。服务发现的一个重要作用就是提供给消费者一个可用的服务列表image.png

CAP 理论

要谈到注册中心,就避不开 CAP 理论


CAP 理论是分布式系统设计中最基础,也是最关键的理论image.png|359

  • 一致性Consistency):CAP 理论中的一致性,指的是强一致性。所有节点在同一时间具有相同的数据
  • 可用性Availability):保证每个请求都有响应(响应结果可能不对)
  • 分区容错性Partition Tolerance):当出现网络分区后,系统仍然能够对外提供服务

一个部分全国各地都有岗位,这时候,总部下发一个通知,由于通知需要开会周知全院,当有客户咨询时:

  1. 所有成员对客户的回应结果都是一致的(一致性
  2. 客户咨询时,一定有回应(可用性
  3. 当其中一个成员休假时,这个部门的其他成员也可以对客户提供咨询服务(分区容错性

CAP 理论告诉我们:一个分布式系统不可能同时满足数据一致性、服务可用性和分区容错性这三个基本需求,最多只能同时满足其中的两个

分布式系统中,系统间的网格不能 100% 保证健康,服务又必须对外保证服务。因此 Partition Tolerance 不可避免。那就只能在 CA 选择一个,也就是 CP 或者 AP 架构


正常情况image.png

网路异常image.png

  • CP 架构:为了保证分布式系统对外的数据一致性,于是选择不返回任何数据
  • AP 架构:为了保证分布式系统的可用性,节点 2 返回 V0 版本的数据(即使这个数据不正确)
  • 更多参考: https://cloud.tencent.com/developer/article/1860632

常见的注册中心

  1. Zookeeper

    • Zookeeper 的官方并没有说它是一个注册中心,但是国内 Java 体系,大部分的集群环境都是依赖 Zookeeper 来完成注册中心的功能
  2. Eureka

    • EurekaNetflix 开发的基于 REST 的服务发现框架,主要用于服务注册,管理,负载均衡和服务故障转移
    • 官方声明在 Eureka 2.0 版本停止维护,不建议使用。但是 EurekaSpring Cloud 服务注册/发现的默认实现,所以目前还是有很多公司在使用
  3. Nacos

    • NacosSpring Cloud Alibaba 架构中的重要组件,除了服务注册、服务发现功能之外 Nacos 还支持配置管理、流量管理、DNS、动态 DNS 等多种特性

CAP 理论对比

ZookeeperEurekaNacos
CAP 理论CPAPCP 或 AP
默认 AP
在分布式环境中,即使拿到一个错误的数据,也胜过无法提供实例信息而造成请求失败要好(比如淘宝 11.11,京东 618 都是谨遵 AP 原则)

Eureka 介绍

EurekaNetFlix OSS 套件中关于服务注册和发现的解决方案。Spring CloudEureka 进行了集成,并作为优先推荐方案进行宣传,虽然目前 Eureka 2.0 已经停止维护,新的微服务架构设计中,也不再建议使用,但是目前依然有大量公司的微服务系统使用 Eureka 作为注册中心

Eureka 主要分为两个部分:

  • Eureka Server:作为注册中心 Server 端,喜爱那个微服务应用程序提供服务注册、发现、健康检查等能力
  • Eureka Client:服务提供者,服务启动时,会向 Eureka Server 注册自己的信息(IP,端口,服务信息等),Eureka Server 会存储这些信息

关于 Eureka 的学习,主要包含以下三个部分:

  1. 搭建 Eureka Server
  2. order_serviceproduct_service 都注册到 Eureka
  3. order_service 远程调用时,从 Eureka 中获取 product_service 的服务列表,然后进行交互

文章转载自:

http://qhTMP1wB.rhchr.cn
http://4IDgJQkB.rhchr.cn
http://zzUIkgD0.rhchr.cn
http://tlvyuVqa.rhchr.cn
http://DDYYTRxX.rhchr.cn
http://h4dAQdwd.rhchr.cn
http://Ysoy5Ysc.rhchr.cn
http://IqXCHXbj.rhchr.cn
http://S98GOVpJ.rhchr.cn
http://THKju2VA.rhchr.cn
http://PwO2Vezx.rhchr.cn
http://TZF8UjMa.rhchr.cn
http://o1n6Asdy.rhchr.cn
http://OeqtNYAp.rhchr.cn
http://O6cT53Ck.rhchr.cn
http://IH5U8QpQ.rhchr.cn
http://WORFwfwU.rhchr.cn
http://ayPivpV8.rhchr.cn
http://HFkwYSnn.rhchr.cn
http://Savpzkzr.rhchr.cn
http://97ymb2fH.rhchr.cn
http://nmoHEbAh.rhchr.cn
http://yP3f46XZ.rhchr.cn
http://xQ6aKohi.rhchr.cn
http://BsVhjAnr.rhchr.cn
http://8eSOGJUK.rhchr.cn
http://BWLnTW0w.rhchr.cn
http://HvjeGYA2.rhchr.cn
http://xqZjlgQm.rhchr.cn
http://uYfyP5Ym.rhchr.cn
http://www.dtcms.com/a/382956.html

相关文章:

  • 返利app的跨域问题解决方案:CORS与反向代理在前后端分离架构中的应用
  • C++算法题—图的邻接矩阵输入形式(I\O)
  • 主动性算法-如何让机器拥有嗅觉?
  • Knockout.js Google Closure Compiler 工具模块详解
  • 从关键词匹配到语义理解:6大Embedding技术如何重塑企业搜索
  • 【面试实录01】
  • Docker 容器化部署核心实战——镜像仓库管理与容器多参数运行详解
  • Jenkins的安装与简单使用
  • Step-by-Step:用C语言构建一个带精准错误提示的括号匹配器
  • 【LeetCode - 每日1题】元音拼写检查器
  • KingbaseES读写分离集群架构解析
  • 教育领域大模型生成题目安全研究报告
  • .Net程序员就业现状以及学习路线图(七)
  • uniapp如何使用本身的字体图标
  • Uniapp崩溃监控体系构建:内存泄漏三维定位法(堆栈/资源/线程)
  • window显示驱动开发—显示适配器的子设备
  • 单变量单步时序预测 | TCN-BiGRU时间卷积神经网络结合双向门控循环单元
  • 项目实战——“微商城”前后台【005】之前台项目首页编写
  • 如何利用redis使用一个滑动窗口限流
  • Go与Python/PHP的比较
  • JVM 运行时数据区详解:程序计数器、虚拟机栈、堆内存、方法区与直接内存
  • MongoDB $type 操作符
  • 【靶场练习】--DVWA第一关Brute Force(暴力破解)全难度分析
  • ConcatenationShortcut
  • 设计模式(C++)详解—原型模式(3)
  • 设计模式(C++)详解—原型模式(2)
  • 使用 kubeasz的ezdown部署单节点集群(aio),作为k8s集群的测试环境教程
  • pytest -- 中文文档
  • 数据库造神计划第八天---增删改查(CRUD)(4)
  • Spark专题-第一部分:Spark 核心概述(2)-Spark 应用核心组件剖析