文章
问答
冒泡
Spring Boot项目集成Nacos的注册中心和配置中心

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,就达到了可以针对一个配置文件动态切换环境的目的了。

spring boot
nacos

关于作者

justin
一介码农
获得点赞
文章被阅读