目录
八、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
代码配置