NACOS配置中心

219 阅读1分钟

题记

写这篇文章的时候遇到了很多问题,nacos版本换了1.4.2,其他的就按照下面的配置来就肯定可以。

快速应用配置中心

基本原理

spring启动会经历大概这么一个流程

graph TD
启动 --> 读取application配置文件 --> 创建容器 --> 加载bean

而nacos的配置读取优先级实际是大于application的配置,这时候就需要引入bootstrap.yaml

graph TD
启动 --> 读取bootstrap.yaml --> 连接至naocs读取配置 --> 读取application配置文件 --> 创建容器 --> 加载bean

开始搭建

  • 新建bootstrap.yaml文件,并且将properties配置转过来

image.png

server:
  port: 8081
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: 上海
        namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
        ephemeral: false
  application:
    name: student
  • pom引入nacos-conf
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>2021.0.1.0</version>
</dependency>
  • 正常往下走会报错,新版springcloud带出来的问题,需要多引一个pom
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  • nacos建立配置文件,namepase是test (DATA ID 要带着yaml后缀,下面的配置格式要选yaml,-test这种写法就是区分开发与测试环境的,跟springboot项目中的一个意思)

image.png

image.png

  • 在bootstrap.yaml引入刚才新建的配置文件
config:
  file-extension: yaml
  server-addr: 127.0.0.1:8848
  namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c

image.png

  • 新建controller去获取值
@RestController
@RequestMapping
public class TestController {
    @Value("${name}")
    public String name;

    @GetMapping("/hello/name")
    public String getName(){

        return name;
    }

}

image.png

配置文件命名匹配规则

通过这一串操作,也能看出来是这三个字段关联出nacos中实际的配置文件的,同时也是指定了namepase的命名空间 image.png

热配置

nacos带着两种热配置的方式,不需要重启项目就能将配置的修改应用起来

1.@RefreshScope

在引入@value的类上方添加该注解,这个不做过多演示了

image.png

2.@ConfigurationProperties

  • 先改一下配置文件中的参数

image.png

  • 将name作为参数放入一个实体类,并且扫描到spring容器中
@Component
@ConfigurationProperties(prefix = "hi")
public class Human {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 引用方式改成注入方式
@RestController
@RequestMapping
public class TestController {
    @Resource
    public Human human;

    @GetMapping("/hello/name")
    public String getName(){

        return human.getName();
    }

}

可以自己验证一下,这样就是热配置了。

@ConfigurationProperties 是springBoot提供的一种注解,nacos在此基础上做到了热配置

多服务共享配置

  • bootstrap增加共享的配置

image.png

shared-configs:
  - dataId: common.yaml
  • 新建配置文件(test下新建的)

image.png

  • controller增加代码
@Value("${hello.common}")
public String common;

@GetMapping("/hello/common")
public String getCommon(){

    return common;
}

image.png

  • 另一个项目也这样配置,就快速复制粘贴了
server:
  port: 8082
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        cluster-name: sh
        namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
        ephemeral: false
      config:
        file-extension: yaml
        server-addr: 127.0.0.1:8848
        namespace: 20c0e599-919c-483a-a3d7-c73eaf3b4e7c
        shared-configs:
          - dataId: common.yaml

  application:
    name: teacher

  profiles:
    active: test

代码

@RestController
@RequestMapping
public class TestController {

    @Value("${hello.common}")
    public String common;

    @GetMapping("/hello/common")
    public String getCommon(){

        return common;
    }
}

http://127.0.0.1:8082/hello/common

image.png