Cloud Alibaba Nacos作为服务配置中心

一、Nacos代替Config作为服务配置中心

1、为了测试,我们创建新的module,cloudalibaba-config-nacos-client3377:

pom.xml:

<?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">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.jiguiquan.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloudalibaba-config-nacos-client3377</artifactId>

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

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

        <!--公共服务模块依赖-->
        <dependency>
            <groupId>com.jiguiquan.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--springboot项目web和actuator最好一起走-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--热部署devtools-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

2、配置文件:application.yml 和 bootstrap.yml

Nacos作为服务配置中心时,和springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动;

bootstrap.yml的优先级高于application.yml;

bootstrap.yml:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml

# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"

application.yml:

spring:
  profiles:
    active: dev

3、主启动类:NacosConfigClientMain3377.java:

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    }
}

4、业务类ConfigClientController.java:

@RestController
@RefreshScope  //为了自动动态刷新
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping(value = "/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

到这里,准备工作就做完了,在配置之前,重点记住匹配规则:

# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

# 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"


二、开始在Nacos中增加配置文件——无命名空间无分组情况

1、在Nacos的 配置管理——配置列表中,增加如下配置:

13.jpg

14.jpg

2、启动3377服务,进行测试:

访问地址: http://localhost:3377/config/info 

15.jpg

显然,配置信息正常被读取了,配置中心生效!

3、测试动态刷新配置信息,直接将配置文件中的version修改为version=2.0

别的什么都不要动,依旧访问上面的地址:

16.jpg

配置信息修改依旧生效,特别的方便,比SpringCloud Config + Bus方便很多;


三、Nacos配置中心中命名空间、分组、DataID 三者的关系

首先思考两个问题:

问题1:

实际开发中,通常一个系统会准备:dev、test、prod等环境,那么如何保证指定环境启动时,服务等到到对应环境的配置文件?

问题2:

一个大型的分布式微服务系统中,会有很多小的微服务项目;每一个微服务都会有自己的dev、test、prod环境的配置文件;

那该怎么对这些微服务的配置文件进行管理呢?

肯定得有类似于文件夹的分类功能吧!

1、先来看看Nacos作为配置中心的界面:

17.jpg

2、Namespace + Group + DataID 三者的关系?

这三者的关系设计,类似于Java中的 package名和类名;

Namespace :区分部署环境;

Group和DataID:逻辑上区分两个目标对象;

三者的情况如图:

18.jpg

Namespace:public

Group:DEFAULT_GROUP

默认的Cluster集群:DEFAULT

3、实际使用:

比如我们有三个环境:开发dev、测试test、生产prod,我们可以创建三个Namespace,不同的Namespace用以区分不同的环境,之间是隔离的;

上图中额Service就是一个服务,一个Service中可以包含多个Cluster集群,Nacos中默认的Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分;

比如为了容灾,我们可以将服务Service分别不再杭州机房和广州机房,这是我们就可以给杭州机房的微服务集群起名为HZ,将广州集群起名为GZ,还可以尽量让同一个机房的服务相互调用,以提高性能;

最后是Instance,就是微服务的单个实例;


四、综合使用Namespace + Group + DataID的Case

1、在命名空间下新建dev和test两个Namespace;

19.jpg

新建完成后,我们就能看到对应的命名空间ID,public(保留空间)是没有办法删除的;

2、然后,我们再在test 156b63d1-9ad3-4e42-bdc5-072549704f30 命名空间下,创建三个配置文件,他们分别属于三个不同的分组;

21.jpg

3、我们修改3377服务的配置文件bootstrap.yml:

增加namespace和group的配置:

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yaml
        namespace: 156b63d1-9ad3-4e42-bdc5-072549704f30
        group: DEV_GROUP

# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 这就是实际拼接好的配置文件的名称 "nacos-config-client-dev.yaml"

4、重启3377服务,继续访问上面的地址:

22.jpg

访问结果,与我们预期一致!


五、Nacos集群和持久化配置

上面的知识点都是很浅显的简单使用,而且使用的是Windows版的Nacos,单机部署,且配置信息没有持久化配置到我们制定的数据库,而是使用的Nacos本身自带的数据库;

这些显然是不可能满足实际生产需求的;

所以实际生产中我么肯定是要使用 Linux版 + 集群部署 + 指定数据库持久化数据;

由于这部分内容比较多,所以需要单独开一片文章讲解!

连接在此:http://www.jiguiquan.com/archives/943

个人此项目代码地址(持续更新):

https://github.com/jiguiquan/cloud2020

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐