SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解
构建分布式系统非常复杂且容易出错。Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序。Spring Cloud构建于Spring Boot之上,使开发人员可以轻松入门并快速提高工作效率。Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点。Spring Cloud建立在此之上,并添加了一些可能系统中所有组件将使用或偶尔需要的功能。
引导应用程序上下文
一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解密本地外部配置文件中的属性。这两个上下文共享一个Environment
,这是任何Spring应用程序的外部属性的来源。Bootstrap属性的优先级高,因此默认情况下不能被本地配置覆盖。
引导上下文使用与主应用程序上下文不同的外部配置约定,因此使用bootstrap.yml
application.yml
(或.properties
)代替引导和主上下文的外部配置。关于配置文件bootstrap.yml与
application.yml区别的深入分析详见
SpringCloud入门之常用的配置文件 application.yml和 bootstrap.yml区别
例:
spring:
application:
name: order
cloud:
config:
uri: ${SPRING_CONFIG_URI:http://localhost:8888}
如果您的应用程序需要服务器上的特定于应用程序的配置,那么设置spring.application.name
(在bootstrap.yml
或application.yml
)中是个好主意。
您可以通过设置spring.cloud.bootstrap.enabled=false
(例如在系统属性中)来完全禁用引导过程。
应用程序上下文层次结构
如果您从SpringApplication
或SpringApplicationBuilder
构建应用程序上下文,则将Bootstrap上下文添加为该上下文的父级。这是一个Spring的功能,即子上下文从其父进程继承属性源和配置文件,因此与不使用Spring Cloud Config构建相同上下文相比,“主”应用程序上下文将包含其他属性源。额外的资产来源是:
如果您从
SpringApplication
或SpringApplicationBuilder构建应用程序上下文,则将Bootstrap上下文添加为该上下文的父级。Spring的一个特性是子上下文从其父级继承属性源和配置文件,因此与构建没有Spring Cloud Config的相同上下文相比,“主”应用程序上下文包含其他属性源。其他财产来源是:- “bootstrap”:如果
PropertySourceLocators
在Bootstrap上下文中找到任何内容,并且它们具有非空属性,CompositePropertySource
则会显示具有高优先级的可选项。一个例子是Spring Cloud Config Server的属性。 - “applicationConfig:[classpath:bootstrap.yml]”(以及相关文件,如果Spring配置文件处于活动状态):如果您有
bootstrap.yml
(或.properties
),则使用这些属性配置Bootstrap上下文。然后,在设置其父级时,它们将添加到子上下文中。它们的优先级低于application.yml
(或.properties
)以及作为创建Spring Boot应用程序过程的正常部分添加到子级的任何其他属性源。有关如何自定义这些属性源的内容的说明
- “bootstrap”:如果
由于属性源的排序规则,“引导”条目优先,但请注意,这些条目不包含来自bootstrap.yml
的任何数据,它具有非常低的优先级,但可用于设置默认值。
您可以通过简单地设置您创建的任何ApplicationContext
的父上下文来扩展上下文层次结构,例如使用自己的界面,或使用SpringApplicationBuilder
方便方法(parent()
,child()
和sibling()
)。引导环境将是您创建自己的最高级祖先的父级。层次结构中的每个上下文都将有自己的“引导”属性源(可能为空),以避免无意中将值从父级升级到其后代。层次结构中的每个上下文(原则上)也可以具有不同的spring.application.name
,因此如果存在配置服务器,则不同的远程属性源。普通的Spring应用程序上下文行为规则适用于属性解析:子环境中的属性通过名称和属性源名称覆盖父项中的属性(如果子级具有与父级名称相同的属性源,一个来自父母的孩子不包括在孩子中)。
请注意,SpringApplicationBuilder
允许您在整个层次结构中共享Environment
,但这不是默认值。因此,兄弟情境尤其不需要具有相同的资料或财产来源,尽管它们与父母共享共同点。
改变引导位置Properties
可以使用spring.cloud.bootstrap.name
(默认“引导”)或spring.cloud.bootstrap.location
(默认为空)指定bootstrap.yml
(或.properties
)位置,例如在系统属性中。这些属性的行为类似于具有相同名称的spring.config.*
变体,实际上它们用于通过在其Environment
中设置这些属性来设置引导ApplicationContext
。如果在正在构建的上下文中有活动的配置文件(来自spring.profiles.active
或通过Environment
API)),则该配置文件中的属性也将被加载,就像常规的Spring Boot应用程序,例如来自bootstrap-development.properties
的“开发”简介。
覆盖远程Properties的值
通过引导上下文添加到应用程序的属性源通常是“远程”(例如从配置服务器),并且默认情况下,不能在本地覆盖,除了在命令行上。如果要允许您的应用程序使用自己的系统属性或配置文件覆盖远程属性,则远程属性源必须通过设置spring.cloud.config.allowOverride=true
(在本地设置本身不起作用)授予权限。一旦设置了该标志,就会有一些更精细的设置来控制远程属性与系统属性和应用程序本地配置的位置:spring.cloud.config.overrideNone=true
覆盖任何本地属性源,spring.cloud.config.overrideSystemProperties=false
如果只有系统属性和env var应该覆盖远程设置,而不是本地配置文件。
自定义引导配置
可以通过在org.springframework.cloud.bootstrap.BootstrapConfiguration
键下添加条目/META-INF/spring.factories
来训练引导上下文来执行任何您喜欢的操作。这是用于创建上下文的Spring @Configuration
类的逗号分隔列表。您可以在此处创建要用于自动装配的主应用程序上下文的任何bean,并且还有ApplicationContextInitializer
类型的@Beans
的特殊合同。如果要控制启动顺序(默认顺序为“最后”),可以使用@Order
标记类。
警告
|
添加自定义BootstrapConfiguration 时,请注意,您添加的类不是错误的@ComponentScanned 到您的“主”应用程序上下文中,可能不需要它们。对于您的@ComponentScan 或@SpringBootApplication 注释配置类尚未涵盖的启动配置类,请使用单独的包名称。 |
引导过程通过将初始化器注入主SpringApplication
实例(即正常的Spring Boot启动顺序,无论是作为独立应用程序运行还是部署在应用程序服务器中)结束。首先,从spring.factories
中找到的类创建引导上下文,然后在ApplicationContextInitializer
类型的所有@Beans
添加到主SpringApplication
开始之前。
自定义引导属性源
引导过程添加的外部配置的默认属性源是Config Server,但您可以通过将PropertySourceLocator
类型的bean添加到引导上下文(通过spring.factories
)添加其他源。您可以使用此方法从其他服务器或数据库中插入其他属性。
作为一个例子,请考虑以下微不足道的自定义定位器:
@Configuration
public class CustomPropertySourceLocator implements PropertySourceLocator {
@Override
public PropertySource<?> locate(Environment environment) {
return new MapPropertySource("customProperty",
Collections.<String, Object>singletonMap("property.from.sample.custom.source", "worked as intended"));
}
}
传入的Environment
是要创建的ApplicationContext
的Environment
,即为我们提供额外的属性来源的。它将已经具有正常的Spring Boot提供的资源来源,因此您可以使用它们来定位特定于此Environment
的属性源(例如通过将其绑定在spring.application.name
上,如在默认情况下所做的那样Config Server属性源定位器)。
如果你在这个类中创建一个jar,然后添加一个META-INF/spring.factories
包含:
org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator
那么“customProperty”PropertySource
将显示在其类路径中包含该jar的任何应用程序中。
环境变化
应用程序将收听EnvironmentChangeEvent
,并以几种标准方式进行更改(用户可以以常规方式添加ApplicationListeners
附加ApplicationListeners
)。当观察到EnvironmentChangeEvent
时,它将有一个已更改的键值列表,应用程序将使用以下内容:
重新绑定上下文中的任何
@ConfigurationProperties
bean为
logging.level.*
中的任何属性设置记录器级别
请注意,配置客户端不会通过默认轮询查找Environment
中的更改,通常我们不建议检测更改的方法(尽管可以使用@Scheduled
注释进行设置)。如果您有一个扩展的客户端应用程序,那么最好将EnvironmentChangeEvent
广播到所有实例,而不是让它们轮询更改。
EnvironmentChangeEvent
涵盖了大量的刷新用例,只要您真的可以更改Environment
并发布事件(这些API是公开的,部分内核为Spring)。您可以通过访问/configprops
端点(普通Spring Boot执行器功能)来验证更改是否绑定到@ConfigurationProperties
bean。例如,DataSource
可以在运行时更改其maxPoolSize
(由Spring Boot创建的默认DataSource
是一个@ConfigurationProperties
bean),并且动态增加容量。重新绑定@ConfigurationProperties
不会覆盖另一大类用例,您需要更多的控制刷新,并且您需要更改在整个ApplicationContext
上是原子的。为了解决这些担忧,我们有@RefreshScope
。
刷新范围
当配置更改时,标有@RefreshScope
的Spring @Bean
将得到特殊处理。这解决了状态bean在初始化时只注入配置的问题。例如,如果通过Environment
更改数据库URL时DataSource
有开放连接,那么我们可能希望这些连接的持有人能够完成他们正在做的工作。然后下一次有人从游泳池借用一个连接,他得到一个新的URL。
刷新范围bean是在使用时初始化的懒惰代理(即当调用一个方法时),并且作用域作为初始值的缓存。要强制bean重新初始化下一个方法调用,您只需要使其缓存条目无效。
RefreshScope
是上下文中的一个bean,它有一个公共方法refreshAll()
来清除目标缓存中的范围内的所有bean。还有一个refresh(String)
方法可以按名称刷新单个bean。此功能在/refresh
端点(通过HTTP或JMX)中公开。
注意
|
@RefreshScope (技术上)在@Configuration 类上工作,但可能会导致令人惊讶的行为:例如,这并不 意味着该类中定义的所有@Beans 本身都是@RefreshScope 。具体来说,任何取决于这些bean的东西都不能依赖它们在刷新启动时被更新,除非它本身在@RefreshScope (在其中将重新刷新并重新注入其依赖关系),那么它们将从刷新的@Configuration )重新初始化。 |
加密和解密
Spring Cloud具有一个用于在本地解密属性值的Environment
预处理器。它遵循与Config Server相同的规则,并通过encrypt.*
具有相同的外部配置。因此,您可以使用{cipher}*
格式的加密值,只要有一个有效的密钥,那么在主应用程序上下文获取Environment
之前,它们将被解密。要在应用程序中使用加密功能,您需要在您的类路径中包含Spring安全性RSA(Maven协调“org.springframework.security:spring-security-rsa”),并且还需要全面强大的JCE扩展你的JVM
如果由于“非法密钥大小”而导致异常,并且您正在使用Sun的JDK,则需要安装Java加密扩展(JCE)无限强度管理策略文件。有关详细信息,请参阅以下链接:
将文件解压缩到JDK / jre / lib / security文件夹(无论您使用的是哪个版本的JRE / JDK x64 / x86)。
端点
端点
对于Spring Boot Actuator应用程序,可以使用一些其他管理端点。您可以使用:
POST
要/actuator/env
更新Environment
并重新绑定@ConfigurationProperties
并记录水平。/actuator/refresh
重新加载引导带上下文并刷新@RefreshScope
bean。/actuator/restart
关闭ApplicationContext
并重新启动它(默认情况下禁用)。/actuator/pause
和/actuator/resume
调用的Lifecycle
方法(stop()
和start()
上ApplicationContext
)。
如果禁用 |
SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解的更多相关文章
- spring cloud config 详解
Spring Cloud 为开发人员提供了一系列的工具来快速构建分布式系统的通用模型 .例如:配置管理.服务发现.断路由.智能路由.微代理.控制总线.一次性Token.全局锁.决策竞选.分布式sess ...
- 微服务生态组件之Spring Cloud LoadBalancer详解和源码分析
Spring Cloud LoadBalancer 概述 Spring Cloud LoadBalancer目前Spring官方是放在spring-cloud-commons里,Spring Clou ...
- 微服务生态组件之Spring Cloud OpenFeign详解和源码分析
Spring Cloud OpenFeign 概述 Spring Cloud OpenFeign 官网地址 https://spring.io/projects/spring-cloud-openfe ...
- Spring Cloud原理详解
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- Spring Cloud的应用程序—上下文服务
Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点.Spring Cloud建立在此之上,并添加了一些可能系统中所 ...
- Spring Cloud上下文:应用程序上下文服务
Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点.Spring Cloud建立在此之上,并添加了一些可能系统中所 ...
- Spring Cloud教程(九)应用程序上下文服务
Spring Boot对于如何使用Spring构建应用程序有一个看法:例如它具有常规配置文件的常规位置,以及用于常见管理和监视任务的端点.Spring Cloud建立在此之上,并添加了一些可能系统中所 ...
- 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud
系列文章目录 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud 目录 系列文章目录 前言 单体式架构 微服务架构 优点 缺点 服务发现与弹性扩展 参考 前言 在微 ...
- spring事务管理(详解和实例)
原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...
随机推荐
- Mysql SQL执行错误:#1136
情况:在插入数据时可能会遇到这种情况: 原因: 插入时的数据个数与表中的字段个数不一致 解决方法: 检查表中的字段数与代码中所插入的数据字段数是否一致 例如:以下为Salary表中结构 虽然ActI ...
- 作用域和闭包(二)this
this 要在执行时才确认,定义时无法确认 1. 作为构造函数执行 2. 作为对象属性执行 3.作为普通函数执行 4. call,apply,bind 改变this
- CentOS下的Mysql的安装和使用
1.使用安装命令 :yum -y install mysql mysql-server mysql-devel 安装完成却发现Myserver安装缺失,在网上找原因,原来是因为CentOS 7上把My ...
- html5 Canvas绘制时钟以及绘制运动的圆
1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...
- Codechef August Challenge 2018 : Coordinate Compression
传送门 外边二分,里面拿线段树维护贪心就行了. #include<cstdio> #include<vector> #include<cstring> #inclu ...
- __x__(28)0907第四天__固定布局
布局 固定布局,需要计算单位 自适应响应布局 固定布局 html代码 <!doctype html> <html> <head> <meta charset ...
- ECMA Script 6_Symbol() 唯一类型值声明函数_Symbol 数据类型
Symbol 数据类型 let s = Symbol(); typeof s; // "symbol" 是 ES6 继 Number,String,Boolean,Undefine ...
- Windows中使用ssh利用公钥登入远程服务器
方式:使用 Winscp 密钥登录 我们平时开发多会使用 ftp 来上传下载文件,尤其是很多 Linux 环境下. 其实 Linux 默认是不提供 ftp 的,需要你额外安装 FTP 服务 ...
- aspose 生成word 简单的文档操作
package aspose.com.word; import com.aspose.words.Document;import com.aspose.words.DocumentBuilder; p ...
- photoshop cc 2017安装
https://jingyan.baidu.com/article/8ebacdf0700c0c49f65cd500.html