前言
本文适合刚接触nacos想上手实践的读者。
Nacos下载安装步骤
本次下载的版本为2.0.1
下载Nacos
方式一:进入官网下载压缩包
官网地址
方式二:使用wget命令下载
两种方式:第一种下载速度较慢
代码语言:javascript复制wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
或(建议使用第二个)
代码语言:javascript复制wget https://download.fastgit.org/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
配置MySQL
在解压的路径下找到conf文件夹,里面有一个叫nacos-mysql.sql 的文件,把它下载下来。
新建MySQL数据库
起个名字叫nacos(PS:如果喜欢别的名字,可以改成别的,记得相关的配置的都有跟着改动)
修改数据库配置
进入到conf目录修改application.properties
代码语言:shell复制vim application.properties
编辑端口号(写一个你喜欢的数字)
代码语言:javascript复制### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=9001
解开数据库的注释
代码语言:javascript复制### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
编辑数据库连接的地址,用于连接mysql数据库。
账号和密码为MySQL数据库密码。
!!!注意此处的mysql.xxx.xxx:3306/nacos,nacos为此前创建的数据库名。
代码语言:javascript复制### Connect URL of DB:
db.url.0=jdbc:mysql://mysql.xxx.xxx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
启动nacos
进入nacos下的bin目录,会有一些启动脚本。
单机模式
代码语言:javascript复制sh startup.sh -m standalone
集群模式
代码语言:javascript复制sh startup.sh
也可以修改配置文件,把下图中的cluster
修改为standalone
,这样使用startup.sh
直接启动单机模式了。
访问Nacos
例如:http://127.0.0.0:9001/nacos/index.html
默认的用户名和密码都是nacos
SpringCloud集成Nacos
利用 Idea 创建 Spring Cloud 项目,New -> Project -> SpringIntializr
其中的父项目(parent
)GoboyCloud
的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>
<packaging>pom</packaging>
<modules>
<module>GoboyNacos</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>goboycloud</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<java.version>8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring cloud依赖 他们的版本是需要一一对应的-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
父项目的 pom.xml
定义了 Spring Cloud 和 Spring Cloud Alibaba 依赖版本,各子项目都使用同一版本下的子依赖版本。
注意!!!spring-cloud-starter-alibaba-nacos-config和spring boot版本对照。
接着创建一个名称为 GoboyNacos
的 module
;创建过程为New -> Module -> Maven
;
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>GoboyNacos</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>GoboyNacos</name>
<description>Demo project for Spring Cloud Nacos</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
继承了 GoboyCloud 的 pom.xml
。且引入依赖:
spring-cloud-starter-alibaba-nacos-config
:作为 Nacos 客户端读取 Nacos 配置。spring-boot-starter-web
:提供 Web 接口。
新建bootstrap.yml
先保证Nacos服务已经启动,bootstrap.yml
优先级高于application.yml
所以配置文件名设置为bootstrap.yml
在 GoboyNacos 项目中新增 bootstrap.yml
,添加一下内容:
spring:
application:
name: GoboyNacos
cloud:
nacos:
config:
server-addr: 8.xxx.xx.xxx:9001
file-extension: yaml #配置内容的数据格式,有properties和yaml类型(可选)
# refresh : true #开启自动刷新开启后不需要使用@RefreshScope注解
之所以需要配置 spring.application.name
的名称,是因为它是构成 Nacos服务配置 Data Id
的一部分。
Nacos 服务中Data Id
完整格式组成如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
:默认为spring.application.name
的值。spring.profiles.active
:是当前环境对应的 profile,如果为空,则-${spring.profiles.active}
为空。file-extension
:配置内容格式,支持properties
和yaml
格式。
上述的 bootstrap.yml 配置表示Nacos Server会读取 Data Id 为 GoboyNacos
,file-extension类型为 YAML
配置类。
新建启动类
代码语言:javascript复制package com.cloud.goboy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class NacosconfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosconfigApplication.class, args);
}
}
新建测试类
代码语言:javascript复制package com.cloud.goboy.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class ConfigController {
private static final Logger logger = LoggerFactory.getLogger(ConfigController.class);
@Value("${user:Goboy}")
private String user;
@GetMapping(value = "/config")
public String config() {
logger.info("nacos user : {}", user);
return user;
}
}
这里我们通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。
在配置文件中配置 refresh : true # 开启自动刷新开启后不需要使用@RefreshScope注解。
配置管理Nacos
在 Nacos 控制台添加一个新的配置:
- Data Id:GoboyNacos
- Group:DEFAULT_GROUP
- 配置格式:YAML
- 配置内容:
server:
port: 9080
user: Goboy
配置内容完成后如下图所示:
启动项目
我们从下图中可以看出,在我们本地没有配置server端口为9080的情况下。启动端口变成了9080。
简单的接口测试
Nacos动态配置
@RefreshScope
我们通过@Value注解可以获取到配置中心(yml)的值,但是没有办法动态感知修改后的值,当我们Controller访问的时候,实际上访问的是Controller的Bean实例,服务启动初始化的过程中Bean在单例对象池里面的属性已经赋值了。
原始值:Goboy10086
修改Nacos配置中心:The current value is modified
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!