SpringCloudAlibaba配置中心之Nacos应用实践

配置中心之Nacos应用实践

Nacos配置快速入门

创建项目

(1)创建maven项目

新建module,名字为sca-nacos-config,选中父项目01-sca,右键new->module其中的 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>01-sca</artifactId>
        <groupId>com.cy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sca-nacos-config</artifactId>

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

</project>
复制代码

(2)创建配置文件

在resource目录下创建bootstrap.yml配置文件(启动优先级最高)代码如下:

#bootstrap.yml加载的优先级要高于application.yml文件
server:
  tomcat:
    threads:
      max: 248
  port: 8080

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        group: DEFAULT_GROUP # Group, default is DEFAULT_GROUP
        file-extension: yml # Configure the data format of the content, default to properties
复制代码

(3)启动测试

创建启动类,对环境启动测试,代码如下

package com.cy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class NacosConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigApplication.class,args);
    }
}
复制代码

(4)Nacos基本配置

打开nacos配置中心,新建配置,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfhfZmLg-1622904728365)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622899269607.png)] 其中Data IDs的值要与bootstrap.yml中定义的spring.application.name的值相同(服务名-假如有多个服务一般会创建多个配置实例,不同服务对应不同的配置实例)。

(5)创建Controller处理器

创建配置中心Controller,也可以将Controller添加到启动类内部,如图所示:

package com.cy;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class NacosConfigApplication {

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

    @RefreshScope//支持配置动态刷新
    @RestController
    @RequestMapping("/config/")
    public class NacosConfigController{
        @Value("${logging.level.com.cy:info}")
        private String logLevel;

        @RequestMapping("/doGetLogLevel")
        public String doGetLogLevel(){
            return "Log level is "+logLevel;
        }
    }
}
复制代码

其中,@RefreshScope的作用是,在配置中心的相关配置发生变化以后,能够及时看到更新

Controller编写好以后,启动配置中心服务,然后进行访问测试。,打开浏览器直接在地址栏输入http://localhost:8080/config/doGetLogLevel,检测输出结果是否为我们配置中配置的信息,如图所示。

地址

http://localhost:8080/config/doGetLogLevel
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5wlLHeK-1622904728369)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900042352.png)]

因为内部使用了@RefreshScope注解支持配置动态刷新,所以在nacos中进行更改可以动态的改变配置 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05Q5gccC-1622904728371)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900087472.png)] 更改后配置,再次访问发现配置已经改变 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRWQ8RcM-1622904728373)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900222224.png)]

Nacos配置管理模型

Nacos 配置管理模型由三部分构成,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mLQXpiH2-1622904728375)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900575360.png)]

其中:

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
  • Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。

Nacos中的命名空间一般用于配置隔离,这种命名空间的定义一般会按照环境(开发,生产等环境)进行设计和实现.我们默认创建的配置都存储到了public命名空间,如图所示: 在这里插入图片描述 创建新的开发环境并定义其配置,然后从开发环境的配置中读取配置信息,该如何实现呢?

第一步:创建新命名空间,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nyg3fj5D-1622904728377)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622900937555.png)]命名空间成功创建以后,会在如下列表进行呈现。 命名空间成功创建以后,会在如下列表进行呈现。 在这里插入图片描述 在指定命名空间下添加配置,也可以直接取配置列表中克隆,例如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7d2eHBL-1622904728378)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901253266.png)]克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示: 克隆成功以后,我们会发现在指定的命名空间中有了我们克隆的配置,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBkyO2nv-1622904728379)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901723441.png)]

此时我们修改dev1命名空间中Data Id的nacos-config配置,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpJ9lsjh-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901813672.png)] 修改项目module中的配置文件bootstrap.yml,添加如下配置,关键代码如下:

去namespace中找NamespaceID,添加到配置文件中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JGHeYRXP-1622904728380)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622901994265.png)]

spring:
  cloud:
    nacos:
      config:
        namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xoi9BrSG-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622902051409.png)] 其中,namespace后面的字符串为命名空间的id,可直接从命名空间列表中进行拷贝,如图所示:

重启服务,继续刷新http://localhost:8080/config/doGetLogLevel地址。检测输出,看看输出的内容是什么,是否为dev命名空间下配置的内容,如图所示:

http://localhost:8080/config/doGetLogLevel
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ijwKMNrY-1622904728381)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622902139790.png)] 我们还可以创建生产环境,依次类推进行设计和实现即可。

分组设计及实现

当我们在指定命名空间下,按环境或服务做好了配置以后,有时还需要基于服务做分组配置,例如,一个服务在不同时间节点(节假日,活动等)切换不同的配置,可以在新建配置时指定分组名称,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0u5nZAH-1622904728382)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622903671504.png)] 配置发布以后,修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组,代码如下:

server:
  port: 8070
spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        group: DEV_GROUP_51 # Group, default is DEFAULT_GROUP
        file-extension: yml # Configure the data format of the content, default to properties
        namespace: 5c27fe4a-1141-4836-a14e-cbac77fb2130
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pXXOxSO-1622904728382)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622903764351.png)] 在NacosConfigController类中添加属性和方法用于获取和输出DEV_GROUP_51配置中设置的线程数,代码如下:

 		@Value("${server.tomcat.threads.max:200}")
        private Integer serverThreadMax;

        @RequestMapping("/doGetServerThreadMax")
        public String doGetserverThreadMax(){
            return "server.threads.max is  "+serverThreadMax;
        }
复制代码

然后重启服务,进行测试,检测内容输出,如图所示:

http://localhost:8080/config/doGetServerThreadMax
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYgB6Vlf-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622903861845.png)]

共享配置设计及读取

当同一个namespace的多个配置文件中都有相同配置时,可以对这些配置进行提取,然后存储到nacos配置中心的一个或多个指定配置文件,哪个微服务需要,就在服务的配置中设置读取即可。例如:

第一步:在nacos中创建一个共享配置文件,例如: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jVB4P4n-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904151351.png)] 第二步:在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取,例如:

见红色区域内容。

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        # 命名空间
        namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d
        # 分组名
        # group: DEFAULT_GROUP
        # 配置中心文件扩展名
        file-extension: yml
        # 共享配置
        shared-configs[0]:
                data-id: application-dev.yml
                group: DEFAULT_GROUP
                refresh: true #默认false
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-537ma25p-1622904728383)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904343791.png)] 第三步:在指定的业务类中读取和应用共享配置即可,例如:

		@Value("${page.pageSize:50}")
        private Integer pageSize;

        @GetMapping("/config/doGetPageSize")
        public String doGetPageSize(){

            System.out.println("page size is "+pageSize);
            return "page size is "+pageSize;
        }
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9iad5E8-1622904728384)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904498951.png)]

访问链接

http://localhost:8080/config/config/doGetPageSize
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wm8tvo3V-1622904728385)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622904586964.png)]

猜你喜欢

转载自juejin.im/post/7031188137640460295