微服务学习之Nacos(配置中心)

微服务系列

1、Nacus 服务搭建及使用
2、Nacos 配置中心
3、Nacos 服务注册与发现之OpenFeign服务间调用
4、Spring Security & Oauth2 认证授权
5、网关(Gateway / Sentinel)路由及熔断限流
6、网关(Gateway自定义断言和过滤器)



前言

在《Nacos之服务注册与发现》中,针对 Nacos 的服务发现与注册做了简单介绍,但是 Nacos 也可以作为配置中心。
之前用 Spring Config 作为配置中心来使用,我们需要借助 git 或者其他存储服务来存放我们的配置,但是 Nacos 作为配置中心,使用起来很简单,也很方便。
在 服务注册与发现 一文中,对 Nacos 的启动做了简单介绍,现在直接使用。

一、在Nacos中配置

首先我们需要在Nacos的 配置管理 > 配置列表中添加服务的配置,配置方式如下:

  1. 点击 + 号,会弹出配置信息窗口,我们可以在里面根据自己服务的需要进行添加配置。
    Nacos添加配置页面
  2. 在 新建配置 页面中,需要填入必须的几个配置参数,分别是 Data ID, Group 和 配置内容,如下图:

参数说明:
Data ID:就是我们的应用名称,也是 spring.application.name 的值 home-server。
Group:默认是 DEFAULT_GROUP,用于将我们的同一类配置文件区分管理,比如我把所有应用的本地测试环境配置都写到 local 组里面。
配置内容:就是我们需要配置的具体配置了,有多重配置方式可选,YAML 就是项目中的 yml 配置文件。

新建配置页面

二、服务中拉取配置

在 Nacos 配置页面配置好之后,我们需要在我们的应用中使用到这些配置,那就需要从配置中心拉取配置。

2.1 引入Nacos配置依赖

需要加入配置中心的依赖 jar 包,版本由父 pom 统一管理。

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

2.2 添加配置中心地址

虽说是配置都放在了 Nacos ,但是应用中还是要知道配置中心的地址才能去拉取服务需要的配置,但是配置中心的地址就不在 application.yml 中配置了,需要在 bootstrap.yml 中配置,因为 Spring Boot 加载配置是有优先级的,会 先加载 bootstrap.yml,然后在加载 application.yml 配置,所以在 application.yml 中的配置会负载从 Nacos 配置中心拉取到的配置。

2.3 测试在应用中拉取配置

写一个单元测试来测试是否成功拉取到配置,首先在 Nacos 中加入配置 test.value,如下图:
Nacos配置

测试类见下面,运行结果如图,已经拉取到了 test.value 的值了。

@SpringBootTest(classes = HomeApplication.class)
@RunWith(SpringRunner.class)
public class ConfigTest {

    @Value("${test.value}")
    private String value;

    @Test
    public void loadConfig(){
        System.out.println("拉去到配置 test.value 的值是:" + value);
    }
}

在这里插入图片描述

三、Config 配置说明

前面只对 Nacos 的配置中心使用做了简单的介绍,接下来对配置进行一个更深层次的说明。
Nacos 配置的 key 有三元素确定唯一性,Namespace 默认是空串,公共命名空间(Public,默认是 DEFAULT_GROUP),还有 Data ID / Service。

Nacos配置三要素确定唯一性

3.0 配置动态更新

动态刷新配置时,会把配置更新到 Environment 中,所以当没秒获取一次配置的值时,主要修改了 Nacos配置 中心的值时,就会获取到最新的配置。
代码如下:

@SpringBootApplication
@EnableFeignClients
public class HomeApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(HomeApplication.class, args);
        while (true){
            String testValue = context.getEnvironment().getProperty("test.value");
            System.out.println("动态获取到 test.value 的值是:" + testValue);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

获取到的配置打印如下图:

从截图中,可以看到先是打印 first, 当我从 Nacos 改成 second,则会立刻刷新配置并且拿到修改后的值。

打印动态更新配置

3.1 profile 粒度的配置

Nacos Config 在加载配置的时候,不仅加载了 Data ID是 {spring.application.name} . {file-extension:properties} 为前缀的配置,还加载了 {spring.application.name} . {profile} . {file-extension:properties} 为前缀的基础配置,在工作中都会遇到 dev, sit, uat, prod 等多个环境的时候,那么我们就可以用 ${spring.profiles.active} 参数来指定加载的配置。

注意:特别要注意,在 Nacos 添加类似 {spring.application.name} . {profile} . {file-extension:properties} 配置的时候,一定要注意需要在名称加上后缀,比如:user-server.yaml,不能省略掉后缀直接写成 user-server,这样是不会 Nacos Config 是不会加载到的,类似如下配置:

profile配置方式

bootstrap.yml 中添加如下配置,或者是在 启动是传入参数都行。

spring.profiles.active: sit 则指定读取 user-server-sit.yaml 配置。

spring:
  application:
    name: user-server
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        group: local
        file-extension: yaml
  profiles:
    active: sit

3.2 自定义Namespace配置

Namespace配置比较简单,只需要在 Nacos 命名空间新加一个空间名称(比如:localtest),然后在 bootstrap.yml 中指定 namespace 的 id 即可,配置如下:

spring:
  application:
    name: user-server
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: e0d82135-7163-4820-a8f5-24f434977fa1
        file-extension: yaml

3.3 Group配置

Group配置也简单,首先 Nacos 在新 添加配置 的时候,指定 group(默认是:DEVAULT_GROUP),然后在 bootstrap.yml 中指定 spring.cloud.nacos.config.group 即可。

3.4 自定义扩展的 Data ID 配置

Data ID 是组织划分配置的维度之一,Data ID 通常用于区分系统的配置集,每个配置集都可以被一个有意义的名称标识,通过自定义动态 Data ID 配置,可以解决多个应用之间共享配置的问题,还可以支持一个应用有多个配置文件。

3.4.1 共享配置

  1. 配置一个共享的配置集,配置如下:
    common.yaml配置集

  2. 在bootstart.yml 中配置如下:

配置一个 spring.cloud.nacos.config.shared-configs[0].data-id: common.yaml,组是默认值。

spring:
  application:
    name: user-server
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        group: local
        file-extension: yaml
        shared-configs[0]:
          data-id: common.yaml
          group: DEFAULT_GROUP
  1. 启动测试获取common.yaml配置集的值
@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(UserApplication.class, args);
        String property = context.getEnvironment().getProperty("env.name");
        System.out.println("当前环境为:" + property);
        String username = context.getEnvironment().getProperty("common.username");
        System.out.println(username);
    }

}

结果如下:
获取到了common.yaml配置

3.4.2 扩展配置

  1. 配置一个扩展的配置,如下:
    extension扩展配置
  2. 在bootstart.yml 中配置如下:
spring:
  application:
    name: user-server
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        group: local
        file-extension: yaml
        shared-configs[0]:
          data-id: common.yaml
          group: DEFAULT_GROUP
        extension-configs[0]:
          data-id: extension.yaml
          group: DEFAULT_GROUP
  1. 启动测试获取extension.yaml配置集的值
@SpringBootApplication
public class UserApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(UserApplication.class, args);
        String property = context.getEnvironment().getProperty("env.name");
        System.out.println("当前环境为:" + property);
        String username = context.getEnvironment().getProperty("common.username");
        System.out.println("获取到共享配置为:"+username);
        String productCode = context.getEnvironment().getProperty("extension.product");
        System.out.println("获取到扩展配置为:"+productCode);
    }
}

测试结果如下:
打印扩展配置

3.5 配置优先级

Nacos Config 提供了三种配置可从配置中心拉取到配置
1、通过内部相关规则(应用名、应用名+yaml)自动生成 Data ID 配置。
2、通过spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
3、通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
当三种方式同时存在是,它们的优先级为 1 > 2 > 3

优先级从高到低:
1、nacos-config-product.yaml 精准配置
2、nacos-config.yaml 同工程不同环境配置
3、 ext-config: 扩展配置
4、shared-dataids:共享配置

3.6 @RefreshScope 动态感知

此注解使用方便,只需要加到有 @Value() 的类上,就可以动态刷新被 @Value() 标注字段的值。

@RestController
@RequestMapping("/index")
@RefreshScope
public class IndexController {

    @Value("${user.token}")
    private String token;

    @GetMapping("config")
    public String config(){
        return token;
    }
}

修改 Nacos 配置的参数,token 的值就可以动态被刷新。

四、Nacos 数据库持久化配置

Nacos 默认是将配置存储到文件中,如果 Nacos 不搬家还行,但是 一旦 Nacos 移到别处或者是 服务器 出问题,那么你的配置则全部丢失,系统不就瘫痪了,而且 Nacos 如果是自动化部署指不定部署到那台服务,所以配置很容易丢失,那么就需要把 Nacos的配置持久化到指定的数据库才安心。

4.1 开启Nacos数据库配置

只需要开启 database 即可,这里有个坑的点就是,即使是 用户名 和 密码 配置错了,也会报 No Datasource set 错,所以要小心配置。
Nacos数据库配置

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值