3.服务配置NacosConfig

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS Agent(兼容OpenClaw),2核4GB
简介: 3.服务配置NacosConfig

个人博客地址: https://blog.zjzaki.com/archives/1692275186701

1.服务配置中心介绍


首先我们来看一下,微服务架构下关于配置文件的一些问题:

  1. 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  2. 配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  3. 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

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

配置中心的思路是:

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

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

在业界常见的服务配置中心,有下面这些:

  • Apollo
    Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。
  • Disconf
    Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。
  • SpringCloud Config
    这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。
  • Nacos
    这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

2.Nacos Config入门


使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。接下来我们以商品微服务为例,学习nacos config的使用。

2.1.启动nacos

启动即可,不用改动

2.2.在shop-common引入依赖

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

2.3.在微服务service-product中添加nacos config的配置

注:

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

2)在bootstrap和application数据项相同时,bootstrap中的配置不会被覆盖;

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

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

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
  profiles:
    active: dev # 环境标识

说明:之所以需要配置 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来配置
  • spring.profiles.active:即为当前环境对应的 profile。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变
  • file-exetension:为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

配置完成之后,启动微服务shop-product并查看控制台日志信息:

2.4.在nacos中添加配置

点击右下角发布

**PS: **

1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示

2)配置文件格式要跟配置文件的格式对应,且目前仅仅支持YAML和Properties

3)配置内容按照上面选定的格式书写

3.Nacos Config深入


3.1.配置动态刷新

在入门案例中,我们实现了配置的远程存放,但是此时如果修改了配置,我们的程序是无法读取到的,因此,我们需要开启配置的动态刷新功能。

在service-product中添加NacosConfigController

package com.zjzaki.shopproduct.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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author zjzaki
 * @Package com.zjzaki.shopproduct.controller
 * @Date 2023-08-17 19:48:00
 */
@RestController
@RequestMapping("/nacos-config")
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
    @Autowired
    private ConfigurableApplicationContext applicationContext;
    /**
     * 1 硬编码方式
     * @return
     */
    @GetMapping("/test1")
    public String nacosConfingTest1() {
        return applicationContext.getEnvironment().getProperty("config.name");
    }
    @Value("${config.name}")
    private String appName;
    /**
     * 2 注解方式
     * @return
     */
    @GetMapping("/test2")
    public String nacosConfingTest2() {
        return appName;
    }
}

注入配置文件属性:@Value @ConfigurationProperties应的bean的后置处理器为ConfigurationPropertiesBindingPostProcessor,它是实现了BeanPostProcessor接口,在bean被实例化后,会调用后置处理,递归的查找属性,通过反射注入值,属性需提供其setter和getter方法。

测试

1.访问:http://localhost:8081/nacos-config/test1

2.访问:http://localhost:8081/nacos-config/test2

3.2.配置共享

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

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

如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。 只需要提取一个以spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可。

1.在nacos上新建一个service-product.yml配置存放商品微服务的公共配置

config:
  os: windows

2.在NacosConfigController中添加方法

//3 读取shop-product所有环境共享配置
@Value("${config.os}")
private String os;
@RequestMapping("/test3")
public String nacosConfingTest3() {
    return os;
}

3.访问:http://localhost:8081/nacos-config/test3

4.修改bootstarp.yml中的配置,将active设置成test,重启项目,再次访问

此时需要在nacos上新建一个service-product-test.yml

内容:

config:
    name: product_test

访问:http://localhost:8081/nacos-config/test3

3.3.不同微服务中间共享配置

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

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

config:
    mysql: 192.168.1.2:3306

3.3.2.修改bootstrap.yml

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
        shared-dataids: all-service.yaml # 配置要引入的配置
        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
  profiles:
    active: test # 环境标识

shared-dataids: all-service.yaml和refreshable-dataids: all-service.yaml已过时

可以使用以下取代

extension-configs[0]:
 data-id: all-service.yaml
 group: DEFAULT_GROUP
 refresh: true
shared-configs[0]:
 data-id: all-service.yaml
 group: DEFAULT_GROUP
 refresh: true   

extension-configs的优先级高于shared-configs

最终的配置

spring:
  application:
    name: service-product
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
        extension-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
        shared-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: test # 环境标识

3.3.3.在NacosConfigController中添加方法

@Value("${config.mysql}")
private String mysql;
@RequestMapping("/test4")
public String nacosConfingTest4() {
    return mysql;
}

3.3.4.启动商品微服务

访问:http://localhost:8081/nacos-config/test4

3.3.5.在shop-order中添加bootstarp.yml

spring:
  application:
    name: service-order
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yml # 配置文件格式
        extension-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
        shared-configs[0]:
          data-id: all-service.yml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: test # 环境标识

3.3.6.controller包下,添加NacosConfigController

package com.zjzaki.shoporder.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @Author zjzaki
 * @Package com.zjzaki.shoporder.controller
 * @Date 2023-08-17 20:17:37
 */
@RestController
@RequestMapping("/nacos-config")
@RefreshScope//只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {
    @Value("${config.mysql}")
    private String mysql;
    @RequestMapping("/test4")
    public String nacosConfingTest4() {
        return mysql;
    }
}

3.3.7.启动订单微服务

访问:http://localhost:8091/nacos-config/test4

发现可以正常读取all-service.yml中的配置,证明不同微服务之间共享配置

4.Nacos的几个概念


  • 命名空间(Namespace):命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
  • 配置分组(Group):配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
  • 配置集(Data ID):在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

4.1.创建命名空间(Namespace)

命名空间

spring:
  application:
    name: config-test
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
#        shared-dataids: all-service.yaml # 配置要引入的配置
#        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
        extension-configs[0]:
          data-id: all-service.yaml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev

spring:
  application:
    name: config-test
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        # 修改服务注册中的命名空间,默认是注册到public
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
        # 修改服力注到nacos上分组分称,默认是DEFAULT_GROUP
        group: shop_ex
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        file-extension: yaml # 配置文件格式
#        shared-dataids: all-service.yaml # 配置要引入的配置
#        refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置
        namespace: a4776bdc-6683-4d0f-a971-67553404c618
#        group: shop_ex
        extension-configs[0]:
          data-id: all-service.yaml
          group: DEFAULT_GROUP
          refresh: true
  profiles:
    active: dev

4.2.Nacos多环境切换

4.3.如何解决不同环境配置不同

4.4.如何解决不同环境配置相同

4.5.不同微服务相同配置共享

5.bootstrap


Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

什么配置在application配置?什么配置在bootstrap里面配置?

1、当使用 Spring Cloud Config Server 的时候,spring.application.name 和 spring.cloud.config.server.git.uri应该在 bootstrap.yml 里面指定

2、一些加密解密的配置也应该配置在bootstrap里面

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
安全 关系型数据库 MySQL
CentOS8 安装 MySQL8.0(RPM)
环境:Linux centos8 4.18.0-80.el8.x86_64、Mysql8.0.18
9126 0
|
Linux Docker 容器
Docker 容器抓包说明
正常情况下,操作系统层面可以通过 tcpdump 来抓包。但对于容器环境,根据所使用的 base 镜像的不同,容器内不一定含有抓包工具,所以无法直接抓包。本文简要介绍如何通过 ```nsenter``` 工具来对容器快速抓包。 # nsenter 工具介绍 nsenter 包含在绝大部分 Linux 发行版预置的 util-linux 工具包中。它可以进入指定进程的关联命名空间。包
9494 0
|
5月前
|
关系型数据库 应用服务中间件 Nacos
Nacos配置中心
本章介绍Nacos配置中心的实现,涵盖配置管理、热更新、共享配置及优先级规则,并演示Nacos集群搭建与高可用部署,帮助掌握微服务环境下配置统一管理的核心技能。
|
Java Nacos 数据安全/隐私保护
nacos启动问题之启动时连接报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
5335 100
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
35076 1
|
存储 SQL 安全
【赵渝强老师】达梦数据库的物理存储结构
本文介绍了达梦数据库的存储结构及各类物理文件的作用。达梦数据库通过逻辑和物理存储结构管理数据,包含配置文件(如dm.ini、sqllog.ini)、控制文件(dm.ctl)、数据文件(*.dbf)、重做日志文件(*.log)、归档日志文件、备份文件(*.bak)等。配置文件用于功能设置,控制文件记录数据库初始信息,数据文件存储实际数据,重做日志用于故障恢复,归档日志增强数据安全性,备份文件保障数据完整性,跟踪与事件日志辅助问题分析。这些文件共同确保数据库高效、稳定运行。
658 0
|
缓存 自然语言处理 数据挖掘
基于DeepSeek的智能客服系统优化与扩展:提升性能与功能
随着用户量增长和业务扩展,系统可能面临性能瓶颈和功能不足。本文探讨了性能优化(如数据库、缓存、异步处理)、功能扩展(如多语言支持、多渠道集成、智能推荐)及持续改进(如用户反馈、A/B测试、数据分析)的方法,以提升用户体验和系统效率。通过这些措施,可以打造更高效、更智能的客服系统。
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
存储 负载均衡 算法
SpringBoot集成Nacos-服务注册篇
SpringBoot集成Nacos-服务注册篇
2249 0