关于 Spring Cloud Config
Spring Cloud Config 用于跨多个应用程序和环境存储和提供分布式配置。 此配置存储理想地在Git版本控制下进行版本管理,并且可以在应用程序运行时进行修改。虽然它非常适合使用所有支持的配置文件格式以及Environment、PropertySource 或 @Value等结构的 Spring 应用程序,但它可以在运行任何编程语言的任何环境中使用。Nacos
Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos常见的配置类型:
服务配置:数据库配置、缓存配置、消息队列配置
开关配置:功能开发、业务开关、服务开关
业务配置:模块A、模块B
Nacos 官网地址
https://nacos.io/docs/v2/quickstart/quick-start/
https://nacos.io/download/release-history/
Nacos四大功能
服务发现和服务健康检查
Nacos使服务更容易注册自己并通过DNS或HTTP接口发现其他服务。Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序和服务的需要,这使配置更改更加高效和灵活。动态DNS服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。服务和元数据管理
Nacos提供易于使用的服务仪表板,可帮助您管理服务元数据,配置,kubernetes DNS,服务运行状况和指标统计。
Nacos Config 配置中心
官网 https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
pom.xml
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2021.1</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.1</version> </dependency>配置项参数
Nacos Config 配置项参数详解
https://www.cnblogs.com/ukzq/p/15952701.html
spring:cloud:nacos:discovery:# 服务注册地址server-addr:【ip:port nacos地址】group:【分组】namespace:【命名空间】 username:【nacos的用户名】 password:【nacos的密码】 config:# 配置中心地址server-addr:【ip:port nacos地址】# 配置文件格式file-extension:ymlgroup:【分组】 username:【nacos的用户名】 password:【nacos的密码】namespace:【命名空间】# 共享配置shared-configs:-data-id:【dataId】 refresh:trueconfig:import:-optional:nacos:【dataId】refresh-enabled: false
refresh-enabled 是 Spring Cloud Alibaba Nacos 中用来控制 配置动态刷新 功能的总开关。
refresh-enabled: true(默认) → Nacos 配置变化时,应用会自动刷新 @Value 和 ConfigurationProperties 的值 refresh-enabled:false→ Nacos 配置变化时,应用不会刷新,必须重启才能生效#关闭或减少 Nacos 轮询日志logging: level: com.alibaba.nacos.client.config.impl.ClientWorker: WARN#效果:只打印错误和警告,不再打印 config changed 和 [polling-resp] 等 INFO 日志,不影响配置拉取功能三 部署
Controller
@RefreshScope支持Nacos的动态刷新功能,实现配置自动更新。
@RefreshScope@RestControllerpublicclassNacosConfigClient{@Value("${config.info}")privateStringconfigInfo;@GetMapping("/config/info")publicObjectgetConfigInfo(){System.out.println("get config info: "+configInfo);returnconfigInfo;}}启动类
@EnableDiscoveryClient @SpringBootApplication public class Consummer_8021_Application { public static void main(String[] args) { SpringApplication.run(Consummer_8021_Application.class); } }Nacos配置
启动nacos
在CMD窗口 startup.cmd -m standalone
编辑配置
在 Nacos Spring Cloud 中,dataId 的完整格式:${prefix}-${spring.profiles.active}.${file-extension}
选择YAML配置
bootstrap.yml
bootstrap.yml 优先级高于application.yml
server: port: 8021 spring: application: name: nacosconfig cloud: nacos: server-addr: localhost:8848 config: file-extension: yml #指定yml格式的配置在 application.yml
spring: profiles: active: dev启动服务
请求接口,日志中可看到获取的信息
(完)
nacos的命名空间&组
配置文件 加载顺序
bootstrap.yml > application.yml > spring.application.name-profile.yml
如果多个yml文件出现同一属性,后加载的会覆盖先加载的(配置服务采用native方式时,此文件默认位于configServer的resources/config目录下)。
配置文件 application 和 bootstrap 的区别
applcation.yml是用户级资源配置,bootstrap.yml是系统级(优先级高); SpringCloud会创建一个"Bootstrap Context",作为Spring应用的"Application Context"的父上下文; 初始化的时候,Bootstrap Context负责从外部加载配置属性并解析配置; Bootstrap Context 与 Application Context共享一个从外部获取的Environment; Bootstrap Context有高优先级,默认情况下,不会被本地配置覆盖; Bootstrap Context 与 Application Context有着不同的约定,所以新增一个bootstrap.yml,保证Bootstrap Context 与 Application Context配置分离; bootstrap.yml 定义系统级别参数配置; 应用于: Spring Cloud Config 配置中心配置,加载外部配置中心的配置信息; 某些固定不被覆盖的属性; 某些加密/解密场景; application.yml 定义应用级别参数配置;应用于:SpringBoot项目配置。Nacos共享配置(shared-configs)和扩展配(extension-config)
日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config 也确实支持。https://www.jianshu.com/p/8715072d3f4c
使用Nacos做为配置中心,需要注意配置文件加载优先级问题。
@RefreshScope @RestController public class NacosConfigController { @Value("${env.name}") private String envName; @Value("${ios_push_key}") private String ios_push_key; @Value("${ios_push_bundle_id}") private String ios_push_bundle_id; @Value("${ios_push_file}") private String ios_push_file; @Value("${email_smtp_host:}") private String email_smtp_host; //公共配置: email @Value("${constant_name:}") private String constant_name; //常量配置 @PostConstruct public void initConfig(){ log.info("init nacos config, envName: {}", envName); log.info("init nacos config, ios_push_key: {}", ios_push_key); log.info("init nacos config, ios_push_bundle_id: {}", ios_push_bundle_id); log.info("init nacos config, ios_push_file: {}", ios_push_file); log.info("init nacos common config, email_smtp_host: {}", email_smtp_host); log.info("init nacos constant config, constant_name: {}", constant_name); } @GetMapping("/nacosConfig") public void nacosConfig(){ log.info("init nacos config ... envName: {}", envName); } }maven profiles 配置
<profiles> <profile> <id>prod</id> <properties> <env>prod</env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <env>test</env> </properties> </profile> </profiles> <build> <resources> <resource> <directory>src/main/resources/profile/${env}</directory> </resource> </resources> </build>nacos 基本使用及相关问题
403问题
这个问题是因为spring-cloud-starter-alibaba-nacos内置的nacos-client依赖版本太低,通过修改pom排除原来的nacos-client,引入更新的1.4.0+版本即可
在客户端指定namespace=public时,拿不到数据
解决:设置 namespace: 空 或注释掉 #namespace: public
修改登录密码
权限控制 > 用户管理
相关地址
Nacos服务配置中心-基础配置 https://www.jianshu.com/p/6aa313f5ce0c
Nacos 无法获取配置 https://blog.csdn.net/m0_57802508/article/details/125378118
Nacos无法实时刷新配置问题 https://blog.csdn.net/shinyolive/article/details/111402525
RefreshScope 刷新机制 https://blog.csdn.net/luqiang81191293/article/details/106678065
Nacos配置文件管理、微服务获取Nacos配置文件、热更新、配置共享、配置优先级等
https://blog.csdn.net/dayuiicghaid/article/details/126131768
其他
Spring Cloud 配置application.yml与bootstrap.yml
https://www.cnblogs.com/BlogNetSpace/p/16252618.html