SpringCloud Alibaba 2022使用
SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本,同时JDK需要是17及以上的版本。具体的可以看官网的说明。
Spring Cloud Alibaba版本说明
环境搭建
这里搭建的是一个聚合项目。项目结构如下:
父项目的pom.xml文件如下:
<?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>
</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>
</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文件也是类似的。
<?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的地址
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;二级是集群;三级是实例。
spring:
cloud:
nacos:
discovery:
cluster-name: SH #集群名称
重新启动应用后,可以看到显示了集群的名称
Nacos环境隔离
Namespace
用于租户粒度的配置隔离。不同的命名空间下可以存在相同的 Group 或 Data ID 的配置c
使用场景:一般用Namespace来实现环境隔离,例如:测试环境和生产环境的隔离。
Group
分组(Group)是次于命名空间的一种隔离概念
使用场景:区分项目。(用于多个项目共用Nacos的情况)
- 在Nacos中,只有当两个服务在同一个namespace、同一个group下时,两个服务才能互相访问;
- 注册到Naocs中的服务默认是在public namespace的DEFAUlT_GROUP下的;
在yml文件中配置服务的namespace和group
spring:
cloud:
nacos:
discovery:
namespace: 8ff552f0-0212-43b2-8ea0-e4c2aa359084 #命名空间id
group: testgroup1 #设置服务的分组
Nacos配置中心
配置中心的出现是为了解决当服务实例较多时,如果想修改配置,则需要修改很多配置文件的问题,同时修改配置文件后服务实例还需要进行重启;上面说的问题总结一句其实就是微服务和配置文件的耦合问题。
当我们引入Nacos配置管理后,服务实例会从Nacos Server中读取配置文件,而这里面存在一个问题,只有连接Nacos后才能获取到配置文件,但是要连接Nacos需要知道Nacos Server的地址,而application.yml是在项目启动后加载的;
目前项目启动读取配置文件的流程如下图所示:
解决上面的问题,需要用到另一个配置文件,也就是bootstrap.yml文件,顾名思义就是引导/启动配置文件,在项目启动的时候就会加载这个文件,把nacos Server的地址放在这个配置文件中就可以解决上面的问题了。
使用bootstarp配置文件后的流程如下:
Spring Cloud Config配置中心也是同样的原理,也需要用到bootstrap配置文件。
如果想让Nacos管理配置,则需要在微服务的依赖中引入Nacos的配置管理客户端依赖。
<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的地址
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注解
多环境配置共享和多配置文件优先级
参考
- Nacos高版本服务发现失败以及无法使用NacosRule问题
- 无法连接(读取) nacos 配置中心及文件(能踩的坑都踩了)
- Nacos 概念