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

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.mrgr.cn/news/94833.html

相关文章:

  • 数据结构篇——二叉树的存储与遍历
  • GaussDB备份数据常用命令
  • SSM框架——Spring面试题
  • 汇编基础知识
  • [HelloCTF]PHPinclude-labs超详细WP-Level 0
  • 解决git init 命令不显示.git
  • C++基础 [五] - String的模拟实现
  • Mock接口编写教程-axios-mock-adapter(React)
  • StarRocks + Paimon 在阿里集团 Lakehouse 的探索与实践
  • Python中的time模块
  • 操作系统相关知识
  • Docker下载,包含Win、Mac
  • C# WPF编程-启动新窗口
  • 超参数优化算法:scikit-opt库、Scikit-Optimize库
  • [设计模式与源码]1_Spring三级缓存中的单例模式
  • Unity教程(二十二)技能系统 分身技能
  • docker-compose install nginx(解决fastgpt跨区域)
  • LCR 159. 库存管理 III
  • DeepSeek-R1学习
  • Cursor与Coze结合开发电影推荐系统:一次高效的技术实践