nacos-配置中心

  • Post author:
  • Post category:其他



目录


主流的配置中心对比


nacos 特性


服务发现与服务健康检查


动态配置管理


动态 DNS 服务


服务和元数据管理


安装nacos


web端访问


nacos数据库使用


新增配置


Apollo的配置结构图


nacos的配置结构图


创建测试项目


用户管理


通过web 界面进行管理


手动修改数据库


分布式应用


服务配置bootstrap.yml


资源获取


静态获取配置


静态资源的动态更新


动态获取配置


自定义扩展data id(nacos-server-0)


共享dataid(nacos-server-0)


nacos集群(windows)


内置数据库启动


外置数据库启动


MySQL数据库


修改配置文件


多网卡IP选择


修改 cluster 文件


单机启动集群


启动命令


源码地址


nacos 既是 配置中心 又是 注册中心

nacos 支持http 方式的服务调用,支持 dubbo 方式的服务调用

eureka 支持 http 方式的服务调用

主流的配置中心对比



对比项目



Spring Cloud Config



Apollo



Nacos



配置实时推送


支持(Spring Cloud Bus)

支持(HTTP长轮询1s内)

支持(HTTP长轮询1s内)


版本管理


支持(Git)

支持

支持


配置回滚


支持(Git)

支持

支持


灰度发布


支持

支持

不支持


权限管理


支持(依赖Git)

支持

不支持


多集群


支持

支持

支持


多环境


支持

支持

支持


监听查询


支持

支持

支持


多语言


只支持Java

主流语言,提供了Open API

主流语言,提供了Open API


配置格式校验


不支持

支持

支持


单机读(QPS)


7(限流所致)

9000

15000


单击写(QPS)


5(限流所致)

1100

1800


3节点读 (QPS)


21(限流所致)

27000

45000


3节点写 (QPS)


5(限流所致)

3300

5600

nacos 特性

服务发现与服务健康检查


Nacos


使服务更容易注册,并通过


DNS





HTTP


接口发现其他服务,


Nacos


还提供服务的实时健康检查,以防

止向不健康的主机或服务实例发送请求

动态配置管理


动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。


Nacos


消除了在更新配置时重新

部署应用程序,这使配置的更改更加高效和灵活

动态 DNS 服务


Nacos


提供基于


DNS


协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在


Nacos


上的服务以

域名的方式暴露端点,让三方应用方便的查阅及发现。

服务和元数据管理


Nacos


能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周

期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。

安装nacos

curl工具下载地址:

https://curl.se/windows/

将curl 的 D:\curl-7.74\curl-7.74.0_2-win64-mingw\bin 添加到 环境变量

官网地址:

https://nacos.io/zh-cn/docs/quick-start.html

nacos下载地址:

https://github.com/alibaba/nacos/releases

下载解压后,在 bin 目录下运行

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

web端访问


http://localhost:8848/nacos/#/login

账号,密码: nacos  nacos

新增命名空间

配置列表

nacos数据库使用

默认使用的内置数据库

如果想使用自己的数据库,学会使用官方的文档,官方文档

https://nacos.io/zh-cn/docs/deployment.html

新增配置

Apollo的配置结构图

nacos的配置结构图

添加完配置文件后,列表页会显示 示例代码,这个时候,可以直接使用示例代码进行测试 ,如果添加的文件的命令空间不是 public ,需要手动指定命名空间,示例代码有删除的操作,查看完之后,会将该配置文件删除

创建测试项目

官网地址: Nacos Spring Cloud 快速开始

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

nacos – springcloud-springboot 版本匹配:

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

由于父项目中引入了

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${com-alibaba-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

所以在 nacos-demo 模块中直接引入依赖,不用指定版本即可

        <!-- alibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

对示例代码进行修改 后的内容,添加命名空间,注释删除操作

public static void main(String[] args) throws NacosException, InterruptedException {
        //nacos 地址
        String serverAddr = "127.0.0.1:8848";
        // data id
        String dataId = "nacos-demo.yaml";
        // Group
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        // 指定命名空间, 使用的是,命名空间的id
        properties.put(PropertyKeyConst.NAMESPACE, "fca23eb6-3866-4b8c-8f86-5eeb14e0599d");
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("recieve:" + configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        });

        boolean isPublishOk = configService.publishConfig(dataId, group, "content");
        System.out.println(isPublishOk);

        Thread.sleep(3000);
        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);

        // 删除 dataid 的配置文件
        /*boolean isRemoveOk = configService.removeConfig(dataId, group);
        System.out.println(isRemoveOk);
        Thread.sleep(3000);*/

        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        Thread.sleep(300000);
    }

查看监听列表

用户管理

通过web 界面进行管理

手动修改数据库

nacos的密码是加密的,需要将加密后的内容添加到数据库中

// 加密
    public static void main(String[] args) {
        System.out.println(new BCryptPasswordEncoder().encode("123456"));
    }

添加用户

INSERT INTO users (username, password, enabled) VALUES ('root', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

将用户添加到角色表, 角色为 管理员

INSERT INTO roles (username, role) VALUES ('root', 'ROLE_ADMIN');

分布式应用

nacos-server-0

nacos-server-1

服务配置bootstrap.yml

# bootstrap.yml 的优先级高于 application.yml  ,由于,nacos配置中心使用的是 application.yml 配置

资源获取

静态获取配置

/**
 * @author yangLongFei 2021-01-05-9:38
 */
@RestController
@RequestMapping("/nacos")
public class NacosController {

    /**
     * 这种方式,在经过nacos 修改后,无法实时获取配置信息
     */
    @Value("${common.name}")
    private String commonName;

    @GetMapping("/getCommonName")
    public String getCommonName() {
        return commonName;
    }

}

静态资源的动态更新

@RefreshScope // 实现配置的动态更新
/**
 * @author yangLongFei 2021-01-05-9:38
 */
@RestController
@RequestMapping("/nacos")
@RefreshScope // 实现配置的动态更新
public class NacosController {

    /**
     * 这种方式,在经过nacos 修改后,无法实时获取配置信息
     */
    @Value("${common.name}")
    private String commonName;

    @GetMapping("/getCommonName")
    public String getCommonName() {
        return commonName;
    }

}

动态获取配置

/**
 * @author yangLongFei 2021-01-05-9:38
 */
@RestController
@RequestMapping("/nacos")
public class NacosController {

    @Autowired
    private ConfigurableApplicationContext applicationContext;

    /**
     * 动态更新,nacos 配置文件发生修改,能够实时看到
     */
    @GetMapping("/getCommonName")
    public String getCommonName() {
        return applicationContext.getEnvironment().getProperty("common.name");
    }

}

自定义扩展data id(nacos-server-0)

使用 nacos 进行配置的时候, dataid 最好全部带上文件的后缀名称,因为nacos在进行解析的时候,会判断是否有文件的后缀名称,否则会报错

java.lang.IllegalStateException: [nacos-demo] must contains file extension with properties|yaml|yml|xml|json

at com.alibaba.cloud.nacos.parser.NacosDataParserHandler.checkDataId(NacosDataParserHandler.java:68) ~[spring-cloud-alibaba-nacos-config-2.2.0.RELEASE.jar:2.2.0.RELEASE]

由于服务本身的 data id 可以手动指定文件的扩展名,但是在扩展的dataid 的配置项中没有  file-extension 的选项,所以在添加扩展配置的时候,必须带有文件的扩展名



总结:所有的dataid在进行创建的时候,都带上文件的扩展名

扩展data id 只支持 dataId, group, refresh 这三个属性,也就是,说扩展的 data id 必须存在于同一个 namespace

# bootstrap.yml 的优先级高于 application.yml  ,由于,nacos配置中心使用的是 application.yml 配置
# 项目的服务中需要使用 bootstrap.yml
server:
  port: 58010 #启动端口
spring:
  application:
    name: nacos-server-0
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址
        file-extension: yaml  #配置中心的配置文件的后缀
        namespace: fca23eb6-3866-4b8c-8f86-5eeb14e0599d #命名空间的id
        group: NACOS_GROUP #配置组,不指定默认是 DEFAULT_GROUP
        extension-configs[0]:
          data-id: nacos-demo.yaml
#          group: DEFAULT_GROUP #默认是DEFAULT_GROUP
          refresh: true #是否动态刷新,默认 false
        extension-configs[1]:
          data-id: extension-configs-a.yaml
          group: GLOBALE_GROUP
          refresh: true
    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @GetMapping("/getCommonName")
    public String getCommonName() {
        String commonName = applicationContext.getEnvironment().getProperty("common.name");
        String commonAge = applicationContext.getEnvironment().getProperty("common.age");
        String commonSex = applicationContext.getEnvironment().getProperty("common.sex");
        String commonPhone = applicationContext.getEnvironment().getProperty("common.phone");
        String commonAddress = applicationContext.getEnvironment().getProperty("common.address");
        String commonPort = applicationContext.getEnvironment().getProperty("common.port");
        return "name: " + commonName + " age:" + commonAge + " sex:" + commonSex + " phone:" + commonPhone + " address:" + commonAddress + " port:" + commonPort;
    }

共享dataid(nacos-server-0)

本身使用的时候,和 扩展data id 没有任何区别

#配置文件优先级问题: shared(下标越大优先级越高) < extension(下标越大优先级越高) < 服务本身的配置
# bootstrap.yml 的优先级高于 application.yml  ,由于,nacos配置中心使用的是 application.yml 配置
# 项目的服务中需要使用 bootstrap.yml
server:
  port: 58010 #启动端口
spring:
  application:
    name: nacos-server-0
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址
        file-extension: yaml  #配置中心的配置文件的后缀
        namespace: fca23eb6-3866-4b8c-8f86-5eeb14e0599d #命名空间的id
        group: NACOS_GROUP #配置组,不指定默认是 DEFAULT_GROUP
        extension-configs[0]: #扩展 dataid
          data-id: nacos-demo.yaml
#          group: DEFAULT_GROUP #默认是DEFAULT_GROUP
          refresh: true #是否动态刷新,默认 false
        extension-configs[1]:
          data-id: extension-configs-a.yaml
          group: GLOBALE_GROUP
          refresh: true
        shared-configs[0]: #共享 dataid
          data-id: nacos-share-config-0.yaml
          group: SHARE_GROUP
          refresh: true
#配置文件优先级问题: shared(下标越大优先级越高) < extension(下标越大优先级越高) < 服务本身的配置

nacos集群(windows)

windows 和 linux 的启动都是一样的,只是启动的脚本不一样, linux 是 .sh , windows 是 .cmd

启动集群

内置数据库启动

尝试了一下没有成功


启动命令: startup.cmd -p

embedded

外置数据库启动

MySQL数据库

下载地址:

https://downloads.mysql.com/archives/installer/

数据库初始化脚本:

https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql

修改配置文件

位于 conf 文件夹

  • ip-address参数可以直接设置nacos的ip
nacos.inetutils.ip-address=127.0.0.1

可以设置多个数据库,主备模式

#数据库个数为2个

db.num=2

db.url.0=jdbc:mysql://192.168.44.130:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC

db.url.1=jdbc:mysql://192.168.44.131:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC

db.user=root

db.password=123456

### Default web server port:
server.port=8848

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP:
# nacos.inetutils.ip-address=
nacos.inetutils.ip-address=127.0.0.1


#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
# spring.datasource.platform=mysql

### Count of DB:
# db.num=1

### Connect URL of DB:
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user=nacos
# db.password=nacos
#数据库个数
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.url.1=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456

多网卡IP选择

当本地环境比较复杂的时候,Nacos服务在启动的时候需要选择运行时使用的IP或者网卡。Nacos从多网卡获取IP参考Spring Cloud设计,通过nacos.inetutils参数,可以指定Nacos使用的网卡和IP地址。目前支持的配置参数有:

  • ip-address参数可以直接设置nacos的ip
nacos.inetutils.ip-address=10.11.105.155
  • use-only-site-local-interfaces参数可以让nacos使用局域网ip,这个在nacos部署的机器有多网卡时很有用,可以让nacos选择局域网网卡
nacos.inetutils.use-only-site-local-interfaces=true
  • ignored-interfaces支持网卡数组,可以让nacos忽略多个网卡
nacos.inetutils.ignored-interfaces[0]=eth0
nacos.inetutils.ignored-interfaces[1]=eth1
  • preferred-networks参数可以让nacos优先选择匹配的ip,支持正则匹配和前缀匹配
nacos.inetutils.preferred-networks[0]=30.5.124.
nacos.inetutils.preferred-networks[0]=30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))

修改 cluster 文件

位于 conf 文件夹

修改为,各个节点的 ip:端口

#2021-01-08T15:41:57.439
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850

单机启动集群

修改 server.port=8848 为相应的文件夹,其他的保持一致

启动命令

打开cmd

startup.cmd

源码地址


https://github.com/YANG-sty/study



版权声明:本文为yang_zzu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。