往期回顾

Nacos的安装与配置

Spring Cloud集成Nacos作为注册中心

LoadBalacer集成Nacos实现负载均衡

常见的负载均衡策略分析

Spring Cloud集成Dubbo实现RPC调用

前面我们已经介绍了Nacos 的安装与配置,Spring Cloud 集成Nacos 作为服务的注册中心,集成Nacos 实现服务的负载均衡和一些常见的负载均衡策略以及使用Dubbo进行RPC调用

接下来,我们将介绍如何使用Nacos 作为配置中心加载远程配制文件

配置中心

什么是配置中心?

配置中心,顾名思义,就是用来统一管理项目中所有配置的系统。

在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。

如果一个中型的项目,不采用配置中心的模式,一大堆的各类配置项,各种不定时的修改需求,一定会让开发同学非常头疼且管理十分混乱。所以,我们需要使用配置中心对这些配置进行集中管理。

一个合格的配置中心需要满足如下特性:

  • 配置项容易读取和修改
  • 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
  • 支持对配置的修改的检视以把控风险
  • 可以查看配置修改的历史记录
  • 不同部署环境下应用配置的隔离性

配置中心的作用

  1. 对配置文件进行集中管理,在不同的环境下或者不同配置中,可以对配置文件进行更新和部署
  2. 在程序的运行期间,可以对程序中的配置文件进行动态性调整。使用分布式配置中心,就不需要在每一台服务器上都进行配置文件的修改,只需要在总服务器中进行修改,系统就会向其他的服务器进行统一的修改配置
  3. 如果系统程序的配置发生了变动,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上
  4. 支持不同环境的隔离和切换

分布式配置中心作用有很多,这里仅仅简单罗列了几个最为常见的作用

Nacos Config

Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。

Nacos是Spring Cloud组件Spring Cloud Config的替代方案

Spring Cloud Config 分为服务端和客户端两个部分。服务端被称为分布式配置中心,它是个独立的应用,可以从配置仓库获取配置信息并提供给客户端使用。客户端可以通过配置中心来获取配置信息,在启动时加载配置。Spring Cloud Config 的配置中心默认采用Git来存储配置信息,所以天然就支持配置信息的版本管理,并且可以使用Git客户端来方便地管理和访问配置信息

快速开始

1.启动Nacos服务

如若还未启动Nacos请参见 Nacos的安装与配置

2.引入依赖

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

这里我遇见了一个bug,详细参见Param ‘serviceName‘ is illegal, serviceName is blank

这个bug出现的原因是我没有导入bootstrap的依赖,导入以下依赖即可

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

3.修改配制文件

修改application.yml ,启用的是dev环境的配置

spring:
  profiles:
    active: dev
server:
  port: 8081

添加bootstrap.yml ,主要是对Nacos的作为配置中心的功能进行配置:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.199.128:8848 #Nacos地址
      config:
        server-addr: 192.168.199.128:8848 #Nacos地址
        file-extension: yaml #这里我们获取的yaml格式的配置

management:
  endpoints:
    web:
      exposure:
        include: "*"

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:cuit/epoch/pymjl/mapper/xml/*.xml
  type-aliases-package: cuit.epoch.pymjl.entity
  

注意:

当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port

例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80注意 80 端口不能省略。

4.创建Controller

@RefreshScope 可以使Nacos 客户端运行过程中可以获取到配置中心配置的变化然后更新

package cuit.epoch.pymjl.controller;

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

/**
 * @author Pymjl
 * @version 1.0
 * @date 2022/8/31 20:15
 **/
@RestController
@RefreshScope
@RequestMapping("/config")
public class ConfigController {
    @Value("${config.info:default}")
    private String info;

    @GetMapping("/info")
    public String getInfo() {
        return info;
    }
}

5.基于 dataid 为 yaml 的文件扩展名配置方式

我们先来讲下Nacos中的dataid的组成格式及与SpringBoot配置文件中的属性对应关系:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

比如说我们现在要获取应用名称为user-service的应用在dev环境下的yaml配置,dataid如下:

user-service-dev.yaml

根据上面的命名方式在Nacos 控制台添加如下配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource 
    driver-class-name: com.mysql.cj.jdbc.Driver 
    url: jdbc:mysql://192.168.199.128:3306/cloud_learn?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    username: root 
    password: 123456 
    druid:
      initialSize: 10  
      minIdle: 10       
      maxActive: 100    
      maxWait: 60000    
      timeBetweenEvictionRunsMillis: 60000  
      minEvictableIdleTimeMillis: 30000     
      validationQuery: select 'x' 
      testWhileIdle: true    
      #通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall  
      filters: stat,wall 
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
      # 合并多个DruidDataSource的监控数据
      useGlobalDataSourceStat: false 
  cache:
    type: redis
  redis:
    host: 192.168.199.128
    port: 6379
    password: 123456
config:
  info: This is Nacos config test

dubbo:
  application:
    name: ${spring.application.name}
    logger: slf4j
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://192.168.199.128:8848
  config-center:
    address: nacos://192.168.199.128:8848
  metadata-report:
    address: nacos://192.168.199.128:8848
  consumer:
    validation: true
    timeout: 3000
    check: false
    loadbalance: roundrobin
  scan:
    base-packages: cuit.epoch.pymjl.controller

如图所示:

image-20220831211753978

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。

在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

开始测试

先启动服务,如图,启动成功

image-20220831211942240

访问接口测试

image-20220831212011609

接下来我们更改在Nacos 中的配置,然后发布更新

config:
  info: Changeing the nacos config

观察Spring的控制台输出

image-20220831212201318

再访问刚才的接口

image-20220831212222329

可见,配制文件完成了实时的动态更新,至此

关于Nacos的其他配置可参见官方文档

ngeing the nacos config


观察Spring的控制台输出

[外链图片转存中...(img-RvY46qND-1662117389530)]

再访问刚才的接口

[外链图片转存中...(img-5eS2GBg2-1662117389530)]

可见,配制文件完成了实时的动态更新,至此

关于Nacos的其他配置可参见[官方文档](https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config)

项目源码:[gitee](https://gitee.com/pymjl_0/cloud-learn)	[github](https://github.com/Pymjl/cloud-learn)
Logo

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

更多推荐