目录

主流的配置中心对比

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(限流所致)  900015000
单击写(QPS) 5(限流所致)  11001800
3节点读 (QPS)21(限流所致) 2700045000
3节点写 (QPS)5(限流所致)  33005600

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

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐