Nacos 1

424 阅读4分钟

学习阶段, 直接使用Windows版本

git拉源码或者下载zip包方式都行

我选择zip包 解压即用

地址: Release 2.0.3 (July 28, 2021) · alibaba/nacos · GitHub

双击 startup.cmd 启动

启动完成界面   访问路径

http://localhost:8848/nacos

启动完成.  初始用户名+密码 : 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=***

代码中使用集群地址:

    

完事.