目录
〇、简介
一、什么是配置中心
配置
配置中心
二、主流配置中心
三、nacos
功能
安装
使用mysql作为存储数据库
发布配置
四、通过程序获取配置
五、nacos配置
六、管理操作
界面操作
配置操作
数据库操作
七、通过程序监听查询
八、springboot使用nacos配置并自动获取最新配置
九、拓展的配置
十、集群部署
〇、简介
Nacos,阿里开源,针对微服务架构中的
的综合型解决方案
官网
配置中心概念和使用场景
nacos功能特性
快速入门方法
安装方式
配置管理的核心概念以及数据模型
使用控制台进行配置管理
分布式系统应用的方法
集群部署方式
一、什么是配置中心
配置
应用程序启动运行时候的参数信息
特点:
- 独立于程序的只读变量
- 配置伴随应用的整个生命周期
- 多种加载方式:硬编码、配置文件、环境变量、启动参数、数据库
- 配置需要治理:在不同环境(开发、测试、生产)、不同集群(如不同的数据中心)
配置中心
将配置从不同的应用中剥离出来,对配置统一管理,应用本身部管理配置
二、主流配置中心
- spring cloud config
- apollo
- nacos

来源:https://www.cnblogs.com/tubeWang/p/11854807.html
三、nacos
官网快速入门
本文使用nacos1.3.2
下载地址

功能
- 服务发现与健康度检查
- 动态配置管理
安装
64位os
64位jdk1.8+
maven3.2.x+
windows下载压缩包解压到安装目录

进入bin目录,通过以下方式启动
# 单机
./startup.sh -m standalone
startup.cmd -m standalone
启动成功:Nacos started successfully in stand alone mode. use external storage
注意:
如果是非单机模式启动 默认使用mysql作为外置数据库,此时需要到conf/application.properties内添加mysql的相关配置参数。否则就会去找jdbc.properties,两者都没有,那相当于依赖没有启动成功,自然就启动不起来。
解决方法是启动时加上 -p embedded 使用derby + jraft的内嵌数据库,或者-m standalone 启动单机模式(内置的嵌入式数据库)
启动成功后通过http://localhost:8848/nacos进入nacos管理系统,用户名nacos,密码nacos
使用mysql作为存储数据库
1、创建数据库nacos_config,使用conf/nacos-mysql.sql初始化数据库


2、修改配置文件conf/application.properties

解决启动故障


原因:缺少配置文件cluster.conf
解决:复制文件cluster.conf.example文件,修改名称即可
3、启动成功,可以看到数据已经是在mysql数据库中的

发布配置
# 发布
curl -X POST "http://localhost:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"


# 获取
curl -X GET "http://localhost:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

四、通过程序获取配置
引入maven依赖
<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.2</version>
</dependency>
编码
public static final String SERVER_ADDR = "localhost:8848";
public static final String DATA_ID = "nacos-demo.yml";
public static final String GROUP = "DEFAULT_GROUP";
public static final Logger logger = LoggerFactory.getLogger(SimpleNacosDemo.class);
public static void main(String[] args) throws NacosException {
// 使用nacos client 获取nacos 的配置
Properties properties = new Properties();
properties.put("serverAddr",SERVER_ADDR);
// 获取配置
ConfigService configService = NacosFactory.createConfigService(properties);
String config = configService.getConfig(DATA_ID, GROUP, 1000);
logger.info("获取到的配置:\n{}",config);
}
结果
20:29:48.705 [main] INFO com.jay.cloudlearn.nacos.SimpleNacosDemo - 获取到的配置:
server:
prot: 8080
五、nacos配置

命名空间:对不同的环境进行隔离,区分开发、测试、生产
分组:对配置文件分组,无特殊要求,通常用来区分不同的项目或应用,一般是项目名称分组
配置集:每个项目下有若干个工程,每个dataId是工程的主配置文件
配置项:一般是key-value格式
六、管理操作
界面操作

配置操作
关闭登录认证

数据库操作
添加账户
操作users表

添加用户的角色
(操作roles表)

修改密码
(操作users表)
修改password字段即可
密码获取方式为:
# 引入security依赖
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.4.1</version>
</dependency>
// 代码编写
public static void main(String[] args) {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encode = encoder.encode("nacos2020");
System.out.println(encode);
}
七、通过程序监听查询
代码
configService.addListener(DATA_ID, GROUP, new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
public void receiveConfigInfo(String s) {
logger.info("配置变化:\n{}",s);
}
});
while (true){
Thread.sleep(2000);
}
结果
21:18:10.891 [com.alibaba.nacos.client.Worker.longPolling.fixed-localhost_8848-GUOKIBMWG7FCFRO4] INFO com.jay.cloudlearn.nacos.SimpleNacosDemo - 配置变化:
server:
prot: 28080
题外话
为什么要在死循环里面sleep?
每次在创建的线程函数中,有whlie(true)死循环的时候,在执行完一遍循环体的时候一般会使用sleep(),使死循环不会一直占用CPU资源(将当前线程置入等待状态,并让它等待一段指定的时间间隔)
八、springboot使用nacos配置并自动获取最新配置
引入依赖
<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>
在bootstrap.yml中配置
server:
port: 56011
spring:
application:
name: service2
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
# dataId = 项目名称+拓展名
file-extension: yml
namespace: GUOKIBMWG7FCFRO4
group: TEST_GROUP
在代码中引入
// 方式一、@Value注入,不能获取动态调整后的值
@Value("${common.name}")
private String commonName;
// 方式二、上下文
@Resource
private ConfigurableApplicationContext applicationContext;
applicationContext.getEnvironment().getProperty("common.name")
九、拓展的配置
spring:
application:
name: service2
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
# dataId = 项目名称+拓展名
file-extension: yml
namespace: GUOKIBMWG7FCFRO4
group: TEST_GROUP
# 扩展的配置
extension-configs:
- data-id: ext-config-common01.properties
- data-id: ext-config-common02.properties
group: GLOBALE_GROUP
- data-id: ext-config-common03.properties
# 动态刷新
group: REFRESH_GROUP
refresh: true
配置的优先级:
内部>拓展
拓展内部的顺序在后的>在前的
十、集群部署
集群配置主要是为了高可用
修改配置
【application.properties】主要是端口和设定ip

【cluster.conf】集群的机器host和端口
127.0.0.1:8848 127.0.0.1:8849 127.0.0.1:8850
代码配置
|