[TOC]
*****
# 1. 引入配置服务器的架构
![](https://img.kancloud.cn/8f/56/8f5697c6b206853136def735a62efe20_613x379.png)
# 2. 使用Nacos管理配置
```
第一步: 加依赖 compile('org.springframework.cloud:spring-cloud-starter-alibaba-nacos-config')
第二步: 写配置 约定大于配置, 创建 bootstrap.yml, 添加配置
spring:
profiles:
active: dev
application:
name: ali-user-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: 43dc7240-b605-44b9-8885-045fab030832
file-extension: yaml
```
![](https://img.kancloud.cn/fa/14/fa142d7bf77c7a75945164491efccfda_854x359.png)
```
@RestController
public class TestNacosConfigController {
@Value("${my.configuration}")
private String myConfiguration;
@GetMapping("/test-config")
public String testMyConfig() {
return myConfiguration;
}
}
```
![](https://img.kancloud.cn/27/d7/27d7aedf7700ca23a9f41d265092c10a_970x736.png)
# 3. 配置属性动态刷新与回滚(附回滚Bug)
```
目标: 修改配置中心中的内容,不需要重启服务 (@RefreshScope)
```
```
修改代码:
@RestController
@RefreshScope
public class TestNacosConfigController {
@Value("${my.configuration}")
private String myConfiguration;
@GetMapping("/test-config")
public String testMyConfig() {
return myConfiguration;
}
}
```
```
回滚的bug(将会在1.2版本修复)
问题描述: 点击历史列表--回滚到初始状态,配置列表中的配置数据会丢失,目前建议不要回滚到初始状态
或者可以直接修改配置列表中的数据可以规避该问题
```
![](https://img.kancloud.cn/07/48/0748515f14ecfe201cb96995b60e404b_765x503.png)
# 4. 应用的配置共享
```
ali-user-service-dev.yaml 指定专用配置;
ali-user-service.yaml 指通用配置,
专用配置优先级 大于 通用配置优先级
```
![](https://img.kancloud.cn/4f/61/4f61589cc3c8a6daeccccc3622328800_789x162.png)
```
1. 多个微服务共享配置 -> 自动方式(根据[应用名-环境名].yaml方式)
spring:
profiles:
active: dev
application:
name: ali-user-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: 43dc7240-b605-44b9-8885-045fab030832
file-extension: yaml
```
```
2. 多个微服务共享配置 -> shared-dataids 方式
# 配置管理
spring:
profiles:
active: dev
application:
name: ali-user-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: 43dc7240-b605-44b9-8885-045fab030832
file-extension: yaml
# 共享配置的DataId, 多个使用,分隔
# 越靠后,优先级越高; common2.yaml > common1.yaml
# .yaml后缀不能少,只支持yaml/properties
shared-dataids: common1.yaml,common2.yaml
# 哪些共享配置支持动态刷新,多个使用,分隔
refreshable-dataids: common1.yaml
```
```
3. 多个微服务共享配置 -> ext-config 方式
spring:
profiles:
active: dev
application:
name: ali-user-service
cloud:
nacos:
config:
server-addr: localhost:8848
namespace: 43dc7240-b605-44b9-8885-045fab030832
file-extension: yaml
# 共享配置的DataId, 多个使用,分隔
# 越靠后,优先级越高; common2.yaml > common1.yaml
ext-config:
- data-id: common1.yaml
# common1.yaml所在的group
group: DEFAULT_GROUP
# 是否允许刷新, 默认false
refresh: true
- data-id: common2.yaml
group: DEFAULT_GROUP
refresh: true
```
```
总结: 三种方式的优先级 shared-dataids < ext-config < 自动
```
# 5. 引导上下文
```
1. bootstrap.yml 就是引导上下文的文件,使用连接nacos的,读取外部配置;
2. 引导上下文是Application Context的父上下文,因此profiles和application属性要放在bootstrap.yml中;
3. 默认远程配置 [优先级 大于 本地配置优先级],即 bootstrap > application
可以通过下方属性修改优先级,注意该配置需要放到远程的nacos控制台中的属性位置才能生效
```
![](https://img.kancloud.cn/67/52/67522cce8092609c7fab6b2e24980a3f_790x332.png)
# 6. 数据持久化
```
1. nacos作为服务发现组件数据是存放在本地的 /nacos/naming 中;
2. nacos作为配置服务器
配置数据: 存放在 $NACOS_HOME/data/derby-data 中(derby是Apache内嵌数据库);
快照: /nacos/config
```
# 7. 搭建生产可用的Nacos集群
```
用mysql代替derby
参考: http://www.imooc.com/article/288153
```