本文后续使用是在spring-boot应用中使用,注意说的spring-boot应用就是spring-boot应用,不要一谈sprinb-boot应用对一些中间件的使用,说是spring-boot使用,上来就依赖spring-cloud。
下载
下载地址,选择对应版本,这里后续选择的版本是2.0.2
https://github.com/alibaba/nacos/tags
maven依赖
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<nacos.version>0.2.10</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
解压后到/conf目录下找到文件nacos-mysql.sql, 然后自己建立数据库连接等,执行sql语句
安装运行
单机
到/conf目录下修改配置文件application.properties其中的数据库连接部分,注释掉默认的内置数据库,然后修改为mysql,自己的数据库连接
单机启动,进入到/bin目录执行脚本
sh startup.sh -m standalone
nacos控制台访问地址为http://host:8848/nacos
默认用户名和密码都是nacos,登录后可以修改密码
端口开放
默认端口是8848,且可配置,但2.0以上版本如果是外网访问还需要开放另外两个端口,在上一个端口的基础上+1000,+1001,
如默认8848,即9848,9849,否则启动不会报错,刷新不会生效,也获取不到配置,跟踪代码发现是报错401, 未连接
基本使用
上面三个官方文档把用到的配置和注解说的非常清楚了,下面不会具体在详细说明。
控制台添加配置文件
使用namespace来做多环境区分, group就采用默认名称就行,注意命名空间ID,这个有用,后续是用这个ID而不是名称
切到刚添加的命名空间,然后添加自己的配置,注意DataId和Group,类似于定位配置的坐标,后续配置中会用到
先新增一个基本的key-value形式的配置文件,注意无论是注入一个属性类包含多个字段,还是仅仅只是一个字段,都必须有一个载体,都必须创建一个配置。
下面先创建两个配置, 注意配置格式,按照自己的喜好,后续使用时对应上就好。
代码编写
1. 配置nacos
在项目中引入nacos的基础配置,注意如果是spring-boot应用,就用spring-{profile}对应的配置文件编写即可。
具体含义可参考,上面已经给出了这个链接。
nacos:
config:
server-addr: localhost:8848
username: nacos
password: nacos
auto-refresh: true
config-retry-time: 3000
namespace: dev
type: yaml
data-id: config-server
2. 编写配置类
config-properties配置对应的代码配置类,注意这里故意比上面配置文件中少一个,就是为了演示,获取单个字段的值,而不是在对象中获取,但是也要有一个载体把dataId引入进来
@Data
@NacosPropertySource(dataId = "config-properties", type = ConfigType.PROPERTIES, autoRefreshed = true)
@Component
public class DynamicPropertySource {
@NacosValue(value = "${name:}", autoRefreshed = true)
private String name;
@NacosValue(value = "${price:0}")
private Integer price;
}
config-server对应的配置类
@NacosConfigurationProperties(prefix = "user-info", dataId = "config-server", type = ConfigType.YAML, autoRefreshed = true)
@Component
@Data
public class DynamicProperties {
private String name;
private Integer age;
private String address;
}
3. 测试代码
@RestController
@RequestMapping("/nacos")
@RequiredArgsConstructor(onConstructor_={@Autowired})
public class NacosController {
private final DynamicProperties dynamicProperties;
private final DynamicPropertySource dynamicPropertySource;
@NacosValue(value = "${singleValue: nothing}", autoRefreshed = true)
private String singleValue;
@NacosInjected
private ConfigService configService;
/**
* 演示单字段注入
*
* @return
*/
@GetMapping("singleValue")
public String singleValue() {
return singleValue;
}
/**
* 演示动态属性注入
*
* @return
*/
@GetMapping("dynamicProperties")
public DynamicProperties dynamicProperties() {
return dynamicProperties;
}
/**
* 演示动态PropertySource注入
*
* @return
*/
@GetMapping("dynamicPropertySource")
public DynamicPropertySource dynamicPropertySource() {
return dynamicPropertySource;
}
}
其中带了autoRefreshed=true语法的,在配置后台修改配置,然后点击发布, 重新获取值就可以发现值也会同步更新。但是试验下来@NacosPropertySource这种方式即使在类上加了这个属性,字段上如果不加也没用。再加上类上用了这个注解, 字段上还是要用@NacosValue,非常麻烦,感觉应该是自己使用姿势不对,暂时没找到对应文档。
还有一个问题, 在配置类上引入data-id,那么在spring-{profile}配置文件中即使不引入data-id也能正常使用。而如果在配置文件中引用,但是在配置类中不引用,反而无法使用。
进阶使用
经过基本使用的过程,还是能深刻体会到目前使用上的不方便的。最重要的是我们也想要获得和spring-cloud环境上可以将数据源等基础配置都交给配置中心来做的,但是目前在配置文件中添加了配置之后,在项目中根本找不到如何引入进来,直接在配置文件中引入data-id,完全不可行。
直到在这个文档地址看到一个属性nacos.config.bootstrap.enable=true,开启配置预加载功能。
那就将这个属性添加到application.yml中, 注意这里不是cloud环境,也没有cloud的依赖,不是bootstrap.yml, spring-boot环境就是spring-boot,非拿着spring-boot的标题去说spring-cloud,是怕别人不知道你懂spring-boot吗。好多中间件都是,就硬往spring-cloud环境上。
application.yml添加如下
nacos:
config:
bootstrap:
enable: true
然后剩下的继续按照spring-{profile}中添加nacos的其它配置,这个时候就可以将项目中的配置都放到nacos中去了,比如数据库,各种中间件的连接配置都可以通过dataId引入的方式。
比如将数据库配置放入到nacos中,到nacos控制台添加对应配置
修改配置文件,引入dataId即可
nacos:
config:
server-addr: localhost:8848
username: nacos
password: nacos
auto-refresh: true
config-retry-time: 3000
namespace: dev
enable-remote-sync-config: false
type: yaml
data-id: config-server
ext-config:
- dataId: common-datasource
type: yaml
auto-refresh: false
- dataId: config-properties
type: properties
auto-refresh: true
而且经过测试发现,这种方式,@NacosPropertySource也不需要在配置类上手动添加dataId即可正常使用了,只需要在配置文件中引入对应的dataId,即可将配置添加到spring的enviroment中