springcloud遇到的各种配置问题

前言

写这篇文章,主要是为了记录springcloud相关组件做相关处理如动态刷新配置等所出现的问题,可能因版本不同,所以遇到的情况也不一样,这里每个问题的记录都会标记期对应的版本信息,以供参考。

SpringCloud Config配置动态刷新时/actuator/refresh不生效

版本说明

这里使用的是以下springcloud版本

    <!--F版本的SpringCloud要配合2.0.2.RELEASE的spring-boot,不然会报"configua***类的错误",导致启动不了-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

一般要刷新配置,客户端的相关类要添加@RefreshScope注解,如下

@RestController
@RefreshScope//控制器类添加一个动态刷新是对@Value起作用的,configInfoProperties的是在它的类里添加
public class ConfigController {
    @Autowired
    private ConfigInfoProperties configInfoProperties;
    @Value("${demo.value}")
    private String value;
    @GetMapping("/getmsg")
    public String getMsg(){
        System.out.println("value: "+value);
        System.out.println("this config is: "+configInfoProperties.getConfig());
        return configInfoProperties.getConfig();
    }
}

对于配置类,在配置类上方直接添加@RefreshScope即可

@Component
@RefreshScope
@ConfigurationProperties(prefix = "cn.springcloud.book")
public class ConfigInfoProperties {
    private String config;

    public String getConfig() {
        return config;
    }

    public void setConfig(String config) {
        this.config = config;
    }
}

注意:我这里是以github作为配置中心的,所以有关连接github的配置参考https://blog.csdn.net/esunlang/article/details/113791467即可,代码是同步的。
此时在浏览器请求以下地址:
http://localhost:9000/actuator/refresh
可能你会遇到404 405 或者不支持GET请求,这时按以下配置来解决
首先确定自己项目的pom是否有添加了以下依赖

其次确定配置项,配置文件为yml时请按以下方式配置,注意配置的是""
management:
endpoints:
web:
exposure:
include: "
"

如果是properties的,则网上也有相关的说明,这里不演示,大概是说配置以下信息就可以了。
management.endpoints.web.exposure.include=*

上述两种配置文件的配置项一个是"" 一个是 * 起初我是在yml文件按照 * 直接配置,但是不生效,所以就改为第一种 ""

另外一种配置,也可以在yml配置文件里的include 配置项写成 refresh,这个配置是通过查看以下文章得到的信息
https://www.cnblogs.com/asaltydog/p/13505491.html,感谢作用的文章。

management:
endpoints:
web:
exposure:
include: refresh

刷新请求方式说明

要使用post请求,如果直接用浏览器请求,是GET请求,这时可以使用自己电脑WIN系统的cmd按以下发送,可以看到配置项更新了哪一个配置,它就会显示哪一个配置项内容:
springcloud遇到的各种配置问题

动态刷新的原理

添加@RefreshScope,相当于是这个注解下的类会重新创建bean,且是懒加载的,使用时初始化。
执行前先请求一次 curl http://localhost:9000/getmsg ,确定没有=创建ConfigInfoProperties=这一行输出,之后再请求刷新请求curl http://localhost:9000/actuator/refresh -X POST ,此是还是没输出=创建ConfigInfoProperties= ,说明刷新时是没有初始化这个类的,之后再请求curl http://localhost:9000/getmsg,发现输出了,所以这是由于懒加载的原因。
springcloud遇到的各种配置问题

上一篇:HTTP学习笔记


下一篇:Spring的refresh()方法相关异常