学习阶段, 直接使用Windows版本
git拉源码或者下载zip包方式都行
我选择zip包 解压即用
地址: Release 2.0.3 (July 28, 2021) · alibaba/nacos · GitHub
双击 startup.cmd 启动
启动完成界面 访问路径
启动完成. 初始用户名+密码 : nacos nacos
1 发布配置测试 路径 : http://127.0.0.1:8848/nacos/v1/cs/configs
使用工具 postman POST请求
返回true 配置发布成功
2 获取配置测试
同理 GET请求
第一阶段思考 :
项目获取配置启动?
项目发布配置启动?
yml文件怎么处理?
------------------------------------------------------------------------------------------------
Nacos配置 数据库配置源
(建议MySQL版本8以下) 新建数据库 nacos_config 运行nacos-server-1.1.3\nacos\conf
下的 nacos-mysql.sql 文件 生成配置的必须表 (意味着配置直接写在数据库里面 读取)
配置 Nacos从数据库读取配置信息
在conf文件下的 application.properties 文件最后追加 数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=***
db.password=***
重启 Nacos 服务
在项目里面测试 :
pom.xml文件引入 (如果 maven没问题还一直引入失败 手动输入一下 可能是不能识别不同编码的那个横线)
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.3</version>
</dependency>
Nacos测试完成.
渐进式思考 :
目前依然不清楚yml文件是怎么处理的
但是获取参数的功能, 可以实现 统一配置次数之类的东西 比如: 登录密码错误次数上限
数据库表同样可以做到 有什么特殊的地方呢
------------------------------------------------------------------------------------------------
命名空间配置
命名空间 Namespace (获取配置未指定时,默认就是public保留空间)
配置分组 Group
配置集 Date ID
理解(从上往下) : 不同环境阶段 的 不同项目 的 不同工程 的配置文件
一个工程(分布式系统 那么服务都应该是分离的 比如封装的各种组件 完全的远程调用方式)根据这三个参数来确定获取到属于自己的配置文件
------------------------------------------------------------------------------------------------
配置监听
receiveConfigInfo 返回的就是最新的配置参数
------------------------------------------------------------------------------------------------
测试项目运用
描述 :
微服务项目 -> 新建一个父工程 两个子模块工程 结构如图 导入图中所示jar包
父工程
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies></dependencyManagement>
service1 和 service2同 写下各自的配置文件 (端口号改一下)
<dependencies>
<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>
</dependencies>
注意 :
配置文件名命名必须 bootstrap.yml 因为它会优先于 application.yml 加载. (文件后缀可以为其它允许的格式), 否则会加载不到线上数据
启动如果报错 : Could not resolve placeholder 可能是以下原因
配置文件中
file-extension: yml 此处的yml需要对应nacos上的文件名后缀
yaml配置格式, 但是文件名是yml后缀 ,根据文件名后缀决定
使用postman测试
成功获取到线上配置 此处命名 + 格式必须正确 负责启动会直接报错
在上面的项目截图中 使用@Value注解插值的时候
如果括号内的key在yml文件中
** 能找到, 就会返回配置值**
未找到 就返回线上的配置值
如果同时存在, 也是返回线上的值
参数能够获取, 但此时的配置是不能动态获取到更新的 就是并没有之前listener的那种效果, 因为@Value并不能实现该功能
实际运用动态获取参数的更新 此处需要使用官方提供的方式
@Autowired
ConfigurableApplicationContext applicationContext;
//再使用相应的API完成操作 (效果等同于addListener)
applicationContext.getEnvironment().getProperty("xxx.xxx")
思考与答案:
实际可运用, 实现线上配置参数 如: 初始化数据库的连接参数
假如 yml文件本身需要的参数, 是否可以线上配置 比如 : 端口号 就算获取了, 该如何使用
------------------------------------------------------------------------------------------------
自定义扩展 Data Id 方式
使用此方式读取多个线上配置
配置的优先级问题 :
服务名 + 后缀 的组合配置 > 扩展配置(ext-config) > 共享配置(不作介绍)
完全关闭线上配置 :
spring.cloud.nacos.config.enabled = false
集群配置(自己电脑单机操作的,没啥意义,只记录一下,k8s或其他集群方式再仔细学习)
1 找到config下的 cluster.config.example 文件 改名 cluster.conf
配置内容 使用多个 ip:port 代表使用多个节点
127.0.0.1:8848
127.0.0.1:8858
127.0.0.1:8868
2 application.properties配置文件中 修改 server.port = 各自的端口号
解释: 每个服务使用自己的端口 防止端口冲突 看到这个配置应该就懂了
3 启动方式 不再直接cmd
命令启动(同方式3次)
startup -m cluster
效果图:
使用三个节点是为了选举机制,当其中一个节点挂掉可以自动选举出的leader
对于3个节点的时候, 建议配备两个config数据库 (利于高可用)
配置方式:
application.properties配置文件中已经配置过一个数据库
直接添加第二个数据库
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://另一个的ip:3306/... (后面的相同)
db.user=***
db.password=***
代码中使用集群地址:
完事.