首先暴露问题,然后提出解决方案。先来看下微服务架构中,关于配置文件的一些问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  2. 配置文件无法区分环境。微服务项目可能会有多个环境。例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置一般情况下是不同的。打个比方,出个包更新到预发布环境,还得把配置改好了才能进行,很痛苦。
  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

基于上述这些问题,我们就需要配置中心的加入来解决问题。

配置中心的思路是:

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
  • 微服务来配置中心拉取自己的配置。
  • 当配置中心里面的参数有更新时,也能通知到各个微服务实时的过来同步最新的信息,使之动态更新。

当加入服务配置中心之后,系统架构图变成了下面这样:

下面介绍使用Nacos Config作为服务配置中心。其实就是将Nacos当做一个服务器,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在Nacos上,然后各个微服务从Nacos上拉取配置即可。

目录

一、搭建Nacos环境

二、在微服务中引入nacos config的依赖

三、在微服务中添加nacos config的配置

四、在nacos中添加配置

五、配置动态刷新

六、配置共享

6.1 同一个微服务的不同环境之间共享配置

6.2 不同微服务之间共享配置


一、搭建Nacos环境

关于Nacos环境的搭建,这里不再赘述,参考另外一篇博文:Nacos入门

二、在微服务中引入nacos config的依赖

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

三、在微服务中添加nacos config的配置

注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件

配置文件优先级(由高到低):

bootstrap.properties > bootstrap.yml > application.properties > application.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   # Nacos配置中心的地址
        file-extension: yaml  # 配置的格式
  profiles:
    active: dev # 环境标识

四、在nacos中添加配置

五、配置动态刷新

上述操作已经实现了配置的远程存放和拉取。但是如果此时修改了配置,我们的程序是无法读取到的。因此,我们需要开启配置的动态刷新功能。

为了方便测试,在nacos中的service-product-dev.yaml配置项中添加以下配置,用于后续打印输出。

config:
  appName: jack-product
  gender: man

方式一:硬编码方式(此方式默认就支持动态刷新,但是不够简洁,不推荐)

package cn.jack.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nacos/config")
public class NacosConfigController {

    @Autowired
    private ConfigurableApplicationContext configurableApplicationContext;
    
    @RequestMapping("/test1")
    public String test1() {
        return this.configurableApplicationContext.getEnvironment().getProperty("config.appName");
    }
}

 

方式二:注解方式(推荐)

package cn.jack.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nacos/config")
@RefreshScope   // 注解方式读取配置,如果需要动态更新,需要加上此注解
public class NacosConfigController {

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

   
    @RequestMapping("/test2")
    public String test2() {
        return gender;
    }
}

 

六、配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就需要考虑能不能将公共配置提取出来,然后实现共享呢?当然是可以的。接下来演示如何实现这一功能。

6.1 同一个微服务的不同环境之间共享配置

如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。

只需要提取一个以spring.application.name命名的配置文件,然后将所有环境的公共配置放在里面即可。

第一步:新建一个名为service-product.yaml配置,用于存放商品微服务的公共配置

第二步:新建一个名为service-product-test.yaml的配置,用于存放测试环境的配置

第三步:修改service-product-dev.yaml的配置,存放开发环境独有的配置

第四步:进行测试


package cn.jack.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nacos/config")
@RefreshScope   // 注解方式读取配置,如果需要动态更新,需要加上此注解
public class NacosConfigController {

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

   
    @RequestMapping("/test2")
    public String test2() {
        return gender;
    }
}

 

启动微服务,访问测试

接下来,修改bootstrap.yml中的配置,将active修改为test,再次访问测试,观察输出结果

6.2 不同微服务之间共享配置

不同微服务之间共享配置的原理,类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。

1 在nacos中定义一个DataId为all-service.yaml的配置,用于所有微服务共享

2 修改微服务的bootstrap.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848   # Nacos配置中心的地址
        file-extension: yaml  # 配置的格式
        shared-dataids: all-service.yaml  # 要引入的配置
        refreshable-dataids: all-service.yaml # 动态刷新时也刷新引入的配置
  profiles:
    active: test # 环境标识

 

3 添加测试方法

package cn.jack.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/nacos/config")
@RefreshScope   // 注解方式读取配置,如果需要动态更新,需要加上此注解
public class NacosConfigController {
    
    @Value("${test.name}")
    private String name;

    

    @RequestMapping("/test3")
    public String test3() {
        return name;
    }
}

 

4 启动微服务进行测试

 

 

 

 

 

 

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐