<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Spring Cloud Config on 小蜜蜂</title>
        <link>https://xumf.net/tags/spring-cloud-config/</link>
        <description>Recent content in Spring Cloud Config on 小蜜蜂</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Tue, 11 Jun 2024 15:40:53 +0800</lastBuildDate><atom:link href="https://xumf.net/tags/spring-cloud-config/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Spring Cloud Config</title>
            <link>https://xumf.net/blog/springcloudconfig/</link>
            <pubDate>Tue, 11 Jun 2024 15:40:53 +0800</pubDate>
            <guid>https://xumf.net/blog/springcloudconfig/</guid>
            <description>&lt;h2 id=&#34;核心概念&#34;&gt;核心概念&#xA;&lt;/h2&gt;&lt;h3 id=&#34;1什么是-spring-cloud-config&#34;&gt;（1）什么是 Spring Cloud Config？&#xA;&lt;/h3&gt;&lt;p&gt;Spring Cloud Config 是分布式配置管理工具，用于集中管理微服务的配置文件。它解决的核心问题：微服务数量增加后，配置文件散落在各个服务中，修改一个配置需要逐个修改、重启。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2组成部分&#34;&gt;（2）组成部分&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Config Server&lt;/strong&gt;：配置中心服务器，从后端存储加载配置并通过 HTTP API 暴露&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Config Client&lt;/strong&gt;：配置客户端，启动时从 Config Server 拉取配置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3核心特性&#34;&gt;（3）核心特性&#xA;&lt;/h3&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;集中化管理&lt;/strong&gt;：所有微服务配置统一存储在 Git/SVN/本地等后端&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;动态刷新&lt;/strong&gt;：通过 &lt;code&gt;/actuator/refresh&lt;/code&gt; 或 Spring Cloud Bus 实现不重启更新配置&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;多环境支持&lt;/strong&gt;：通过 &lt;code&gt;spring.profiles.active&lt;/code&gt; 加载对应环境的配置（如 &lt;code&gt;application-dev.yml&lt;/code&gt;）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;：支持配置内容的加密和解密（对称 AES 或非对称 RSA）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;版本控制&lt;/strong&gt;：Git 后端天然具备版本历史、回滚、分支管理能力&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;权限控制&lt;/strong&gt;：通过 Git 仓库权限 + Config Server 的 Spring Security 双重控制&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;高可用&lt;/strong&gt;：Config Server 可集群部署，通过注册中心实现负载均衡&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;工作原理&#34;&gt;工作原理&#xA;&lt;/h2&gt;&lt;h3 id=&#34;config-server-配置解析路径&#34;&gt;Config Server 配置解析路径&#xA;&lt;/h3&gt;&lt;p&gt;Config Server 根据客户端请求的 &lt;code&gt;{application}/{profile}/{label}&lt;/code&gt; 路径解析配置。例如客户端请求 &lt;code&gt;/my-app/dev/master&lt;/code&gt;，Config Server 会在 Git 仓库中查找：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;my-app-dev.yml&lt;/code&gt;（应用名+环境）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;my-app.yml&lt;/code&gt;（应用名级配置）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;application-dev.yml&lt;/code&gt;（全局环境配置）&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;application.yml&lt;/code&gt;（全局默认配置）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;优先级：1 &amp;gt; 2 &amp;gt; 3 &amp;gt; 4（后面覆盖前面）。&lt;/p&gt;&#xA;&lt;h3 id=&#34;bootstrap-上下文&#34;&gt;Bootstrap 上下文&#xA;&lt;/h3&gt;&lt;p&gt;Spring Cloud Config Client 使用 &lt;strong&gt;bootstrap context&lt;/strong&gt;（由 &lt;code&gt;bootstrap.yml&lt;/code&gt; 或 &lt;code&gt;bootstrap.properties&lt;/code&gt; 配置），它在主应用上下文创建之前启动，负责：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;从 Config Server 拉取配置&lt;/li&gt;&#xA;&lt;li&gt;将拉取的配置设置为 &lt;code&gt;Environment&lt;/code&gt; 属性源&lt;/li&gt;&#xA;&lt;li&gt;然后才创建主应用上下文&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这就是为什么 Config Server 地址必须在 &lt;code&gt;bootstrap.yml&lt;/code&gt; 而非 &lt;code&gt;application.yml&lt;/code&gt; 中配置——主上下文启动时必须已经有远程配置可用。&lt;/p&gt;&#xA;&lt;h3 id=&#34;配置加载顺序&#34;&gt;配置加载顺序&#xA;&lt;/h3&gt;&lt;p&gt;Config Client 的配置优先级：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;bootstrap.yml&lt;/strong&gt;（配置 Config Server 地址和应用名）&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Config Server 返回的远程配置&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;本地的 application.yml&lt;/strong&gt;（作用被远程配置覆盖）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;配置详解&#34;&gt;配置详解&#xA;&lt;/h2&gt;&lt;h3 id=&#34;config-server-配置&#34;&gt;Config Server 配置&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.cloud&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-cloud-config-server&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;server&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;port&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;8888&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spring&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cloud&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;config&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;server&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;git&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;uri&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;https://github.com/your-repo/config-repo.git&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;search-paths&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;config-files&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;default-label&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;master        &lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 默认分支&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;                   &lt;span style=&#34;color:#75715e&#34;&gt;# Git 连接超时（秒）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;force-pull&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;              &lt;span style=&#34;color:#75715e&#34;&gt;# 拉取失败时强制覆盖本地&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@SpringBootApplication&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;@EnableConfigServer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ConfigServerApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        SpringApplication.&lt;span style=&#34;color:#a6e22e&#34;&gt;run&lt;/span&gt;(ConfigServerApplication.&lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;, args);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;config-client-配置&#34;&gt;Config Client 配置&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spring&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;application&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;my-app&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;cloud&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;config&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;uri&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;http://localhost:8888&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;profile&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;dev&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;label&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;master&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;# 失败快速响应（启动时连不上 Config Server 则直接启动失败）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;fail-fast&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;retry&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;initial-interval&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;multiplier&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1.5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;max-attempts&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;加密配置&#34;&gt;加密配置&#xA;&lt;/h3&gt;&lt;p&gt;Config Server 支持对配置内容加密，有两种方式：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;对称加密&lt;/strong&gt;：设置 &lt;code&gt;encrypt.key=your-secret-key&lt;/code&gt;，然后 POST 到 &lt;code&gt;/encrypt&lt;/code&gt; 端点获取密文&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;非对称加密&lt;/strong&gt;：配置 RSA 密钥对，将公钥给 Config Server，私钥用于解密&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;加密后的配置以 &lt;code&gt;{cipher}&lt;/code&gt; 前缀存储在 Git 中：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spring&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;datasource&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;password&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;{cipher}AQB...encrypted-string...&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;动态刷新机制&#34;&gt;动态刷新机制&#xA;&lt;/h2&gt;&lt;h3 id=&#34;手动刷新逐台刷新&#34;&gt;手动刷新（逐台刷新）&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST http://localhost:8080/actuator/refresh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只刷新当前实例，其他实例需要逐一调用。适用于：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;实例数量少&lt;/li&gt;&#xA;&lt;li&gt;分批蓝绿部署&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;全局刷新通过-bus&#34;&gt;全局刷新（通过 Bus）&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -X POST http://localhost:8888/actuator/bus-refresh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过消息中间件广播刷新事件，所有订阅的客户端同时刷新。&lt;/p&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;graph TD;&#xA;    A[Config Server 接收到刷新请求] --&gt; B[通过 RabbitMQ 发送刷新事件]&#xA;    B --&gt; C[Config Client 接收到刷新事件]&#xA;    C --&gt; D[RefreshScope.refreshAll]&#xA;    D --&gt; E[销毁 @RefreshScope 标记的 Bean]&#xA;    E --&gt; F[重新初始化 Bean]&#xA;    F --&gt; G[配置更新完成]&lt;/pre&gt;&lt;h3 id=&#34;refreshscope-的局限性&#34;&gt;@RefreshScope 的局限性&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;只对标注了 &lt;code&gt;@RefreshScope&lt;/code&gt; 的 Bean 有效，引用了该 Bean 的其他 Bean 不会自动重建&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;@ConfigurationProperties&lt;/code&gt; 类必须同时标注 &lt;code&gt;@RefreshScope&lt;/code&gt; 才能刷新&lt;/li&gt;&#xA;&lt;li&gt;静态变量不会随刷新更新&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;排查思路&#34;&gt;排查思路&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;客户端连不上 Config Server&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;检查 &lt;code&gt;bootstrap.yml&lt;/code&gt; 中的 &lt;code&gt;spring.cloud.config.uri&lt;/code&gt; 是否正确&lt;/li&gt;&#xA;&lt;li&gt;检查 Config Server 是否启动、网络是否可达&lt;/li&gt;&#xA;&lt;li&gt;配置 &lt;code&gt;fail-fast: true&lt;/code&gt; 和 &lt;code&gt;retry&lt;/code&gt; 可以在连接失败时快速感知&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;配置未更新&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Config Client 未添加 &lt;code&gt;@RefreshScope&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;调用 refresh 接口时请求体为空（应为 POST 而非 GET）&lt;/li&gt;&#xA;&lt;li&gt;配置在 Git 中已修改但 Config Server 缓存未刷新——设置 &lt;code&gt;spring.cloud.config.server.git.refresh-rate=0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;环境加载错误&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;检查 Git 仓库中的文件名格式：必须为 &lt;code&gt;{application}-{profile}.yml&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;default-label&lt;/code&gt; 分支名需要与 Git 仓库匹配&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;加密配置无法解密&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;检查 &lt;code&gt;encrypt.key&lt;/code&gt; 是否在 Config Server 端正确配置&lt;/li&gt;&#xA;&lt;li&gt;加密的文本首尾是否有 &lt;code&gt;{cipher}&lt;/code&gt; 前缀&lt;/li&gt;&#xA;&lt;li&gt;非对称加密时，确保公钥已在环境变量或文件配置中正确设置&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Config Server 性能问题&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Git 仓库过大会拖慢首次加载——使用 &lt;code&gt;spring.cloud.config.server.git.clone-on-start=false&lt;/code&gt;（首次访问时才克隆）&lt;/li&gt;&#xA;&lt;li&gt;每次请求都访问 Git 仓库有性能损耗——使用本地缓存或 &lt;code&gt;basedir&lt;/code&gt; 指向预克隆仓库&lt;/li&gt;&#xA;&lt;li&gt;高并发场景考虑配置强制 &lt;code&gt;skip-ssl-validation&lt;/code&gt; 或使用 SSH 而非 HTTPS 避免证书验证开销&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;</description>
        </item></channel>
</rss>
