【Spring Cloud】微服务注册中心的工作原理

SueWakeup

                                                     个人主页:SueWakeup

                                                     系列专栏:学习技术栈

                                                     个性签名:人生乏味啊,我欲令之光怪陆离 

 

本文封面由 凯楠📷 友情提供!

 目录

前言 

1. 注册中心的主要作用

2. 常见的注册中心

3. Nacos 服务注册和发现的工作原理

4. Nacos 和 Consul 在服务注册和发现方面的不同

5. 分布式配置管理

6. Nacos 的核心功能

7. 实现配置中心的动态刷新

8. Nacos 作为配置中心的优势

9. Nacos 如何支持灰度发布

10. 使用 Nacos 实现动态路由

11. 使用 Nacos 实现服务的动态权重调整


前言 

Spring、Spring Boot 和 Spring Cloud 都是 Java 领域中广泛使用的框架,在理解 Spring Cloud 的原理之前,我们需要理清这三者之间的关系和区别。

Spring:一个开源的 “轻量级” Java 开发框架,提供丰富的功能和组件,并且包含多个模块(Spring Core、Spring MVC、Spring Data等),核心思想是 IOC(控制反转) 和 APO(面向切面编程)

Spring Boot:Spring 团队推出的用于简化 Spring 应用开发的框架,内置了许多常用的配置,只需少量的配置就能创建独立运行的、生产级别的 Spring 应用

Spring Cloud:基于 Spring Boot 的微服务架构开发工具,为构建分布式系统提供了一整套解决方案。其核心原理涉及到 微服务架构、服务注册与发现、负载均衡、网关等多个方面


1. 注册中心的主要作用

  • 服务发现
    • 服务注册/反注册:保存服务提供者和服务调用者的信息
    • 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,实时推送
    • 服务路由(可选):具有筛选整合服务提供者的能力
  • 服务配置
    • 配置订阅:服务提供者和服务调用者订阅微服务相关的配置
    • 配置下发:主动将配置推送给服务提供者和服务调用者
  • 服务健康检测
    • 检测服务提供者的健康情况

2. 常见的注册中心

  • Zookeeper

分布式服务框架,Apache Hadoop 的子项目

主要解决分布式应用中经常遇到的一些数据管理问题

如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等

  • Eureka

在 Java 语言上,基于 RESTful API 开发的服务注册与发现组件,Spring Cloud Netflix 的重要组件

  • Consul

由 HashiCorp 基于 Go 语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,采用 Raft 算法保证服务的一致性,且支持健康检查

  • Nacos

更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

注册中心 + 配置中心的组合,提供简单易用的特性集,解决微服务开发必会涉及到的 “服务注册与 发现、服务配置、服务管理” 等问题

Spring Cloud Alibaba 组件之一,负责服务注册与发现

组件名语言CAP一致性算法服务健康检查对外暴露接口
EurekaJavaAP可配支持HTTP
ConsulGoCPRaft支持HTTP/DNS
ZookeeperJavaCPPaxos支持客户端
NacosJavaAPRaft支持HTTP

3. Nacos 服务注册和发现的工作原理

  1. 服务注册:在服务实例启动时,向 Nacos 服务器发送一个注册请求。请求包含了服务的相关信息,如服务名、IP地址、端口号等
  2. 服务同步:Nacos 服务器接收到注册信息后,将这些信息存储在服务列表中,并同步到其他 Nacos 节点,保证服务信息的一致性
  3. 服务发现:当客户端需要调用服务时,向Nacos 服务器请求该服务的信息。Nacos 会返回服务列表,客户端可以根据这些信息找到相应的服务实例进行调用
  4. 心跳检测:服务实例会定期向 Nacos 发送心跳包,以证明自己还 “活着” 。如果 Nacos 在配置的时间内未收到某服务实例的心跳,会认为该实例不可用,从服务列表中移除
  5. 服务更新:当服务实例的状态发送变化,或有新的实例注册时,Nacos 会实时更新服务信息,并通知给其他服务消费者

这些功能共同保障了在微服务架构中服务的高效注册、发现和健康状态管理


4. Nacos 和 Consul 在服务注册和发现方面的不同

特性NacosConsul
一致性算法AP模式,侧重于可用性CP模式,侧重于一致性
数据存储支持将服务信息存储在内存和外部数据库中内部的 Raft 协议进行数据同步
健康检查健康检查相对简单更丰富的健康检查机制,如HTTP、TCP、Docker、Shell 脚本等
多数据中心支持用于单数据中心支持多数据中心,适合大规模的分布式系统
配置管理提供服务发现和动态配置服务专注于服务发现

5. 分布式配置管理

  1. 配置中心设置:在 Nacos 中设置全局配置信息,可以包括数据库连接、远程服务地址等
  2. 服务端集成:在微服务应用中集成 Nacos Config 客户端,通过配置文件指定 Nacos 服务器地址和需要订阅的配置信息
  3. 动态更新:当 Nacos 中的配置信息发生变化时,Nacos Config 客户端会自动获取最新配置,并可以动态地更新到应用中,无需重启服务
  4. 配置共享和隔离:支持不同环境和服务的配置隔离,同时也支持公共配置的共享

这种方式大大简化了微服务架构中的配置管理,使得配置的更新和维护更加灵活和高效


6. Nacos 的核心功能

功能描述
服务发现与注册

Nacos 支持服务的动态注册与发现,这使得微服务之间能够灵活通讯,极

大地增强了服务管理和扩展能力

配置管理Nacos 提供动态的配置服务,允许应用在运行时动态调整配置而无需重启,支持配置的版本管理和回滚,以适应持续集成和持续部署(CI / CD)的需要
服务健康监测Nacos 实现了服务健康检查,可以及时发现并处理服务实例的异常,保障系统的高可用性
负载均衡Nacos 支持多种负载均衡策略,能够根据服务实例的运行情况自动调整请求分配,提升服务处理能力和效率
服务分组和命名空间支持通过分组和命名空间对服务进行逻辑隔离,便于在不同环境中管理和运行服务,例如开发、测试和生产环境

7. 实现配置中心的动态刷新

  1. 引入依赖:在项目中引入 Spring Cloud Alibaba Nacos Config 的依赖
  2. 配置文件编写:在 application.properties 或 application.yml 中配置 Nacos Config 相关参数,指定配置中心地址及命名空间
  3. 使用 @Value 或 @ConfigurationProperties 注解:将配置文件中的属性映射到 Java 类的字段上
  4. @RefreshScope 注解:在需要动态刷新配置的类上使用 @RefreshScope 注解
  5. 配置更新监听:配置更新时, Nacos Config 客户端会自动监听到变化,并触发配置的重新加载

8. Nacos 作为配置中心的优势

优势描述
动态配置管理支持配置的动态变更和实时更新,无需重启服务即可生效
多环境支持可以方便地管理和隔离不同环境(开发、测试、生产)的配置
集中式管理提供统一的配置管理界面,方便配置的集中管理和查看
支持多种配置格式支持多种数据格式,如 properties、yaml、json等满足不同场景需求
版本管理和回滚支持配置版本管理,出现问题可以快速回滚到之前的版本
微服务架构适配性特别适合在微服务架构中,与 Spring Cloud 无缝集成

9. Nacos 如何支持灰度发布

方式描述
流量分配通过 Nacos 配置不同的流量规则,将用户流量分配到不同的服务实例
版本管理通过版本标签管理不同的服务实例,实现灰度发布
配置管理利用 Nacos 的动态配置管理功能,动态调整服务配置
元数据控制使用服务元数据定义不同的服务分组,实现灰度策略
条件路由根据请求的参数或头信息,路由到不同版本的服务实例

10. 使用 Nacos 实现动态路由

  1. 集成Gateway:在项目中集成 Spring Cloud Gateway 作为 API网关
  2. Nacos 作为配置中心:利用 Nacos 作为动态路由的配置中心,存储路由规则
  3. 动态更新路由:配置 Spring Cloud Gateway 从 Nacos 动态加载路由规则,当 Nacos 中的路由配置发生变化时,Gateway 能够自动更新路由规则
  4. 路由规则定义:在 Nacos 中定义路由规则,如路径匹配、重定向、熔断等
  5. 验证和测试:对动态路由进行测试,确保路由规则的正确性和动态更新功能的有效性

11. 使用 Nacos 实现服务的动态权重调整

  • 服务注册时指定权重:在服务注册到 Nacos 时,可以在服务的元数据中指定权重信息
  • 动态更新权重:通过修改 Nacos 中服务元数据的权重值,实现权重的动态调整
  • 负载均衡策略:在服务消费者端,配置负载均衡策略以支持基于权重的路由决策
  • 权重变更生效:Nacos 客户端听到权重变更后,自动更新本地缓存的服务信息,实现权重调整的即时生效
  • 服务调用适应:服务消费者在进行服务调用时,会根据最新的权重信息选择服务实例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试真经(运维工程师)

1.熟悉的排序算法有哪些,它们的时间空间复杂度如何? 排序算法主要分为内部排序和外部排序。内部排序指的是数据记录在内存中进行排序,而外部排序则适用于排序的数据量很大,一次不能容纳全部排序记录的情况,需要在排序过程中访问…

关于VMware Workstation Pro无法与Windows互相进行复制粘贴的解决方案

说明:要实现Windows在wmware虚拟机上实现复制粘贴需要在虚拟机上下载 VMware Tools 工具。 1.查看虚拟机是否下载了VMware Tools工具。(下载了vMware Tools 会变成灰色的) 2.要是成功安装的话,你在去改一下这里。 设置完到这里理…

【面试题】HashMap为什么可以插入null而Hashtable就不可以(源码分析)

首先hashmap可以插入null值,但是hashtable和hashcurrentHashmap是不支持的;这是因为在 hashmap对插入key为null进行了特殊处理,当插入的值为null的时候会将哈希值设置为0 但是hashtable会直接抛出异常: 并且hashmap是线程不…

流畅的 Python 第二版(GPT 重译)(七)

第十三章:接口、协议和 ABCs 针对接口编程,而不是实现。 Gamma、Helm、Johnson、Vlissides,《面向对象设计的第一原则》 面向对象编程关乎接口。在 Python 中理解类型的最佳方法是了解它提供的方法——即其接口——如 “类型由支持的操作定义…

openssl3.2 - exp - openssl speed test

文章目录 openssl3.2 - exp - openssl speed test概述笔记表面上能列出的算法集合没列出的算法, 有的也支持不支持的算法的例子直接提示算法不支持算法的属性找不到到底哪些算法才是可以测试的算法?那看看哪些算法是支持的?包含支持的算法的名称数组在算法失败的提示处, 将支…

【一起学Rust | 基础篇】rust线程与并发

文章目录 前言一、创建线程二、mpsc多生产者单消费者模型1.创建一个简单的模型2.分批发送数据3. 使用clone来产生多个生产者 三、共享状态:互斥锁1. 创建一个简单的锁2. 使用互斥锁解决引用问题 前言 并发编程(Concurrent programming)&#…

未来已来?国内10家AI大模型盘点(附体验网址)

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、阿里云——通义千问2、科大讯飞——星火大模…

Unity类银河恶魔城学习记录11-3 p105 Inventory UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_itemSlot.cs using System.Collections; using System.Collections.Gen…

从初学者到专家:Java的Lambda表达式完整指南

一.Lambda的概念 概念:Lambda表达式是Java 8引入的一项重要功能,它允许我们以更简洁和灵活的方式编写代码。可以把Lambda表达式看作是一种更方便的匿名函数,可以像数据一样传递和使用。 使用Lambda表达式可以让我们写出更短、更易读的代码。…

C++ —— 内存管理

目录 1. C内存分布 2. C 内存管理方式 2.1 new 和 delete 操作内置类型 2.2 new 和 delete 操作自定义类型 3. operator new与operator delete函数 4. new和delete的实现原理 5. malloc/free 和 new/delete 的区别 1. C内存分布 首先看一段代码: int globalV…

用Python的turtle库绘制皮卡丘

turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现,turtle库是一种标准库,是python自带的。 turtle(海龟)是一种真实的存在,有一个海龟在窗口的正中心,在画布上游走,走过的轨迹形成了绘制的图形&#xff0…

进阶二叉树

目录 二叉树 二叉搜索树 二叉搜索树的定义 二叉搜索树的操作 哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 哈夫曼树的性质 平衡二叉树 平衡二叉树的定义: 平衡二叉树的插入调整 1.LL插入/LL旋转 2.RR插入/RR旋转 3.LR插入/LR旋转 4.RL插入/RL旋转 二叉树…

仿牛客项目Day10——统一异常处理、记录日志

统一异常处理 在controller里创建advice包,创建ExceptionAdvice类 这个注解括号里面是指只扫描被Controller标注的bean 请求request、响应response、异常exception 普通请求和异步请求的区别在于传的是json还是html吗? 统一记录日志 面向切面编程&…

IO多路复用、域套接字

思维导图 面试题TCP通信中的三次握手和四次: 客户端像向服务器端发送连接请求 服务器应答连接请求 客户端与服务器简历连接 客户端向服务器发送断开请求 服务器应答断开请求 服务器请求关闭连接 客户端发送确认应答 并行和并发的区别: 并行&#xff1a…

外包干了6天,技术明显进步。。。

我是一名大专生,自19年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年8月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

R语言Meta分析核心技术:从入门到精通

R语言作为一种强大的统计分析和绘图语言,在科研领域发挥着日益重要的作用。其中,Meta分析作为一种整合多个独立研究结果的统计方法,在R语言中得到了广泛的应用。通过R语言进行Meta分析,研究者能够更为准确、全面地评估某一研究问题…

Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块2、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文答…

‘sc‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述: sc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 通过mysql黑窗口命令 “sc delete 服务名” 删除mysql服务时系统报错:sc不是内部命令或外部命令 原因: 系统默认环境变量值发生变化; 解决&…

从零开始学习typescript系列6: typescript各种类型以及类型特殊使用

基础类型的分类 常用 boolean: 布尔值number: 支持2/8/10/16进制string: 字符串enum: 枚举类型&#xff0c;可根据value找到keyarray: 普通数组&#xff0c;有2种方式&#xff0c;string[]或者 Array<string>tuple: 特殊数组&#xff0c;指定数组里的每个元素的类型&am…

UE snap02 解析ASCII文本文件

UE snap02 解析ASCII文本文件 示例数据data.dat 11389477.2714892 3364559.73645693 0 11389471.5162524 3364567.8860295 0 11389471.5162524 3365813.09618369 0 11388329.6082659 3366184.85895869 0 11388320.4775297 3366197.78833087 0 11388270.6882384 3366214.84811…