Spring Cloud中配置客户端示例详解

 更新时间:2023年09月19日 12:10:45   作者:进击的猿小白  
这篇文章主要介绍了Spring Cloud中配置客户端的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Environment

Environment : PropertySources = 1:1

PropertySources : PropertySource = 1:N

[0] PropertySource (Map)

spring.application.name = spring-cloud-config-client

[1] PropertySource (Map)

spring.application.name = spring-cloud-config-client-demo

Spring Boot 配置文件

application.properties 或 application.xml

加载器: PropertiesPropertySourceLoader

application.yml 或者 application.yaml

加载器: YamlPropertySourceLoader

Environment 端点

请求 URI : /env

数据来源: EnvironmentEndpoint

Controller 来源: EnvironmentMvcEndpoint

Bootstrap 配置

参考 BootstrapApplicationListener 实现

注:程序启动参数的加载逻辑:

SpringApplication#configurePropertySources()

Bootstrap 配置文件

String configName = environment.resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}");

spring.cloud.bootstrap.name 存在时,使用该配置项,否则,使用 "bootstrap" 作为默认

## application.properties
## 通过调整 spring.cloud.bootstrap.enabled = false,尝试关闭 bootstrap 上下文
## 实际测试结果,没有效果
spring.cloud.bootstrap.enabled = false

注意: BootstrapApplicationListener 加载实际早于 ConfigFileApplicationListener

原因是:

ConfigFileApplicationListener 的 Order = Ordered.HIGHEST_PRECEDENCE + 10(第十一位)

BootstrapApplicationListener 的 Order = Ordered.HIGHEST_PRECEDENCE + 5(第六位)

如果需要调整 控制 Bootstrap 上下文行为配置,需要更高优先级,也就是说 Order 需要 < Ordered.HIGHEST_PRECEDENCE + 5 (越小越优先),比如使用程序启动参数:

--spring.cloud.bootstrap.enabld = true

调整 Bootstrap 配置

调整 Bootstrap 配置文件名称

调整程序启动参数

--spring.cloud.bootstrap.name=spring-cloud

bootstrap 配置文件名称发生了改变"spring-cloud",现有三个文件:

application.properties

spring.application.name = spring-cloud-config-client

bootstrap.properties

spring.application.name = spring-cloud-config-client-demo

spring-cloud.properties

spring.application.name = spring-cloud

运行结果(部分):

"applicationConfig: [classpath:/application.properties]": {
    "spring.cloud.bootstrap.enabled": "false",
    "endpoints.env.sensitive": "false",
    "spring.application.name": "spring-cloud-config-client"
  },
  ...
  "applicationConfig: [classpath:/spring-cloud.properties]": {
    "spring.application.name": "spring-cloud-config-client"
  }

调整 Bootstrap 配置文件路径

保留 Bootstrap 配置文件名称 程序启动参数:

--spring.cloud.bootstrap.name=spring-cloud

调整 Bootstrap 配置文件路径 程序启动参数:

--spring.cloud.bootstrap.location=config

现有四个文件:

application.properties

spring.application.name = spring-cloud-config-client

bootstrap.properties

spring.application.name = spring-cloud-config-client-demo

spring-cloud.properties

spring.application.name = spring-cloud

config/spring-cloud.properties

spring.application.name = spring-cloud-2

实际结果:

  "applicationConfig: [classpath:/application.properties]": {
    "spring.cloud.bootstrap.enabled": "false",
    "endpoints.env.sensitive": "false",
    "spring.application.name": "spring-cloud-config-client"
  },
  ...
  "applicationConfig: [classpath:/config/spring-cloud.properties]": {
    "spring.application.name": "spring-cloud-config-client"
  },
  "applicationConfig: [classpath:/spring-cloud.properties]": {
    "spring.application.name": "spring-cloud-config-client"
  },

覆盖远程配置属性

默认情况,Spring Cloud 是允许覆盖的, spring.cloud.config.allowOverride=true

通过程序启动参数,调整这个值为"false"

--spring.cloud.config.allowOverride=false

启动后,重新Postman 发送 POST 请求,调整 spring.application.name 值为 "spring-cloud-new"

注意官方文档的说明:the remote property source has to grant it permission by setting spring.cloud.config.allowOverride=true (it doesn’t work to set this locally).

自定义 Bootstrap 配置

  • 创建 META-INF/spring.factories 文件(类似于 Spring Boot 自定义 Starter)
  • 自定义 Bootstrap 配置 Configuration
 
​import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
​
import java.util.HashMap;
import java.util.Map;
​
/**
 * Bootstrap 配置 Bean
 *
 * 
 * @since Configuration
 */
@Configuration
public class MyConfiguration implements ApplicationContextInitializer {
​
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 从 ConfigurableApplicationContext 获取 ConfigurableEnvironment 实例
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        // 获取 PropertySources
        MutablePropertySources propertySources = environment.getPropertySources();
        // 定义一个新的 PropertySource,并且放置在首位
        propertySources.addFirst(createPropertySource());
​
    }
​
    private PropertySource createPropertySource() {
​
        Map<String, Object> source = new HashMap<>();
​
        source.put("name", "小马哥");
​
        PropertySource propertySource = new MapPropertySource("my-property-source", source);
​
        return propertySource;
​
    }
}

配置 META-INF/spring.factories 文件,关联Key org.springframework.cloud.bootstrap.BootstrapConfiguration

org.springframework.cloud.bootstrap.BootstrapConfiguration= \
com.segmentfault.springcloudlesson2.boostrap.MyConfiguration

自定义 Bootstrap 配置属性源

实现 PropertySourceLocator

 
import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
import org.springframework.core.env.*;
​
import java.util.HashMap;
import java.util.Map;
​
/**
 * 自定义 {@link PropertySourceLocator} 实现
 *
 * @since PropertySourceLocator
 */
public class MyPropertySourceLocator implements PropertySourceLocator {
​
    @Override
    public PropertySource<?> locate(Environment environment) {
​
        if (environment instanceof ConfigurableEnvironment) {
​
            ConfigurableEnvironment configurableEnvironment = ConfigurableEnvironment.class.cast(environment);
​
            // 获取 PropertySources
            MutablePropertySources propertySources = configurableEnvironment.getPropertySources();
            // 定义一个新的 PropertySource,并且放置在首位
            propertySources.addFirst(createPropertySource());
​
        }
        return null;
    }
​
    private PropertySource createPropertySource() {
​
        Map<String, Object> source = new HashMap<>();
​
        source.put("spring.application.name", "小马哥的 Spring Cloud 程序");
        // 设置名称和来源
        PropertySource propertySource = new MapPropertySource("over-bootstrap-property-source", source);
​
        return propertySource;
​
    }
}

配置 META-INF/spring.factories

org.springframework.cloud.bootstrap.BootstrapConfiguration= \
com.segmentfault.springcloudlesson2.boostrap.MyConfiguration,\
com.segmentfault.springcloudlesson2.boostrap.MyPropertySourceLocator

到此这篇关于Spring Cloud 之配置客户端的文章就介绍到这了,更多相关Spring Cloud 配置客户端内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程编程之CountDownLatch同步工具使用实例

    Java多线程编程之CountDownLatch同步工具使用实例

    这篇文章主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下
    2015-05-05
  • Java基于HttpClient实现RPC的示例

    Java基于HttpClient实现RPC的示例

    HttpClient可以实现使用Java代码完成标准HTTP请求及响应。本文主要介绍了Java基于HttpClient实现RPC,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • MapStruct到底是什么?

    MapStruct到底是什么?

    今天给大家带来的是关于Java的相关知识,文中围绕MapStruct到底是什么展开,文中有非常详细的解释及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java文件断点续传实现原理解析

    Java文件断点续传实现原理解析

    这篇文章主要介绍了Java文件断点续传实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 使用SkyWalking监控Java服务的过程

    使用SkyWalking监控Java服务的过程

    这篇文章主要介绍了使用SkyWalking监控Java服务,介绍一个对源码0入侵的Java服务监控方式,SkyWalking Agent,只需要启动Java程序的时候加几个参数,就能对Java服务进行可视化监控,需要的朋友可以参考下
    2023-08-08
  • 基于Java的正则表达式

    基于Java的正则表达式

    正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念
    2017-05-05
  • Java方法递归的形式和常见递归算法(方法递归结合File类查找文件)

    Java方法递归的形式和常见递归算法(方法递归结合File类查找文件)

    方法递归方法直接调用自己或者间接调用自己的形式称为方法递归( recursion),递归做为一种算法在程序设计语言中广泛应用,这篇文章主要介绍了Java方法递归的形式和常见递归算法-方法递归结合File类查找文件,需要的朋友可以参考下
    2023-02-02
  • java反射之Method的invoke方法实现教程详解

    java反射之Method的invoke方法实现教程详解

    这篇文章主要给大家介绍了关于java反射之Method的invoke方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • java数组排序示例分享

    java数组排序示例分享

    这篇文章主要介绍了java数组排序示例,需要的朋友可以参考下
    2014-03-03
  • 强烈推荐IDEA提高开发效率的必备插件

    强烈推荐IDEA提高开发效率的必备插件

    这篇文章主要介绍了强烈推荐IDEA提高开发效率的必备插件,文中有非常详细的图文示例,对想要提高企业开发效率的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论