SpringCloud 学习笔记2(Nacos)

Nacos

Nacos 下载

Nacos Server 下载 | Nacos 官网

下载、解压、打开文件:

image-20250315133920393

更改 Nacos 的启动方式

Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。

image-20250315134418420

cluster 改为 standalone,记得保存!

image-20250315134709848

启动startup.cmd

Ubuntu 启动命令:bash startup.sh -m standalone

image-20250315134850970

启动成功后进入 http://127.0.0.1:8848/nacos/

image-20250315135032630

Nacos 使用

引入依赖

在父项目引入:

<properties><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope>
</dependency>

<scope>import</scope> 表示这个依赖直接注入到父项目中。

子项目中引入:

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>

修改配置

子项目的 yml 文件:

spring:application:name: order-servicecloud:nacos:discovery:# Nacos 的服务器地址server-addr: 101.201.246.67:8848

更改代码

更改之前在项目中写死的 url。

        // 更改之前写死的 url// String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();String url = "http://product-service/product/" + orderInfo.getProductId();

加上 @LoadBalanced 注解

@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

启动服务,打开 Nacos 页面。

image-20250315164856289

服务下线

选择要进行管理的服务,点击详情

image-20250315165026714

选择要进行下线的服务器,点击下线。

image-20250315165107671

image-20250315165234047

权重配置

选择要进行管理的服务,点击详情

image-20250315165026714

选择要进行管理的服务器,点击编辑。

image-20250315165458357

进行权重设置。

image-20250315165517499

如果权重没有生效,可以查看:如何解决MSE Nacos上修改服务实例的权重不生效问题_微服务引擎(MSE)-阿里云帮助中心

因为我在项目中使用了 Loadbalance 所以设置的权重并没有生效。

要想让权重生效,需要在消费者应用的配置文件中添加:

# 开启 Nacos 的负载均衡策略
spring:cloud:loadbalancer:nacos:enabled: true

需要注意的是,服务配置权重是非严格的。

什么叫非严格呢?

举个例子:服务 A 占权重的 50%,服务 B 占权重的 50%,如果来了两个请求,不一定是 A 处理一个请求,B处理一个请求。 如果来了 2 千万次的请求,A、B 处理的请求数接近 1 千万,而不是严格的等于 1 千万。

同集群优先访问

修改配置文件:

spring:cloud:nacos:discovery:# 修改集群名称cluster-name:  BJ

效果:

image-20250315194509042

修改同一个服务,不同端口号的配置:

复制配置(右键你要修改的配置,按下图顺序点击)

image-20250315195018691

选择要修改的服务,点击 Edit

image-20250315194845501

修改配置,如果要修改多个配置,中间使用空格分隔。

image-20250315195211978

生产者服务有3个,分别是 9090、9091 和 9092,9090 在集群 BJ 中,而9091 和 9092 在 集群 SH 中 。

image-20250315195545063

消费者服务有一个,它在集群 BJ 中。

image-20250315200012526

此时,多次调用消费者服务,发现消费者服务会优先访问同集群下的生产者服务,也就是 9090。

image-20250315200146101

image-20250315200159855

image-20250315200231957

这就是同集群优先访问。

如果同集群下的生产者服务都挂掉了,那么本集群下的消费者服务就会转而访问不同集群下的生产者服务。

比如说,上述的 9090 挂掉了,那么 8080 就会开始访问 9091 和 9092 。

Nacos 健康检查

Nacos 提供了两种健康检查机制。

  1. 客户端主动上报机制。
    • 客户端通过心跳上报方式告知服务器健康状态,默认的心跳间隔为 5 秒。
    • Nacos 会在超过 15 秒未收到心跳后将实例设置为不健康状态,超过 30 秒就会将实例删除。
  2. 服务器端反向探测机制。
    • Nacos 主动探知客户端健康状态,默认间隔为 20 秒。
    • 健康检查失败后实例会标记为不健康,不会被立即删除。

image-20250315202436455

Nacos 服务实例类型介绍

Nacos 的服务实例类型分为临时实例和非临时实例。

  • 临时实例(默认类型):实例处于不健康状态超过一定时长,会被从服务列表删除。临时实例采用的是客户端主动上报机制。
  • 非临时实例(也叫做永久实例):实例哪怕一直处于不健康状态,也不会被删除。非临时实例采用的是服务器反向探测机制。
image-20250315204522661

非临时实例设置方法:

在配置文件中添加

spring:cloud:nacos:discovery:# false 表示修改为非临时实例ephemeral: false 

由于 Nacos 会记录每一个实例的 IP,端口号以及实例类型,Nacos 不允许将临时实例修改为非临时实例,非临时实例也不能修改为临时实例。如果想修改,则需要停止 Nacos 并删除 Nacos 中的 raft 文件夹。

raft 文件夹在 nacos/data/protocol/目录下。

删除后重启 Nacos,即可修改成功。

环境隔离

创建命名空间

image-20250315211304607

起名字

image-20250315211328555

将实例放在指定环境

查看命名空间 ID

image-20250315211753949

修改 yml 配置

spring:cloud:nacos:discovery:# 设置服务管理的命名空间,后面跟命名空间的 IDnamespace: 031fd6a5-8ead-4999-bdeb-4733fb730182

不在同一命名空间下的服务不能互相访问,这就是 Nacos 的环境隔离。

Nacos 配置中心

配置中心的流程
image-20250315212731526
  1. 服务启动时,从配置中心读取配置内容,进行初始化。
  2. 配置修改时,通知微服务,实现配置的更新功能。
Nacos 配置中心使用

添加配置

image-20250315213502329

image-20250315213707268

image-20250315220545561

Data ID 介绍

image-20250317164736119

当三个配置同时存在,且各不相同时,它们的优先级为:

1. ${prefix}-${spring.profiles.active}.${file-extension}
2. ${prefix}.${file-extension}
3. ${prefix}

例如有如下三个配置:

image-20250317170024692

它们的优先级为:

image-20250317170441984

在生产者服务中引入依赖

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- SpringCloud 2020.*之后版本需要引⼊bootstrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

修改配置文件

在生产者服务中创建 bootstrap.yml 或者 bootstrap.properties 文件。

在 bootstrap.yml 或者 bootstrap.properties 中添加以下配置。

spring:application:name: product-servicecloud:nacos:config:# Nacos 的服务器地址(从哪里获取配置信息)server-addr: 101.201.246.67:8848

从 nacos 读取配置文件

// @RefreshScope 这个注解的作用是当 nacos 中的配置发生更改,服务实例也同步更改配置。也就是配置热更新。
@RefreshScope
@RestController
public class NacosController {@Value("${nacos.config}")private String nacosConfig;@RequestMapping("getConfig")public String getConfig() {return "从 Nacos 中获取配置项 nacos.config:" + nacosConfig;}
}

image-20250315220720394

Nacos 配置管理的命名空间和服务器列表的命名空间是分别设置的,默认是public。

Nacos 命名空间配置依然在 bootstrap.properties 中进行设置。

程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。

设置命名空间:

  1. 复制命名空间 ID

    image-20250317163501928

  2. 修改 bootstrap.properties 或 bootstrap.yml 文件

    spring:cloud:nacos:config:namespace: 031fd6a5-8ead-4999-bdeb-4733fb730182   #配置中心的命名空间 ID
    

重启服务、访问接口,可以看到修改成功了!

image-20250317163710587

部署到服务器

参考 博客系统笔记总结 2( Linux 相关) 中的部署 Web 项目到 Linux

有一点不同的是,由于程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。

为了方便管理,我们可以把 application.yml 删除,此时目录结构就变成了这样:

image-20250317172133727

然后在 bootstrap 中添加:

spring:profiles:active: @profile.name@

但是因为 bootstrap 并不能识别 @ 符号,所以我们还需要在 pom 中添加:

    <build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/**</include></includes></resource></resources></build>

Eureka 和 Nacos 的区别

共同点:都支持服务注册和服务发现。

区别:

  1. Nacos 除了服务注册和服务发现外,还提供了配置中心、流量管理和 DNS 服务等功能。

  2. CAP 理论

    Eureka 遵循 AP 原则,Nacos 可以切换 AP 模式和 CP 模式,默认为 AP模式。

    Nacos 根据配置识别 AP 和 CP 模式,如果注册 Nacos 的 Client 的节点是临时节点,那么 Nacos 对这个 Client 节点的效果就是 AP,反之是 CP。AP 和 CP 可以同时混合存在。

  3. 服务发现

    Eureka:基于拉模式。Eureka Client 会定期从 Server 拉取服务信息,有缓存,默认每 30s 拉取一次。

    Nacos:基于推送模式。服务列表有变化时实时推送给订阅者,服务端和客户端保持心跳连接。


本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

在windows10系统上安装docker,然后在容器中运行GPU版本的Pytorch,并使用vscode连接该容器

一 . 安装Docker Desktop 首先打开网址https://docs.docker.com/desktop/install/windows-install/ 下载完后&#xff0c;双击下面的exe文件进行安装&#xff0c;默认情况下&#xff0c;Docker Desktop 安装在C:\Program Files\Docker\Docker 出现提示时&#xff0c;请确保…

AI入门7:python三种API方式调用本地Ollama+DeepSeek

回顾 书接上篇&#xff1a;各种方式搭建了本地知识库&#xff1a; AI入门&#xff1a;AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2&#xff1a;本地AI部署&#xff0c;用ollama部署deepseek&#xff08;私有化部署&#xff09;-CSDN博客 AI入门3&#xff1a;给本地d…

Unity导出WebGL

在Build Settings页面中平台&#xff08;Platform&#xff09;切换到WebGL平台 如何没有安装WebGL扩展插件&#xff0c;点击下载&#xff08;Open Download Page&#xff09; 下载扩展安装文件WebGL-Support-for-Editor-2023.1.0f1c1.exe 下载地址&#xff1a; http://downlo…

深入理解静态与动态代理设计模式:从理论到实践

静态代理设计模式 1.为什么需要代理设计模式&#xff1f; javaEE分层开发中&#xff0c;哪个层次对于我们来讲最重要 DAO---->Service---->Controller JavaEE分层中&#xff0c;最为重要的是Service层 Service层包含了那些代码 Service层核心功能(几十行 上百代码) 额外…

4.JVM-垃圾回收介绍

记录个人学习中记录笔记&#xff0c;如有错误请您指正&#xff0c;谢谢&#x1f64f; 垃圾回收器发展史 传统垃圾回收: 分代回收 不同代有不同的垃圾回收机制 保底 标记清除算法 垃圾识别算法 引用计数法 缺陷:下图2 出现循环引用 无法解决 可达性分析 大部分(Java,pytho…

解决qt中自定插件加载失败,不显示问题。

这个问题断断续续搞了一天多&#xff0c;主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器&#xff08;64 位&#xff09; 编译的。…

MySQL的行级锁锁的到底是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Mysql自增主键会遇到什么问题?】面试题。希望对大家有帮助&#xff1b; MySQL的行级锁锁的到底是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL的行级锁&#xff08;Row-level Locking&#xff09;是一种…

gitlab将本地项目提交到远程dev分支

获取Git路径 首先从远程获取到git路径&#xff0c;将给的git地址进行克隆到本地文件&#xff1b; git clone http:************.git 按照git地址的文件路径将本地项目&#xff0c;拷贝到目标文件中 在该路径中&#xff0c;初始化命令&#xff1b; # 初始化项目 git init #…

深度学习-服务器训练SparseDrive过程记录

1、cuda安装 1.1 卸载安装失败的cuda 参考&#xff1a;https://blog.csdn.net/weixin_40826634/article/details/127493809 注意&#xff1a;因为/usr/local/cuda-xx.x/bin/下没有卸载脚本&#xff0c;很可能是apt安装的&#xff0c;所以通过执行下面的命令删除&#xff1a; a…

log4j2漏洞:反弹shell

在dns.log生成一个网址 将得到的网址上传上去 http://39.105.61.160:8983/solr/admin/cores?action${jndi:ldap://${sys:java.version}.6tioul.dnslog.cn} 得到回显&#xff0c;表示操作已执行&#xff0c;证明漏洞存在 在云服务器上构建恶意的类 将要执行的恶意操作的代码进…

数据结构——查找

查找 1. 查找的基本概念 查找(Searching)&#xff1a;就是根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素( 或记录)。查找结果分为两种&#xff0c;一种是查找成果&#xff0c;一种是查找失败。 查找表(Search Table)&#xff1a;是由同一类型…

【css酷炫效果】纯CSS实现进度条加载动画

【css酷炫效果】纯CSS实现进度条加载动画 缘创作背景html结构css样式完整代码基础版进阶版 效果图 通过CSS渐变与背景位移动画&#xff0c;无需JavaScript即可创建流体动态进度条。 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u…

【SpringBatch】01简单入门

目录标题 一、学习目标学习目标前置知识 二、Spring Batch简介2.1 何为批处理&#xff1f;2.2 Spring Batch了解2.3 Spring Batch 优势2.4 Spring Batch 架构 三、入门案例3.1 批量处理流程3.2 入门案例-H2版(内存)3.3 入门案例-MySQL版 四、入门案例解析 一、学习目标 学习目…

Git 实战指南:本地客户端连接 Gitee 全流程

本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …

stable Diffusion 中的 VAE是什么

在Stable Diffusion中&#xff0c;VAE&#xff08;Variational Autoencoder&#xff0c;变分自编码器&#xff09;是一个关键组件&#xff0c;用于生成高质量的图像。它通过将输入图像编码到潜在空间&#xff08;latent space&#xff09;&#xff0c;并在该空间中进行操作&…

Python自动点击器开发教程 - 支持键盘连按和鼠标连点

Python自动点击器开发教程 - 支持键盘连按和鼠标连点 这里写目录标题 Python自动点击器开发教程 - 支持键盘连按和鼠标连点项目介绍开发环境安装依赖核心代码解析1. 键盘模拟实现2. 鼠标点击实现 开发要点使用说明注意事项优化建议打包发布项目源码开发心得参考资料成品工具 项…

搞定python之八----操作mysql

本文是《搞定python》系列文章的第八篇&#xff0c;讲述利用python操作mysql数据库。相对来说&#xff0c;本文的综合性比较强&#xff0c;包含了操作数据库、异常处理、元组等内容&#xff0c;需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…

【区块链】区块链密码学基础

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链密码学基础引言一、哈希函数1.1 基本概念1.2 数学表达 二、非对称加密2.1…

adb常用的命令

1. 查看adb版本 adb version 2. 将apk安装包安装到手机/模拟器上 adb install apk路径 3. 获取apk包名和界面名 包名&#xff08;package&#xff09;&#xff1a;决定程序的唯一性 界面名&#xff08;activity&#xff09;&#xff1a;一个界面界面名&#xff0c;对应一个界面…

《C++ Primer》学习笔记(四)

第四部分&#xff1a;高级主题 1.tuple 是类似pair的模板。每个pair 的成员类型都不相同&#xff0c;但每个 pair 都恰好有两个成员。每个确定的tuple 类型的成员数目是固定的&#xff0c;但一个 tuple 可以有任意数量的成员。tuple支持的操作如下图&#xff1a; 只有两个 tup…