1. 版本要求
spring boot:2.5.8
spring-cloud:2020.0.4
spring-cloud-alibaba:2.2.6.RELEASE
官网上都有对应的版本映射的,用到的时候,自己多去看看,版本不对,就很容易出现兼容性问题。
2. 前提条件
1)已安装nacos服务端
2)项目使用maven管理依赖
3)核心框架版本映射没有兼容性问题
4)已在nacos服务端配置了对应的namespace、group以及相关的配置文件。
3. 集成步骤
3.1 引入对应的jar包
下面只列举核心jar包的引入。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.8</version>
</parent>
<dependencyManagement>
<dependencies>
<!-- spring cloud相关微服务组件定义 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 阿里云相关微服务组件定义 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 这个jar要自己引入了,不然无法执行自动配置的操作 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 阿里巴巴的注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 阿里巴巴的配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
3.2 配置@EnableDiscoveryClient
在项目的启动类上配置注解@EnableDiscoveryClient
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDiscoveryClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
3.3 bootstrap.xml文件配置
1)在src/main/resources目录下创建bootstrap.xml文件。
2)bootstrap.xml配置如下:
server:
port: 80
servlet:
context-path: /example
spring:
application:
name: example
profiles:
active: dev
main:
banner-mode: LOG
cloud:
nacos:
discovery:
enabled: true
server-addr: http://nacos.xxxxxx.com
service: example
namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
metadata:
management.context-path: /example/actuator
config:
enabled: true
file-extension: yaml
server-addr: http://nacos.xxxxxx.com
namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
group: example
extConfig:
- data-id: example-config.yaml
group: example
refresh: true
- data-id: example-cache-config.yaml
group: example
refresh: true
具体配置项,nacos官网都有说明,具体的就不多说了。
3.4 本地运行文件:application-local.yml
当需要不连接nacos服务器,只使用本地运行文件来做开发测试时,可创建文件application-local.yml,把对应的项目所需要的配置放在这个文件里面,然后变更bootstrap.xml文件中的配置项:
- 配置对应本地配置文件后缀:spring.profiles.active=local
- 关闭自动注册
- 关闭配置文件托管
server:
port: 80
servlet:
context-path: /example
spring:
application:
name: example
profiles:
active: local #设置为对应本地配置文件的后缀
main:
banner-mode: LOG
cloud:
nacos:
discovery:
enabled: false #关闭自动注册
server-addr: http://nacos.xxxxxx.com
service: example
namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
metadata:
management.context-path: /example/actuator
config:
enabled: false #关闭配置文件托管
file-extension: yaml
server-addr: http://nacos.xxxxxx.com
namespace: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
group: example
extConfig:
- data-id: example-config.yaml
group: example
refresh: true
- data-id: example-cache-config.yaml
group: example
refresh: true
切记,如果日志配置文件中存在对应的配置时,需要加上对local的兼容哦,否则,日志就打不出来了。
3.5 启动spring boot项目
执行启动类,启动spring web容器。
4. 其他说明
1)因为不同的环境可能对应的namespace配置是不一样的,但是我们只有一个配置文件bootstrap.xml,那如何来针对环境映射不同的namespace呢,我这边设计的是基于maven的profile功能来做的,下面用代码举例。
pom文件配置:
<profiles>
<profile>
<id>dev</id>
<properties>
<spring.cloud.nacos.server-addr>http://nacos.xxxxxx.com</spring.cloud.nacos.server-addr>
<spring.cloud.nacos.namespace>6fd06d5f-8551-4ddf-a4dd-ae4deecc0260</spring.cloud.nacos.namespace>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<spring.cloud.nacos.server-addr>http://nacos.xxxxxx.com</spring.cloud.nacos.server-addr>
<spring.cloud.nacos.namespace>d72bc9ac-1487-4c82-b770-736618356c85</spring.cloud.nacos.namespace>
</properties>
</profile>
</profiles>
<build>
<!-- 一定要配置哦,否则针对maven的profile配置会不起作用的 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
bootstrap.xml文件配置:
server:
port: 80
servlet:
context-path: /example
spring:
application:
name: example
profiles:
active: dev
main:
banner-mode: LOG
cloud:
nacos:
discovery:
enabled: true
server-addr: '@spring.cloud.nacos.server-addr@' #来自maven的配置
service: example
namespace: '@spring.cloud.nacos.namespace@' #来自maven的配置
metadata:
management.context-path: /example/actuator
config:
enabled: true
file-extension: yaml
server-addr: '@spring.cloud.nacos.server-addr@' #来自maven的配置
namespace: '@spring.cloud.nacos.namespace@' #来自maven的配置
group: example
extConfig:
- data-id: example-config.yaml
group: example
refresh: true
- data-id: example-cache-config.yaml
group: example
refresh: true
执行打包操作:
mvn clean package -P test
打包完成之后,可以查看target目录下对应的配置文件关于@spring.cloud.nacos.server-addr@、@spring.cloud.nacos.namespace@的配置已经被替换成了我们在pom.xml中配置的值了。我们通过<profile>中配置的<id>:dev、test,就达到了可以针对一个配置文件动态切换环境的目的了。