本文为学习笔记,主要用于记录本人学习过程。部分内容为转载!!!!.

一 Nacos快速入门

什么是 Nacos

  Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

  Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

 

为什么是Nacos

  常见的注册中心:

    1. Eureka(原生,2.0遇到性能瓶颈,停止维护)

    2. Zookeeper(支持,专业的独立产品。例如:dubbo)

    3. Consul(原生,GO语言开发)

    4. Nacos

  相对于 Spring Cloud Eureka 来说,Nacos 更强大。

  Nacos = Spring Cloud Eureka + Spring Cloud Config

  Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现

可以干什么

  Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。

  Nacos主要提供以下四大功能:

    1. 服务发现和服务健康监测

    2. 动态配置服务

    3. 动态DNS服务

    4. 服务及其元数据管理

Nacos快速开始

  结构图:

       

 

  Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。

  2. 64 bit JDK 1.8+

  3. Maven 3.2.x+

下载及安装

  1.从 Github 上下载源码方式

1

2

3

4

5

6

7

8

git clone https://github/alibaba/nacos.git

cd nacos/

# 切换到nacos根目录,执行下列命令

mvn -Prelease-nacos clean install -U  # 要下载很多依赖 会比较慢

ls -al distribution/target/ # 切换目录

 

# change the $version to your actual path

cd distribution/target/nacos-server-$version/nacos/bin

  2.下载源码压缩包方式

  从 最新稳定版本 下载 nacos-server-$version.zip 包

1

2

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz

cd nacos/bin

启动nacos服务

  Linux/Unix/Mac

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

1

sh startup.sh -m standalone

  Windows

  启动命令:

1

cmd startup.cmd

  或者双击startup.cmd运行文件。

  访问:http://localhost:8848/nacos

  用户名密码:nacos/nacos

 

二 Nacos注册中心入门

  创建两个工程,一个是nacos-provider, 另一个是naocos-consumer;

  添加nacos-provider的依赖

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.1.13.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

</parent>

 

<properties>

    <java.version>1.8</java.version>

</properties>

 

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

 

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>

 

    <dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

        <version>2.1.2.RELEASE</version>

    </dependency>

 

    <dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

        <version>2.1.2.RELEASE</version>

    </dependency>

</dependencies>

 

<!--SpringCloud的依赖-->

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-dependencies</artifactId>

            <version>Greenwich.SR5</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

  添加nacos-consumer依赖

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.1.3.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

</parent>

 

<properties>

    <java.version>1.8</java.version>

</properties>

 

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

 

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <scope>test</scope>

    </dependency>

 

    <dependency>

        <groupId>org.springframework.cloud</groupId>

        <artifactId>spring-cloud-starter-openfeign</artifactId>

    </dependency>

 

    <dependency>

        <groupId>com.alibaba.cloud</groupId>

        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

        <version>2.1.2.RELEASE</version>

    </dependency>

 

</dependencies>

 

<!--SpringCloud的依赖-->

<dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-dependencies</artifactId>

            <version>Greenwich.SR5</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

  • provider基本代码

1

2

3

4

5

6

7

8

@RestController

public class ProviderController {

    @GetMapping("invoke")

    public String invoke() {

        return LocalTime.now() + " invoke;

    }

}

  application.yml

1

2

3

4

5

6

7

8

9

server:

  port: 8070

spring:

  application:

    name: nacos-provider

  cloud:

    # nacos服务地址

    nacos:

      server-addr: 127.0.0.1:8848

  在启动类上添加@EnableDiscoveryClient注解

  • consumer基本代码

1

2

3

4

5

6

7

8

9

10

11

@RestController

public class ConsummerController {

 

    @Autowired

    private ProviderFeign providerFeign;

 

    @GetMapping("/test")

    public String test() {

        return providerFeign.invoke();

    }

}

1

2

3

4

5

6

@FeignClient("nacos-provider")

public interface ProviderFeign {

 

    @GetMapping("invoke")

    String invoke();

}

  application.yml

1

2

3

4

5

6

7

8

9

server:

  port: 8071

spring:

  application:

    name: nacos-consumer

  cloud:

    # nacos服务地址

    nacos:

      server-addr: 127.0.0.1:8848

  在启动类添加@EnableFeignClients,@EnableDiscoveryClient注解

调用结果:

    

文档:https://github/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

关于依赖的版本,官方不推荐使用孵化器的版本[https://github/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#%E5%AD%B5%E5%8C%96%E5%99%A8%E7%89%88%E6%9C%AC%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%E4%B8%8D%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8]

推荐使用依赖的版本[https://github/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#%E6%AF%95%E4%B8%9A%E7%89%88%E6%9C%AC%E4%BE%9D%E8%B5%96%E5%85%B3%E7%B3%BB%E6%8E%A8%E8%8D%90%E4%BD%BF%E7%94%A8]

 

三 Nacos入门配置中心

  在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。

  如果微服务架构中没有使用统一配置中心时,所存在的问题:

  • 配置文件分散在各个项目里,不方便维护

  • 配置内容安全与权限

  • 更新配置后,项目需要重启

  nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动

 

nacos与 Spring Cloud的整合:

  1.在 Nacos Spring Cloud 中,dataId 的完整格式如下:

1

${prefix}-${spring.profile.active}.${file-extension}

  • prefix 默认为所属工程配置spring.application.name 的值(即:nacos-provider),也可以通过配置项 spring.cloud.nacos.config.prefix来配置;

  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型;默认为 properties ;

 

  即 dataId 为 配置所属工程的spring.application.name的值 + "." + properties/yml;

  官方文档:

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

  https://github/alibaba/spring-cloud-alibaba/wiki/Nacos-config

  2.配置内容:

  项目中易变的内容

  • 从配置中心读取配置

  添加依赖:

1

2

3

4

5

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

    <version>2.1.2.RELEASE</version>

</dependency>

  版本说明 https://github/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

  在 bootstrap.yml中配置 Nacos server 的地址和应用名

1

2

3

4

5

6

7

spring:

  cloud:

    nacos:

      server-addr: 127.0.0.1:8848

  # 该配置影响统一配置中心中的dataId,之前已经配置过

  application:

    name: nacos-provider

  注意:bootstrap.yml添加了spring.application.name,在appliation.yml不需要再添加;

  之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。在springboot工程中,bootstrap.properties的加载优先级更高

1

2

3

4

5

6

7

8

9

10

11

12

@RefreshScope

@RestController

public class ProviderController {

 

    @Value("${DevConfig}")

    private String devConfig;

 

    @GetMapping("invoke")

    public String invoke() {

        return LocalTime.now() + " invoke,devConfig:" + devConfig;

    }

}

  调用结果:

  

 

  • 名称空间切换环境

  在实际开发中,通常有多套不同的环境(默认只有public),那么这个时候可以根据指定的环境来创建不同的 namespce,例如,开发、测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。以此来实现多环境的隔离;

 

  可以发现有四个名称空间:public(默认)以及我们自己添加的3个名称空间(prod、dev、test),可以点击查看每个名称空间下的配置文件,当然现在只有public下有一个配置。

  默认情况下,项目会到public下找 服务名.properties文件。

  接下来,在dev名称空间中也添加一个nacos-provider.properties配置。这时有两种方式:

  1. 切换到dev名称空间,添加一个新的配置文件。缺点:每个环境都要重复配置类似的项目

  2. 直接通过clone方式添加配置,并修改即可(推荐)

  

 

   编辑  

在服务提供方nacos-provider中切换命名空间,修改bootstrap.yml添加如下配置

1

2

3

4

5

spring:

  cloud:

    nacos:

      config:

        namespace: 288ad42c-c8e0-4b92-b8df-7d7883ad8507

   namespace的值为:

重启服务,调用结果:

  

 

  • 回滚配置

  

 

 

  • 加载多配置文件

  偶尔情况下需要加载多个配置文件。假如现在dev名称空间下有三个配置文件:nacos-provider.properties、redis.properties、jdbc.properties

 

  

 

  

 

  nacos-provider.properties默认加载,怎么加载另外两个配置文件?

  在bootstrap.yml文件中添加如下配置:

1

2

3

4

5

6

7

8

9

10

spring:

  cloud:

    nacos:

      server-addr: 127.0.0.1:8848

      config:

        extension-configs:

          - refresh: true

            data-id: redis.properties

          - refresh: true

            data-id: jdbc.properties

  修改上面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

@RefreshScope

@RestController

public class ProviderController {

 

    @Value("${DevConfig}")

    private String devConfig;

 

    @Value("${jdbc.url}")

    private String jdbcUrl;

 

    @Value("${redis.url}")

    private String redisUrl;

 

    @GetMapping("invoke")

    public String invoke() {

        return LocalTime.now() + " invoke,devConfig:" + devConfig +

                ",jdbcUrl:" + jdbcUrl + ",redisUrl:" + redisUrl;

    }

}

  

 

  • 配置的分组

  在实际开发中,除了不同的环境外。不同的微服务或者业务功能,可能有不同的redis及mysql数据库,也就说每个微服务项目可能会有相应的开发环境,测试环境,预发环境,生产环境等;

  区分不同的环境我们使用名称空间(namespace),区分不同的微服务或功能,使用分组(group)

  也可以反过来使用,名称空间和分组只是为了更好的区分配置,提供的两个维度而已;

  新增一个redis.properties,所属分组为nacos-provider:

 

  现在开发环境中有两个redis.propertis配置文件,一个是默认分组(DEFAULT_GROUP),一个是provider组

  默认情况下从DEFAULT_GROUP分组中读取redis.properties,如果要切换到nacos-provider分组下的redis.properties,需要修改如下配置:

1

2

3

4

5

6

7

8

9

10

11

spring:

  cloud:

    nacos:

      server-addr: 127.0.0.1:8848

      config:

        extension-configs:

          - refresh: true

            group: nacos-provider

            data-id: redis.properties

          - refresh: true

            data-id: jdbc.properties   

  

————————————————————————————

原文地址1:https://wwwblogs/coder-zyc/p/12821732.html

原文地址2:https://wwwblogs/coder-zyc/p/12821777.html

原文地址3:https://wwwblogs/coder-zyc/p/12821932.html

 

更多推荐

(十二)Nacos 入门教程