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 分钟前
Nginx 优化与防盗链配置指南
java·后端·spring
知识分享小能手4 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao6 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾7 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT7 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa7 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落8 小时前
Python学习之装饰器
开发语言·python·学习
cyforkk8 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc
Z_z在努力9 小时前
【杂类】Spring 自动装配原理
java·spring·mybatis
speop9 小时前
llm的一点学习笔记
笔记·学习