Nacos作为分布式系统注册中心与配置中心的基本运用




一、前言

英文全称为Naming Configuration Service,缩写为Nacos。官方给的定义是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。我们可以更通俗的理解为服务注册中心加配置中心。它在分布式架构中作用相当于之前的Eureka + Config 。替代了Eureka做注册中心,替换了Config做配置中心。

本文内容为Nacos的安装和其作为分布式项目中注册中心和配置中心的基本运用。


二、环境准备

1.基础环境

PS:Demo演示以本地Windows系统为例,确保本地Maven和Java 8以上环境OK;

案例环境:

  • JDK: 8
  • spring-boot-dependencies:2.2.2.RELEASE
  • spring-cloud-alibaba-dependencies:2.1.0.RELEASE
  • Nacos-server:1.3.2

更多的版本对应关系,请参考官方文档给出的说明版本说明

2.Nacos控制台安装运行

Nacos官网中文地址:https://nacos.io/zh-cn/
在这里插入图片描述

在使用Nacos之前,需要先安装Nacos控制台,控制台下载地址:https://github.com/alibaba/nacos/
在这里插入图片描述

根据需要选择合适的版本进行下载。

Nacos控制台目前提供两种启动方式:

  • standalone       此模式一般用于 demo 和测试,不用改任何配置
  • cluster             此模式一般用于生产环境

在此,由于是进行Demo演示,采取较为简单的standalone模式。

启动步骤
  • 下载window系统所需版本的ZIP文件(点击上图中版本对应的ZIP图标即可下载)

  • 解压ZIP文件,目录如下:

    r0ihOs.png

  • 进入bin目录,在当前目录打开黑窗口,执行 startup.cmd -m standalone (-m standalone 表示以单机模式运行)

在这里插入图片描述

  • 启动成功画面

在这里插入图片描述

官网链接下载较慢,如需要,可前往百度网盘下载V1.3.2版本ZIP文件:

链接:https://pan.baidu.com/s/1lc0j3R-SScN7j1nxL9oj0A
提取码:35ly

  • 在浏览器中输入http://localhost:8848/nacos

在这里插入图片描述

用户名:nacos
密码:nacos

  • 登录成功界面如下

r0F7DA.png

3.工程目录模型

在这里插入图片描述


三、Nacos作为注册中心的基本运用

Nacos注册中心功能,通过server-consumer和server-provider两个工程完成演示。

  • server-provide:服务提供者
  • server-consumer:服务消费者

img

  • 将server-provide和server-consumer注册到Nacos-server,即Nacos控制台;

  • 服务消费者server-consumer通过主动轮询调用server-provide服务接口;

1.父工程搭建

创建名为Nacos-demo的父工程,对整个项目Maven版本进行管理

父工程POM文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>org.xupeng</groupId>
    <artifactId>nacos</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--子模块-->
    <modules>
        <module>server-consumer</module>
        <module>server-provider</module>
         <module>config</module>
    </modules>

    <!-- 统一管理版本管理 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <springboot.version>2.2.2.RELEASE</springboot.version>
        <springcloud.alibaba.version>2.1.0.RELEASE</springcloud.alibaba.version>
    </properties>

    <!-- 作用:锁定版本 子module不用写groupId和version -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--Spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${springcloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.服务提供者(server-provider)

创建名为server-provider的子工程

(1)、POM文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.xupeng</groupId>
        <artifactId>nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>server-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
</project>

(2)、配置文件内容(YML格式文件)
server:
  port: 9002               #应用访问端口

spring:
  application:
    name: SERVER-PROVIDER   #应用名称
  cloud:                   #Nacos控制台地址,根据自己的地址和端口进行修改
    nacos:
      discovery:
        server-addr: localhost:8848

(3)、主启动类上添加
@EnableDiscoveryClient  //让注册中心发现,扫描到该服务
@SpringBootApplication
@RestController
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @GetMapping("/hello")
    public String helloNacos(){
        return "Hello,Nacos!";
    }
}

服务提供者工程创建完毕。

3.服务消费者(server-comsumer)

创建名为server-comsumer的子工程

(1)、POM文件内容
 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.xupeng</groupId>
        <artifactId>nacos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>server-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

(2)、配置文件内容(YML格式文件)
server:
  port: 9001
spring:
  application:
    name: SERVER-CONSUMER  
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848        

(3)、主启动类
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
    
    @Autowired
    private RestTemplate restTemplate;

     /**
     * 注入RestTemplate调用server-provider服务;
     * LoadBalanced注解表示如果被调用的服务有多个节点,则默认采用轮询调用,实现负载均衡。
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    @GetMapping("/consumer")
    public String test() 
        //url拼写规则:  传输协议://服务名/访问路径
        return restTemplate.getForObject("http://nacos-provide/hello",String.class);
    }
}

服务消费者创建完成。

4.测试

  • 启动server-provider和server-consumer,端口分别为9002和9001;

  • 现在登录Nacos控制台,在服务列表中会显示这两个服务,控制台可以对其进行监控和管理;

在这里插入图片描述

  • 浏览器中访问服务消费者的接口 , 可以看到成功返回结果;

    Hello,Nacos!


四、Nacos作为配置中心的基本运用

在父工程下创建名为config的工程

1.配置中心运用的基本演示

(1)、POM文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.xupeng</groupId>
        <artifactId>Nacos-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>server-consumer</artifactId>

    <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>
</project>
(2)、配置文件内容(bootstrap.yml文件)

需要注意的是这里的文件名称必须是bootstrap.×××文件。

server:
  port: 9100
spring:
  application:
    name: nacos-config   #服务名称
  cloud:
    nacos:
      config:
        server-addr: localhost:8848    #服务配置中心地址
        prefix: ${spring.application.name}  #对应配置文件前缀,不配置默认为服务名称
        file-extension: yml            #指定配置中心中对应的配置文件的格式
      
(3)、主启动类
@SpringBootApplication
@RestController        
@RefreshScope            //可以使当前类下的配置支持动态更新
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    /**
     * 其中通过@Value注解,去读取配置中心对应的配置文件中为nacos.info的值,并通过/getInfo接口返回。
     */
    @Value("${nacos.info}")
    private String info;

    @RequestMapping("/getInfo")
    public String getValue() {
        return info;
    }
}


(4)、新建配置

在Nacos-server配置管理->配置列表中新建配置
在这里插入图片描述

点击右上方  “+”  按钮,进入如下页面:
在这里插入图片描述

  • Data ID
  1. 定义规则: {prefix}-{spring.profile.active}.{file-extension};当spring.profile.active 为空时,定义规则为{prefix}.{file-extension};

  2. prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置;

  3. file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。

    此案例没有配置spring.profile.active ,因此Data-Id为:nacos-config.yml

  • Group

    可自定义Group

    先采用默认的DEFAULT_GROUP

  • 配置格式

    目前仅支持yml和properties两种格式,此案例采用yml

  • 文件内容

    nacos:

    info: Hello Nacos Config!

以上的每一项,在工程的bootstrap.yml配置文件中都有与其对应的配置:

server:
  port: 
spring:
  application:
    name:                     #服务名称
  cloud:
    nacos:
      config:
        server-addr:          #服务配置中心地址
        prefix:               #对应配置文件前缀,不配置默认为服务名称
        file-extension:       #指定配置中心中对应的配置文件格式
        namespace:            #命名空间ID
        group:                #命名空间下的组名称   

(5)、测试
  • 保证Nacos控制台启动成功

  • 检查配置文件内容,搞清楚每一项配置的作用

  • 启动config项目

  • 调用接口进行测试 http://localhost:9100/getInfo,可以看到如下返回结果

    Hello Nacos Config!

  • 说明成功读取到配置文件内容,接着修改控制台配置文件内容,测试是否能够动态刷新
    在这里插入图片描述

  • 调用 http://localhost:9100/getInfo接口,返回如下结果,表明动态刷新成功。

    Hello!

2.profile粒度的配置

  • 在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
server:
  port: 9100
spring:
  application:
    name: nacos-config      #服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: localhost:8848    #服务配置中心地址
        prefix: ${spring.application.name}  #配置中心对应配置文件前缀
        file-extension: yml            #指定配置中心中对应的配置文件的格式
  • 上图配置了&{spring.profiles.active}=dev,则DataId为nacos-config-dev.yml

在这里插入图片描述

  • 重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:

    pro_dev

2.自定义命名空间(Namespace)

命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在bootstarp.×××文件没有指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过如下方式实现:

  • 在Nacos server新建命名空间

    在这里插入图片描述

  • 查看命名空间列表
    在这里插入图片描述

  • 将命名空间ID配置到config-server项目中的bootstarp.×××文件中

    server:
      port: 9100
    spring:
      application:
        name: nacos-config      #服务名称
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848    #服务注册中心地址
          config:
            server-addr: localhost:8848    #服务配置中心地址
            prefix: ${spring.application.name}          #对应配置文件前缀,不配置默认为服务名称
            file-extension: yml            #指定配置中心中对应的配置文件的格式
            namespace: 7f7b095b-b388-49f2-ab3d-133bc73493b0  #DEV命名空间ID
    
  • 在Nacos-server配置管理列表DEV命名空间下新建配置
    在这里插入图片描述

  • 新建配置文件内容如下:
    在这里插入图片描述

  • 重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:

    Hello DEV!

3.自定义Group

在同一个group下,配置文件名不能重复,所以当需要创建文件名称相同的两个配置文件时,将两个配置文件创建在不同的group下即可。当我们再同一个group下创建一个已有的配置文件时,nacos会将其视为配置文件的修改,而不是新建。

  • 在Nacos-server上DEV命名空间下新建配置,填写自定义的Group名称,直接输入即可。本案例中自定义组名称为MYSELF_GROUP。在这里插入图片描述

  • 查看配置列表
    在这里插入图片描述

  • 在nacos-config工程中添加自定义group信息

    server:
      port: 9100
    spring:
      application:
        name: nacos-config      #服务名称
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848   #服务注册中心地址
          config:
            server-addr: localhost:8848    #服务配置中心地址
            prefix: ${spring.application.name}     #对应配置文件前缀,不配置默认为服务名称
            file-extension: yml                    #指定配置中心中对应的配置文件的格式
            namespace: 7f7b095b-b388-49f2-ab3d-133bc73493b0  #DEV命名空间ID
            group: MYSELF_GROUP   #DEV命名空间下的MYSELF_GROUP
    
  • 重启nacos-config,访问 http://localhost:9100/getInfo,返回如下结果:

    DEV myself_group


本文参考代码

更多详情请参考官方手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值