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

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-service
  cloud:
    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
    @LoadBalanced
    public 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:
        # 设置服务管理的命名空间,后面跟命名空间的 ID
        namespace: 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-service
  cloud:
    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.kler.cn/a/591314.html

相关文章:

  • 实验9-2 高级搜索技术2
  • browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案
  • 苹果宣布iOS 19将支持RCS 3.0,短信功能迎来大升级
  • 微信小程序:修改提示信息placeholder颜色
  • 【亲测有效,已顺利上线】你好,你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目。(多种没有资质的解决方案)
  • 自动驾驶背后的数学:特征提取中的线性变换与非线性激活
  • vue3 函数式弹窗
  • NGINX 执行阶段与OpenResty的 *_by_lua指令
  • DevOps工具链
  • VulnHub-Joker通关攻略
  • 微信小程序实现根据不同的用户角色显示不同的tabbar并且可以完整的切换tabbar
  • 【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现生物识别(指纹识别)应用
  • Arch Linux高性能数据处理优化指南
  • C++ 学习笔记(三)—— 入门+类和对象
  • 【PDF识别】总结PDF文本内容与表格提取的方法
  • 招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)
  • 如何才能避免漏测事故的发生?
  • 《港口危货储存单位主要安全管理人员》考试资料及答案解析
  • C# WPF编程-RepeatButton
  • opencv + opengl显示摄像头视频流