Fork me on GitHub

springboot整合nacos的入门Demo

Nacos介绍

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。


官方文档

https://nacos.io/zh-cn/docs/what-is-nacos.html


Nacos安装部署

环境依赖:

  • JDK1.8+

下载地址
官网地址:
https://github.com/alibaba/nacos/releases
百度网盘地址:
链接:https://pan.baidu.com/s/1fTmvE9M0C_Ep_EJxQR4FPg
提取码:iscm

Nacos的安装部署非常简单,如果只是作为测试学习,那么只需要将下载下来的Nacos进行解压,然后到bin目录,根据当前系统运行对应的startup.cmd即可。


注:如果nacos的版本在2.2.0+以上的版本时,必须执行此变更,否则无法启动。
修改conf目录下的application.properties文件。
设置其中的nacos.core.auth.plugin.nacos.token.secret.key值,详情可查看鉴权-自定义密钥.




Nacos支持三种部署模式

  • 单机模式 - 用于测试和单机试用。

  • 集群模式 - 用于生产环境,确保高可用。

  • 多集群模式 - 用于多数据中心场景。


将下载下来的nacos包进行解压,如果是window系统,打开bin文件夹,双击运行startup.cmd即可,linux也是一样,执行 sh startup.sh 命令。

默认运行的是集群模式,如果不想使用集群,只想用单机模式,那么需要再运行的时候添加如下命令.

window:

startup.cmd -m standalone

linux:

startup.sh -m standalone

如果不想每次运行添加上述命令,那么可以修改startup.cmd或sh startup.sh脚本,修改为set MODE="standalone",示例图如下:

在这里插入图片描述

配置完毕之后,执行启动脚本,启动Nacos,默认地址为http://localhost:8848/nacos,账号和密码为nacos/nacos,如果不想用这个,可以在登录之后的权限控制->用户列表菜单中进行修改。

示例图如下:

在这里插入图片描述

Springboot整合Nacos示例

环境依赖

  • JDK1.8+
  • Springboot2.x
  • nacos2.x

官方的版本对应建议配置:

版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

但是为了防止版本问题,强烈建议Springboot的版本和nacos的版本完全一致。

maven仓库配置如下;


<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.1.RELEASE</version>
		<relativePath/>
	</parent>

	<dependencies>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- Spring Boot Test 依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
			<version>2.2.1.RELEASE</version>
		</dependency>


		<!--日志 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j}</version>
		</dependency>


		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback}</version>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>${logback}</version>
		</dependency>



	</dependencies>


注:如果Springboot是2.4以上的版本,maven仓库需要额外增加如下依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
      </dependency>

一个简单的示例


首先创建一个配置文件,配置文件用bootstrap.properties,配置信息如下:


spring.banner.charset=UTF-8
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
server.port=8299
spring.application.name=springboot-nacos
spring.profiles.active=dev


# nacos配置
## Nacos服务自动注册
nacos.discovery.autoRegister=true
## Nacos服务注册中心地址
spring.cloud.nacos.discovery.server-addr= http://127.0.0.1:8848
## Nacos服务配置中心地址
spring.cloud.nacos.config.server-addr= http://127.0.0.1:8848






然后再来创建一个基本的启动类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @Author pancm
 * @Description springboot集成nacos配置中心
 * @Date  2024/1/26
 * @Param
 * @return
 **/
@SpringBootApplication
@EnableDiscoveryClient
public class App 
{
	private static final Logger logger = LoggerFactory.getLogger(App.class);
    public static void main( String[] args )
    {
    	// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
		SpringApplication.run(App.class, args);
		logger.info("程序启动成功!");
    }
}

这里我们还需要对配置是否生效进行测试,这里就创建一个Controller,然后调用接口的时候返回配置信息。@RefreshScope注解是可以进行动态刷新。


import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
 * @Author pancm
 * @Description 官方示例文档
 * @Date  2024/1/26
 * @Param
 * @return
 **/
@RestController
@RequestMapping("config")
@RefreshScope
public class ConfigController {

  

    @Value("${pcm.name:pcm-1001}")
    private String name;

    @RequestMapping(value = "/getName", method = GET)
    public String getName() {
        return name;
    }

}

:这里为了防止启动失败,添加配置的时候设置一个默认值。


然后运行App,启动成功,日志信息如下:

在这里插入图片描述

首先我们调用接口来查看当前的配置信息,输入http://localhost:8299/config/getName,返回示例图如下,可以看到是可以获取默认的配置。
在这里插入图片描述

然后我们在Nacos的页面上面添加一个pcm.name的配置,并且更改配置的值,这里我们更改为pcm-2001,然后点击发布。
在这里插入图片描述

这里需要注意一下DataId的名称命名规则,默认的情况下dataId=prefix.file-extension,其中profix默认为${spring.application.name}file-extension默认为properties。
如果指定了spring.profile.active,那么就会变成dataId=prefix-spring.profile.active.file-extension
比如上述的项目名称为springboot-nacos,配置文件的后缀是properties,那么DataId就是springboot-nacos.properties,指定了spring.profile.active=dev,那么DataId就是springboot-nacos-dev.properties
但是我指定了spring.profile.active=dev,为什么DataId是springboot-nacos.properties
也可以呢?因为这里还涉及到一个优先级的问题。

DataId有三个配置规则


  1. dataId =prefix
  2. dataId =prefix.file-extension
  3. dataId =prefix-spring.profile.active.file-extension

他们的优先级是按照匹配的精准度来进行了,也就是如果配置多个dataId的话,那么他会匹配最相近的,也就是匹配优先级是3>2>1,这里我们也可以通过启动中的日志进行查看。

在这里插入图片描述

发布成功之后我们可以看到日志也进行了刷新。
在这里插入图片描述

然后我们再进行访问http://localhost:8299/config/getName。通过下面的示例图我们可以看到配置已经刷新为我们设置的最新配置了。

在这里插入图片描述

Nacos配置管理


上述示例中,我们已经完成了一个简单的获取Nacos中的配置示例,并且可以实现配置刷新。但是如果我们有多个服务使用的话,那么我们需要对配置进行区分,不建议都是用默认的public空间,因此我们还需要创建新的命名空间,如果还有分组要求(一般就是环境区分,dev、test、prod),那么我们还可以再进行创建配置时指定好group。

在nacos的命名空间菜单中,我们创建一个新的命名空间,其中命名空间ID这个保证唯一就行,默认可以不填写。

在这里插入图片描述

创建成功之后,我们在来创建一个新的配置并且指定分组为dev,方便我们管理。此时里面的配置内容为pcm.name =pcm-dev

在这里插入图片描述

创建完成之后,我们在Springboot的项目配置文件中新增如下配置:

## nacos命名空间id
spring.cloud.nacos.config.namespace= pcm-namespace--id
## 对应的分组名称
spring.cloud.nacos.config.group= dev
## 配置文件后缀名,也可以不配置,默认为properties
spring.cloud.nacos.config.fileExtension= properties

重新启动项目,查看日子,我们可以看到已经配置成功了。


在这里插入图片描述

然后我们在重新启动项目,http://localhost:8299/config/getName。通过下面的示例图我们可以看到配置已经是设置的命名空间配置了。

在这里插入图片描述

多配置文件


在使用Nacos中,有时配置太多,不想放在一个配置文件中,此时就可以使用多个配置文件来进行区分管理。


在bootstrap.properties配置文件中新增如下配置,如果后续还有新的配置,参考下列配置,递增extension-configs[0]的数值即可,比如在新增一个配置文件,那么就是extension-configs[1] = xxx.properties 这样配置就可以了。

# 新增额外配置
##额外的第一个配置文件的dataId
spring.cloud.nacos.config.extension-configs[0].data-id=pcm-dev.properties
##额外的第一个配置文件的分组
spring.cloud.nacos.config.extension-configs[0].group=dev

在nacos中新增改配置文件,然后这里添加一个新的配置pcm.age=28.

在这里插入图片描述

然后再ConfigController代码中新增如下接口,添加完成之后重启项目。

    @Value("${pcm.age:18}")
    private String age;


    @RequestMapping(value = "/getAge", method = GET)
    public String getAge() {
        return age;
    }

访问http://localhost:8299/config/getAge。通过下面的示例图我们可以看到配置已经生生效了。

在这里插入图片描述

其他

关于SpringBoot整合nacos的demo简单讲解的文章就讲解到这里了,如有不妥,欢迎指正!

项目地址

SpringBoot 的nacos的项目工程地址:
https://github.com/xuwujing/springBoot-study/tree/master/springboot-nacos

SpringBoot整个集合的地址:
https://github.com/xuwujing/springBoot-study

SpringBoot整合系列的文章

音乐推荐

翩若惊鸿,婉若游龙,荣曜秋菊,华茂春松。仿佛兮若轻云之蔽月,飘飘兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。--网易云网友评论

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!
版权声明:
作者:虚无境
博客园出处:http://www.cnblogs.com/xuwujing
CSDN出处:http://blog.csdn.net/qazwsxpcm    
个人博客出处:http://www.panchengming.com

posted @ 2024-01-28 23:32  虚无境  阅读(2103)  评论(0编辑  收藏  举报