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负载均衡策略
相关推荐
百里香酚兰19 分钟前
【AI学习笔记】基于Unity+DeepSeek开发的一些BUG记录&解决方案
人工智能·学习·unity·大模型·deepseek
布丁不叮早起枣祈34 分钟前
10.3学习
学习
结衣结衣.1 小时前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
LN-ZMOI1 小时前
c++学习笔记1
c++·笔记·学习
五味香1 小时前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
无理 Java1 小时前
【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)
java·后端·spring·面试·mvc·框架·springmvc
gobeyye2 小时前
spring loC&DI 详解
java·spring·rpc
云端奇趣2 小时前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
我感觉。2 小时前
【信号与系统第五章】13、希尔伯特变换
学习·dsp开发
杨荧2 小时前
【JAVA开源】基于Vue和SpringBoot的水果购物网站
java·开发语言·vue.js·spring boot·spring cloud·开源