前言:
Cloud Native是一种应用程序开发风格,鼓励在持续交付和价值驱动开发领域轻松采用最佳实践。一个相关的学科是构建12-factor Apps 应用程序,其中开发实践与交付和运行目标相一致,例如通过使用声明式编程、管理、监控。 Spring Cloud以许多特定方式促进了这些开发风格,并且出发点是一组功能,即分布式系统中的所有组件都需要或需要时可轻松访问的功能。
Spring Boot涵盖了许多这些功能,我们在Spring Cloud基于spring boot构建这些功能。 Spring Cloud还提供了两个库:Spring Cloud Context和Spring Cloud Commons。 Spring Cloud Context为Spring云应用程序的ApplicationContext(bootstrap context, encryption, refresh scope and environment endpoints)提供实用程序和特殊服务。 Spring Cloud Commons是一组用于不同Spring云实现(例如Spring Cloud Netflix vs. Spring Cloud Consul)的抽象类和公共类。
如果由于“Illegal key size”而导致异常,并且您正在使用Sun的JDK,则需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。有关更多信息,请参阅以下链接:
将文件解压缩到JDK / jre / lib / security文件夹中(无论您使用哪种版本的JRE / JDK x64 / x86)。
2. Spring Cloud Context: Application Context Services
Spring Boot对于如何使用Spring构建应用程序有着自己的观点:例如,它具有常规配置文件的常规位置,以及常见管理和监视任务的endpoints 。 Spring cloud建立在此基础之上,并添加了一些可能系统中所有组件都会使用或偶尔需要的功能。
2.1 The Bootstrap Application Context
Spring Cloud应用程序通过创建“bootstrap”context来运行,该bootstrap上下文是main application 的parent context。开箱即用,它负责从外部源加载配置属性,并且还解密本地外部配置文件中的属性。这两个上下文共享一个Environment,Environment是任何Spring应用程序的外部属性的来源。Bootstrap properties 具有较高优先级,因此默认情况下它们不能被本地配置覆盖。
和main bootstrap context相比,bootstrap context使用不同的约定来定位外部配置,所以不是使用application.yml(或.properties),而是使用bootstrap.yml,将bootstrap和main上下文的外部配置保持良好分离。例:
bootstrap.yml.
spring: application: name: foo cloud: config: uri: ${SPRING_CONFIG_URI:http://localhost:8888}
如果您的应用程序需要来自服务器的任何特定于应用程序的配置,那么设置spring.application.name(在bootstrap.yml或application.yml中)是个不错的主意。
您可以通过设置spring.cloud.bootstrap.enabled = false来完全禁用引导过程(例如,在System properties中)。
2.2 Application Context Hierarchies
如果您从SpringApplication或SpringApplicationBuilder构建application上下文,那么Bootstrap上下文将作为该上下文的父项添加。 Spring的一个特性是子级上下文从父级继承属性来源和配置文件,因此与不使用Spring Cloud Config构建应用程序上下文相比,“main”应用程序上下文将包含其他属性源。额外的property sources是:
- “bootstrap”:如果在Bootstrap上下文中找到任何PropertySourceLocators,则可选CompositePropertySource将以高优先级出现,并且它们具有非空属性。一个例子是Spring Cloud Config Server的属性。请参阅 below的说明,了解如何自定义此属性来源的内容。
- “applicationConfig”:classpath:bootstrap.yml(如果Spring profile文件处于active状态,则bootstrap-***.yml也会被使用)。如果您有一个bootstrap.yml(或properties),则使用这些属性来配置Bootstrap上下文,然后当子context设置了此父context的时候就会将这些属性添加到子上下文中。这些父context中的属性的优先级低于application.yml(或properties)和任何其他作为创建Spring Boot应用程序过程的正常部分添加到子 context的属性源。请参阅 below的说明,了解如何自定义这些属性来源的内容。
由于properties sourcer的排序规则,“bootstrap”entries 优先,但请注意,这些条目不包含bootstrap.yml中的任何数据,它们的优先级非常低,但可用于设置默认值。
您可以通过为您创建的任何ApplicationContext设置父上下文来扩展上下文层次结构,可以使用ApplicationContext自己的接口,或使用SpringApplicationBuilder的方法(parent(),child()和sibling())。引导程序上下文将是您自己创建的最高级祖先的父级。层次结构中的每个context都有自己的“bootstrap”properties source(可能为空),以避免无意中将属性从父 context继承到其后代。层次结构中的每个context也可以(原则上)具有不同的spring.application.name,因此如果有Config Server,则具有不同的远程属性源。普通的Spring应用程序上下文行为规则适用于属性解析:来自子上下文的属性覆盖父上下文中的属性,按名称和属性源名称区分(如果子context具有与父context相同名称的属性源,则父context中的这个属性源不包括在子上下文中)。
请注意,SpringApplicationBuilder允许您在整个层次结构中共享一个Environment,但这不是默认设置。因此,兄弟上下文尤其不需要具有相同的profile或properties source,即使他们与他们的父上下文共享相同的东西。
2.3 Changing the Location of Bootstrap Properties
可以使用spring.cloud.bootstrap.name(默认“bootstrap”)或spring.cloud.bootstrap.location(默认为空)来指定bootstrap.yml(或.properties)位置,例如,在System Properties中。这些属性的行为与具有相同名称的spring.config.*变体相同,实际上它们通过在bootstrap ApplicationContext 的Environment中设置这些属性来设置bootstrap ApplicationContext。如果存在active profile(来自spring.profiles.active或通过您正在构建的context中的Environment API配置),那么该配置文件中的属性也将被加载,就像在常规的Spring Boot应用程序中一样,例如。“development” profile的bootstrap-development.properties。
2.4 Overriding the Values of Remote Properties
通过booststrap 上下文添加到应用程序的属性源通常是“remote”(例如来自Config Server),默认情况下,它们不能被本地的属性覆盖,除了命令行。如果您希望允许应用程序使用自己的系统属性或配置文件覆盖远程属性,那么远程属性源必须通过设置spring.cloud.config.allowOverride = true来授予其权限(在本地设置这个属性不生效)。一旦设置了该标志,就会有一些更细粒度的设置来控制与System properties and the application’s local configuration有关的远程属性的location:spring.cloud.config.overrideNone = true允许任何本地属性源覆盖远程配置。spring.cloud.config.overrideSystemProperties = false,如果只有系统属性和env vars(环境变量)可以覆盖远程配置,本地配置文件不能覆盖远程配置。
2.5 Customizing the Bootstrap Configuration
通过向/META-INF/spring.factories中添加以org.springframework.cloud.bootstrap.BootstrapConfiguration 为key的条目可以训练bootstrap context执行任何您想要的操作。这个key对应的值是逗号分隔的@Configuration类列表,这些类用于创建bootstrap context。您想要在 "main" application context中可以自动装配的任何bean都可以在此处创建,并且该上下文中还有一个ApplicationContextInitializer类型的@Beans特殊规范。如果要控制启动顺序(默认顺序为“last”),可以使用@Order标记类。
添加自定义BootstrapConfiguration时要小心,您添加的这些类不能错误地@ComponentScanned到您的 "main" application context中,因为 "main" application context中可能不需要它们。对于尚未由@ComponentScan或@SpringBootApplication注释的配置类所包含的boot 配置类,使用单独的package name。
bootstrap process结束于将