SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用

SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本,同时JDK需要是17及以上的版本。具体的可以看官网的说明。
Spring Cloud Alibaba版本说明

环境搭建

这里搭建的是一个聚合项目。项目结构如下:

父项目的pom.xml文件如下:

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-demo</name>
    <description>spring-cloud-alibaba-demo</description>

    <packaging>pom</packaging>

	<!--指定依赖的版本 -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>3.0.2</spring-boot.version>
        <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
        <spring-cloud.version>2022.0.0</spring-cloud.version>
    </properties>

	
    <modules>
        <module>conuserservice01</module>
        <module>providerservice01</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.example.springcloudalibabademo.SpringCloudAlibabaDemoApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Nacos

Nacos简介和安装

Nacos是 Dynamic Naming and Configuration Service 的首字母简称,Naocs是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。
Nacos概述

Nacos下载其实下载的是Nacos Server,我们下载启动Nacos Server后,访问8848端口就可以看到Nacos Server的登录页面了。默认登录用户名和密码都是Nacos。
Nacos下载

使用Nacos进行服务注册和发现

要想使用Nacos进行服务注册和发现,需要在创建的conuserservice01模块的pom文件和providerservice01模块的pom文件中加入nacos服务发现的依赖。

conuserservice01模块的pom文件如下,providerservice01模块的pom文件也是类似的。

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>conuserservice01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>conuserservice01</name>
    <description>conuserservice01</description>

    <parent>
        <artifactId>spring-cloud-alibaba-demo</artifactId>
        <groupId>com.example</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <packaging>jar</packaging>

    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <!--nacos服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

</project>

创建application.yml文件,配置Nacos Server的地址

yml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #Nacos Server地址

  application:
    name: consumerservice01  #应用名称

server:
  port: 8890  #端口号

启动consumerservice01应用,然后在Nacos的服务管理菜单下的服务列表可以看到consumerservice01应用。

如果对Eureka熟悉的话,那么应该知道我们在进行服务发现时,需要在启动类上加上@EnableDiscoveyClient注解,但是这里不加也是可以的,具体原因如下:
添加链接描述

Nacos服务分级存储模型

一级是服务,例如consumerservice01;二级是集群;三级是实例。

java 复制代码
spring:
  cloud:
    nacos:
      discovery:
        cluster-name: SH  #集群名称

重新启动应用后,可以看到显示了集群的名称

Nacos环境隔离

Namespace

用于租户粒度的配置隔离。不同的命名空间下可以存在相同的 Group 或 Data ID 的配置c

复制代码
    使用场景:一般用Namespace来实现环境隔离,例如:测试环境和生产环境的隔离。
Group

分组(Group)是次于命名空间的一种隔离概念

复制代码
    使用场景:区分项目。(用于多个项目共用Nacos的情况)
  1. 在Nacos中,只有当两个服务在同一个namespace、同一个group下时,两个服务才能互相访问;
  2. 注册到Naocs中的服务默认是在public namespace的DEFAUlT_GROUP下的;

在yml文件中配置服务的namespace和group

java 复制代码
spring:
  cloud:
    nacos:
      discovery:
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084  #命名空间id
        group: testgroup1    #设置服务的分组

负载均衡

启用负载均衡

yml 复制代码
spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true #开启负载均衡

编辑服务实例的权重,权重越大,该实例被访问的概率就越高。

具体的实现,可以查看NacosLoadBalancer这个类。

Nacos配置中心

配置中心的出现是为了解决当服务实例较多时,如果想修改配置,则需要修改很多配置文件的问题,同时修改配置文件后服务实例还需要进行重启;上面说的问题总结一句其实就是微服务和配置文件的耦合问题。

当我们引入Nacos配置管理后,服务实例会从Nacos Server中读取配置文件,而这里面存在一个问题,只有连接Nacos后才能获取到配置文件,但是要连接Nacos需要知道Nacos Server的地址,而application.yml是在项目启动后加载的;

目前项目启动读取配置文件的流程如下图所示:

解决上面的问题,需要用到另一个配置文件,也就是bootstrap.yml文件,顾名思义就是引导/启动配置文件,在项目启动的时候就会加载这个文件,把nacos Server的地址放在这个配置文件中就可以解决上面的问题了。

使用bootstarp配置文件后的流程如下:

Spring Cloud Config配置中心也是同样的原理,也需要用到bootstrap配置文件。

如果想让Nacos管理配置,则需要在微服务的依赖中引入Nacos的配置管理客户端依赖。

java 复制代码
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--springboot无法识别bootstrap文件的问题-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.1</version>
        </dependency>

创建bootstrap.yml文件,设置Nacos Server的地址

yml 复制代码
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084 #配置文件命名空间要和服务实例的一致
        group: DEFAULT_GROUP  #配置文件的组要和服务实例的一致

  application:
    name: consumerservice #服务的名称
  profiles:
    active: dev   

在Nacos Server中创建配置文件

在代码中获取配置文件中值

配置文件热更新

1、在@Value注入的变量的所在类上添加注解

2、使用@ConfigurationProperties注解

多环境配置共享和多配置文件优先级



参考

  1. Nacos高版本服务发现失败以及无法使用NacosRule问题
  2. 无法连接(读取) nacos 配置中心及文件(能踩的坑都踩了)
  3. Nacos 概念
  4. Nacos负载均衡策略
相关推荐
递归尽头是星辰1 小时前
Spring Cloud Alibaba 核心理论体系:Nacos、Sentinel、Seata深度解析
spring cloud·nacos·sentinel·seata·微服务治理
June bug1 小时前
【实习笔记】Fiddler学习笔记
笔记·学习·fiddler
我怕是好1 小时前
学习STM32 ESP8266
stm32·嵌入式硬件·学习
lpfasd1231 小时前
springcloud docker 部署问题排查与解决方案
spring·spring cloud·docker
JeffDingAI1 小时前
【Datawhale学习笔记】动手学RNN及LSTM
笔记·rnn·学习
qqqahhh1 小时前
xml文件的动态化配置,导入
xml·spring·springboot
BullSmall1 小时前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
JeffDingAI2 小时前
【Datawhale学习笔记】预训练模型实战
笔记·学习
GISer_Jing2 小时前
AI Coding学习——dw|ali(持续更新)
人工智能·学习·prompt·aigc
振华说技能2 小时前
MasterCAM车铣复合都学哪些内容!
学习