springcloud-alibaba系列之nacos配置中心

在我们使用springcloud config实现配置中心的时候,具体流程如下:

配置中心.png
  • 第一步:在github上添加配置文件

  • 第二步:创建config server配置中心,从github上面读取配置文件,下载配置信息

  • 第三步:具体微服务从config server获取配置信息

感觉十分繁琐,并且我们如果要实现配置信息的时候更新,还需要使用总线bus实现配置的自动更新,也就是Spring Cloud Config+Spring Cloud Bus,Spring Cloud Bus是基于MQ的,支持Rabbitmq/Kafka,是Spring Cloud的消息总线方案

但是如果我们用nacos实现配置中心,github不需要了,并且实现配置信息的自动刷新bus也不需要了,因为这些nacos内部已经帮我们实现了配置信息的存储和配置信息的自动刷新,实现步骤如下:

  • 第一步:在nacos管理后台添加配置信息

  • 第二步:改造具体服务,使其成为nacos config client,能够从nacos server中获取具体的配置信息

Nacos配置管理添加配置

在nacos管理后台添加配置信息

进入nacos 管理页面配置管理,添加配置信息:

nacos新建配置文件.png

这样我们就新建好了一个配置信息,下面我们来搭建具体的nacos config client

Nacos config客户端搭建

  • 导入nacos config相关依赖


        
            com.dy.springcloud
            user-service-8090
            1.0-SNAPSHOT
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

    
  • 在服务中指定Nacos server中的配置文件(dataId)

具体配置如下:

server:
  port: 8081
spring:
  application:
    name: user-api
  #nacos相关配置
  cloud:
    nacos:
      #nacos注册中心相关配置
      discovery:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev   #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        register-enabled: true  #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
      #nacos服务中心相关配置
      config:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev  #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        group: user-api  #指定group 一般指定我们具体的项目服务
        file-extension: yaml #默认properties

我们怎么来锁定我们的配置文件呢?

一般是通过namespace+group+dataId来锁定配置文件,namespace如果不指定就是默认的public,group不指定默认就是DEFAULT_GROUP

之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

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

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

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

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

3)file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

  • 新建配置类
/**
 * @Description:
 * @author: dy
 * @Date: 2022/5/27
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "user")
//配置自动刷新
@RefreshScope
public class User {

    private String name;

    private Integer age;

}
  • 接口访问
/**
 * @Description:
 * @author: dy
 * @Date: 2022/5/25
 */
@RequestMapping(UserApi.MAPPING)
public interface UserApi {

    String MAPPING = "/api/user";

    @RequestMapping(value = "/get_user", method = RequestMethod.GET)
    String getUser();

}

@Slf4j
@RestController
public class UserController implements UserApi {

    @Autowired
    private UserClient userClient;
    @Autowired
    private User user;

    @Override
    public String getUser() {
        return "===姓名>>>"+user.getName()+"===年龄>>>"+user.getAge();
    }
}

启动服务访问结果如下:

nacos配置中心访问结果.png

我们去nacos配置中心修改内容后,刷新浏览器,结果也会跟着改变

上面是一个配置文件的情况,但我们项目开发过程中,一般我们一个项目可能是多个配置文件,比如引用了mysql、redis、es、mong。。。等等,下面我们来看看nacos怎么引用多个配置文件

Nacos多配置文件使用

  • 首先我们在nacos新建一个配置文件test-config.yaml:
nacos测试多文件配置.png
  • 在代码里面新增配置:
spring:
  application:
    name: user-api
  #nacos相关配置
  cloud:
    nacos:
      #nacos注册中心相关配置
      discovery:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev   #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        register-enabled: true  #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
      #nacos服务中心相关配置
      config:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev  #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        group: user-api  #指定group 一般指定我们具体的项目服务
        file-extension: yaml #默认properties
        #扩展的配置集合
        ext-config[0]:
          data-id: test-config.yaml
          group: user-api  #指定group,方便灵活配置
          refresh: true  #开启扩展dataId动态刷新

可以从上面的配置信息里面我们新增了ext-config[0],如果是新增多个就依次为ext-config[0],ext-config[1],ext-config[2]。。。。,而且每个新增配置类下面都要设置group,方便我们灵活配置,比如我们的配置类来自不同的group,并且还开增加refresh参数开启动态刷新功能,就不用在代码里面增加注解了

  • 在代码里面新增对应的实体类:
@Data
@Configuration
@ConfigurationProperties(prefix = "test")
public class TestConfig {

    private String phoneNumber;

    private String address;

}
  • 测试api如下:
@Slf4j
@RestController
public class UserController implements UserApi {

    @Autowired
    private UserClient userClient;
    @Autowired
    private User user;
    @Autowired
    private TestConfig testConfig;

    @Override
    public String getUserInfo() {
        return userClient.getUserId();
    }

    @Override
    public String getUser() {
        return "===姓名>>>"+user.getName()+"===年龄>>>"+user.getAge()+"===电话==>>"+testConfig.getPhoneNumber()+"==地址==>>"+
                testConfig.getAddress();
    }
}

启动服务访问结果如下:

nacos多配置文件测试.png

注:在这里我们要注意一个优先级问题,因为在一个项目中,如果我们使用多个配置文件,可能其中某个配置出现在了不同的配置文件中,那我们就要注意一个优先级问题,优先级如下:config第一级的优先级最高,ext-config[0]中数组下标越大,优先级越高

共享配置集

还有一种方式使用共享配置集实现拉取多文件配置,配置文件如下:

spring:
  application:
    name: user-api
  #nacos相关配置
  cloud:
    nacos:
      #nacos注册中心相关配置
      discovery:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev   #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        register-enabled: true  #是否往注册中心注册自己,默认为true (当我们本地开发的时候可以设置成false不往注册中心注册自己避免造成开发测试环境的混乱)
      #nacos服务中心相关配置
      config:
        server-addr: 127.0.0.1:8848 #nacos服务地址
        namespace: dev  #指定namespace 默认为public,一般我们使用分组是为了区分不同的环境如dev、test、beta。。。
        group: user-api  #指定group 一般指定我们具体的项目服务
        file-extension: yaml #默认properties
        #共享配置集
        shared-dataids: test-config.yaml    # 多个配置集逗号隔开
        refreshable-dataids: test-config.yaml  # 哪些配置集支持动态刷新

通过共享配置集的方式也可以实现公共配置的功能,唯一的区别就是共享配置集无法设置组信息,只获取默认DEFAULT_GROUP下面的配置文件,我们可以将一些公共的配置放到DEFAULT_GROUP,实现配置集共享

你可能感兴趣的:(springcloud-alibaba系列之nacos配置中心)