【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.要是成功安装的话,你在去改一下这里。 设置完到这里理…

GOF23种设计模式

GOF(Gang of Four)设计模式是指《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)这本书中介绍的23种经典设计模式。这些设计模式被分为三大类:创建…

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

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

笔记:Mysql 主从搭建

主库 创建用户并授权 create user slave identified with mysql_native_password by 123456 GRANT REPLICATION SLAVE ON *.* to slave%; FLUSH PRIVILEGES;主库配置文件 /etc/my.cnf #日志路径及文件名,目录要是mysql有权限写入 log-bin/var/lib/mysql/binlog …

什么是索引及其优缺点

1.1 什么是索引 索引是数据库中用于提高检索性能的排好序的数据结构。它类似于书籍的目录,通过建立特定的数据结构将某个列或多个列的值与它们在数据库中的行关联起来,以加快查询速度。 1.2 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引…

IT廉连看——职场经验——简历里:兴趣爱好怎么写?

你可能觉得,这有啥可讲的嘛?别小看它。一个经验丰富的面试官,能从这个环节一窥你的真实个性和能力。 遗憾的是,大部分人都是随便填的,比如万年不变的读书、看电影之类,这其实浪费了一次强化能力优势的机会…

流畅的 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)&#…

【oss】阿里云oss服务器模拟

文章目录 1 测试服务器搭建2 go sdk demo编写2.1 本地文件上传至oss2.2 oss文件下载至本地 3 Reference 1 测试服务器搭建 ruby环境 sudo apt-get update sudo apt-get install ruby ruby --version依赖 sudo gem install thor builder拉取项目 https://github.com/aliyun/o…

未来已来?国内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…

C语言打印当前时间

#include <time.h> void print_current_time(char* func_name) { // 获取当前的时间 time_t current_time; time(&current_time); // 将时间转换为本地时间格式 struct tm *local_time localtime(&current_time); // 打印当前的时间 …

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

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

Linux:ssh多台设备快速访问

目录 一、背景二、技巧1&#xff09;技巧一&#xff1a;“跳过”中间堡垒机2&#xff09;技巧二&#xff1a;反向访问3&#xff09;技巧三&#xff1a;端口转发4&#xff09;技巧四&#xff1a;命令后台运行 一、背景 由于网络或安全的原因&#xff0c;需要通过跳转机&#xf…

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内存分布 首先看一段代码&#xff1a; int globalV…

分布式训练遇到问题:NCCL通信相关问题

常见问题: torchrun前面加NCCL_DEBUG=INFO可以查看相关nccl相关错误日志 NCCL_DEBUG=INFO torchrun --nnodes=2 --nproc_per_node=1 --node_rank=0 --master_addr="10.***0.

用Python的turtle库绘制皮卡丘

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

进阶二叉树

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