[TOC]
*****
# 1. 引入配置服务器的架构

# 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
```

```
@RestController
public class TestNacosConfigController {
@Value("${my.configuration}")
private String myConfiguration;
@GetMapping("/test-config")
public String testMyConfig() {
return myConfiguration;
}
}
```

# 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版本修复)
问题描述: 点击历史列表--回滚到初始状态,配置列表中的配置数据会丢失,目前建议不要回滚到初始状态
或者可以直接修改配置列表中的数据可以规避该问题
```

# 4. 应用的配置共享
```
ali-user-service-dev.yaml 指定专用配置;
ali-user-service.yaml 指通用配置,
专用配置优先级 大于 通用配置优先级
```

```
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控制台中的属性位置才能生效
```

# 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
```