Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇

简介: Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇

de4bd6dffc7b42c68c8d576ff4cab6bd.png6735aa4777de402592fbe82e8b40ee3d.png

Nacos配置中心基础概念


https://nacos.io/zh-cn/docs/concepts.html


在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。


配置服务 (Configuration Service)


在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。


配置管理 (Configuration Management)


在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。


配置项


一个具体的可配置的参数与其值域,通常以 param-key=param-value 的形式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。


配置集


一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。


配置集 ID


Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。


配置分组


Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。


配置快照


Nacos 的客户端 SDK 会在本地生成配置的快照。当客户端无法连接到 Nacos Server 时,可以使用配置快照显示系统的整体容灾能力。配置快照类似于 Git 中的本地 commit,也类似于缓存,会在适当的时机更新,但是并没有缓存过期(expiration)的概念。



43bc3b2613264e35996ca7e5744f3a51.png



配置中心的核心功能


  • 不同环境不同配置
  • 配置属性动态刷新


实现配置中心要解决的问题


3149f2beaeff4918b1b01115b2bc7d4e.png



我们看看上图,由几个问题要解决

  • 微服务怎么知道配置中心的地址 ?
  • 微服务到底需要连接哪个环境 ?
  • 怎么找到nacos config上的对应的配置文件 ?



微服务接入配置步骤


我们建立一个工程 artisan-cloud-nacos-config ,假设这个工程 要从配置中心上拉取配置 。

不要被这个工程的名字给迷惑了,其实就是我们普通的微服务,比如ORDER 、PRODUCT服务要接入配置中,就需要这么搞


Step1 搞依赖包

   <!--加入nocas-client-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 配置中心nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
        </dependency>


Step2 搞配置文件

编写配置文件,需要写一个bootstrap.yml配置文件

spring:
  cloud:
    nacos:
      config:  # 这里是 config , 服务注册的这个地方是 discovery
        server-addr: 1.117.97.88:8848
        file-extension: yml
  application:  # 表示当前微服务需要向配置中心索要artisan-config-center的配置
    name: artisan-config-center
  profiles: # 表示我需要向配置中心索要artisan-config-center的开发环境的配置
    active: dev


server-addr: 1.117.97.88:8848 表示我微服务怎么去找我的配置中心

spring.application.name=artisan-config-center 表示当前微服务需要向配置中心索要artisan-config-center的配置

spring.profiles.active=dev表示我需要向配置中心索要artisan-config-center的dev环境的配置


索要文件的格式为


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


同样的,我们这个服务也要注册到Nacos


f05836be645248ad947ac353598f3692.png


Step3 Nacos Config 增加配置

03e3867e4cf441fd9bfc6fa4515b00c7.png


a2cad2578d114ba798eeb46ba49ebdc7.png


新建配置

0f2676ea656c4a5f9d58ccfb823340bb.png

Step4 验证

启动服务,观察日志

2022-02-04 12:37:50.945  INFO 14772 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:
    port: 5678
2022-02-04 12:37:50.948  INFO 14772 --- [           main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='artisan-config-center-dev.yml'}, NacosPropertySource {name='artisan-config-center.yml'}, NacosPropertySource {name='artisan-config-center'}]}

image.png


Another 栗子 (不停机生效新值)

业务场景


我们有个新业务上线, 业务需要,保留原来老逻辑的代码,所有我们打算搞个一个开关变isNewPath 来控制,为了以防万一,如果新功能上了生产后,发现有bug,怎么做到修改isNewBusi的值不需要重启 ?


Step1 Nacos Config 新增配置项


在上个工程的基础上,我们来增加这个功能


54c88a1559f44864bb1d7f647a4d5c5f.png

Step2 @Value 解析对应的值

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
@Slf4j
public class OrderInfoController {
    @Value("${isNewPath}")
    private Boolean isNewPath;
    @RequestMapping("/selectOrderInfoById/{orderNo}")
    public Object selectOrderInfoById(@PathVariable("orderNo") String orderNo) {
        log.info("是否业务走新逻辑:{}", isNewPath);
        if (isNewPath) {
            return "查询订单执行新逻辑->execute new logic : " + orderNo;
        }
        return "查询订单执行老逻辑->execute old logic : " + orderNo;
    }
}


Step3 Controller上添加@RefreshScope进行动态刷新

6519e7e7caf84247b90e08c6bbbc9518.png


Step4 验证

启动服务,观察拉取的配置中心的配置项

2022-02-04 13:30:27.453  INFO 21040 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:
    port: 5678
# 是否走新业务逻辑的开关
isNewPath: true     


我们看到是true , 访问下试试呢


fa3ea9d38b6a446b8d5b80d117c62bbe.png

Nacos Config上修改值为false ,观察日志,重新测试


cdafeb3768aa4f12abc005b516452c06.png


看下应用的日志

2022-02-04 13:32:29.234  INFO 21040 --- [.117.97.88_8848] o.s.cloud.commons.util.InetUtils         : Cannot determine local hostname
2022-02-04 13:32:29.273  INFO 21040 --- [.117.97.88_8848] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$de53a9bf] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2022-02-04 13:32:30.791  INFO 21040 --- [.117.97.88_8848] o.s.cloud.commons.util.InetUtils         : Cannot determine local hostname
2022-02-04 13:32:30.884  WARN 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[artisan-config-center] & group[DEFAULT_GROUP]
2022-02-04 13:32:30.952  WARN 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder     : Ignore the empty nacos configuration and get it based on dataId[artisan-config-center.yml] & group[DEFAULT_GROUP]
2022-02-04 13:32:31.012  INFO 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:
    port: 5678
# 是否走新业务逻辑的开关
isNewPath: false     
2022-02-04 13:32:31.013  INFO 21040 --- [.117.97.88_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='artisan-config-center-dev.yml'}, NacosPropertySource {name='artisan-config-center.yml'}, NacosPropertySource {name='artisan-config-center'}]}
2022-02-04 13:32:31.014  INFO 21040 --- [.117.97.88_8848] o.s.boot.SpringApplication               : The following profiles are active: dev
2022-02-04 13:32:31.023  INFO 21040 --- [.117.97.88_8848] o.s.boot.SpringApplication               : Started application in 3.29 seconds (JVM running for 128.768)
2022-02-04 13:32:31.040  INFO 21040 --- [.117.97.88_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [isNewPath]


已经获取到了最新值 , isNewPath: false ,并且 Refresh keys changed: [isNewPath]

我们不重启应用,直接访问


4253267f4ff9480896b1bd5694dcd5e0.png


咦,不停机走了老逻辑


源码


https://github.com/yangshangwei/SpringCloudAlibabMaster


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
9月前
|
人工智能 JSON API
Nacos 发布 MCP Registry,实现存量应用接口“0改动”升级到 MCP 协议
MCP(Model Calling Protocol)生态快速发展,Nacos作为MCP Registry,通过与Higress网关结合,实现“0代码”将存量API转化为MCP协议接口。本文详细解析了Nacos如何快速构建MCP Server,包括工具列表暴露、协议转换原理及优势。同时,通过高德API实例演示“0改动”适配流程。Nacos 3.0正式发布,定位AI应用服务管理平台,支持动态服务发现与配置管理,助力MCP生态发展。欢迎参与社区共建!
1595 1
|
监控 持续交付 调度
Nacos支持哪些应用场景
Nacos支持哪些应用场景
|
9月前
|
存储 人工智能 测试技术
Nacos托管LangChain应用Prompts和配置,助力你的AI助手快速进化
AI 应用开发中,总有一些让人头疼的问题:敏感信息(比如 API-KEY)怎么安全存储?模型参数需要频繁调整怎么办?Prompt 模板改来改去,每次都得重启服务,太麻烦了!别急,今天我们就来聊聊如何用 Nacos 解决这些问题。
|
算法 安全 Java
微服务(四)-config配置中心的配置加解密
微服务(四)-config配置中心的配置加解密
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
277 3
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
774 0
|
前端开发 JavaScript
vite vue3 config配置
【10月更文挑战第5天】
682 0
|
网络协议 Java Nacos
Nacos的应用
Nacos的应用
235 0
|
9月前
|
存储 Kubernetes 安全
Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置
无论是使用 Nacos-Controller 实现配置的双向同步,还是直接在应用中接入 Nacos SDK 以获得更高级的配置管理特性,都能显著提升配置管理的灵活性、安全性和可维护性。使用 Nacos,您能够更好地管理和优化您的应用配置,从而提高系统的稳定性和可靠性。
789 49