Spring Cloud 云原生应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud 云原生应用相关的知识,希望对你有一定的参考价值。
云原生是一种应用程序开发风格,鼓励在持续交付和价值驱动开发领域轻松采用最佳实践。 一个相关的学科是构建12 因素应用程序,其中开发实践与交付和运营目标保持一致 — 例如,通过使用声明性编程以及管理和监视。 Spring Cloud 以多种特定方式促进这些开发风格。 起点是分布式系统中的所有组件都需要轻松访问的一组功能。
其中许多功能都包含在Spring Boot中,Spring Cloud在其上构建。Spring Cloud 以两个库的形式提供了更多功能:Spring Cloud Context 和 Spring Cloud Commons。 Spring Cloud Context 为 Spring Cloud 应用程序提供实用程序和特殊服务(引导上下文、加密、刷新范围和环境端点)。Spring Cloud Commons是一组抽象和通用类,用于不同的Spring Cloud实现(如Spring Cloud Netflix和Spring Cloud Consul)。ApplicationContext
如果由于“非法密钥大小”而出现异常,并且使用 Sun 的 JDK,则需要安装 Java 加密扩展 (JCE) 无限强度管辖策略文件。 有关详细信息,请参阅以下链接:
- Java 6 JCE
- Java 7 JCE
- Java 8 JCE
将文件解压缩到您使用的任何版本的 JRE/JDK x64/x86 的 JDK/jre/lib/security 文件夹中。
Spring Cloud 是在非限制性 Apache 2.0 许可证下发布的。 如果您想为文档的这一部分做出贡献,或者如果您发现错误,您可以在 docslink[github] 找到该项目的源代码和问题跟踪器。 |
1. 春季云上下文:应用程序上下文服务
Spring Boot 对如何使用 Spring 构建应用程序有一个固执己见的观点。 例如,它具有用于常见配置文件的常规位置,并具有用于常见管理和监视任务的端点。 Spring Cloud在此基础上构建,并添加了一些系统中许多组件会使用或偶尔需要的功能。
1.1. 引导应用程序上下文
Spring Cloud 应用程序通过创建“引导”上下文来运行,该上下文是主应用程序的父上下文。 此上下文负责从外部源加载配置属性,并负责解密本地外部配置文件中的属性。 这两个上下文共享一个,这是任何 Spring 应用程序的外部属性的来源。 默认情况下,引导属性(在引导阶段加载的 notbut 属性)以高优先级添加,因此本地配置无法覆盖它们。Environment
bootstrap.properties
引导上下文使用与主应用程序上下文不同的约定来查找外部配置。 您可以使用 (或) 代替 (或),将引导程序和主上下文的外部配置很好地分开。 下面的清单显示了一个示例:application.yml
.properties
bootstrap.yml
例 1.引导程序.yml
spring:
application:
name: foo
cloud:
config:
uri: $SPRING_CONFIG_URI:http://localhost:8888
如果您的应用程序需要来自服务器的任何特定于应用程序的配置,最好设置 (inor)。 若要将属性用作应用程序的上下文 ID,必须将其设置在 中。spring.application.name
bootstrap.yml
application.yml
spring.application.name
bootstrap.[properties | yml]
如果要检索特定的配置文件配置,则还应设置。spring.profiles.active
bootstrap.[properties | yml]
您可以通过设置(例如,在系统属性中)完全禁用引导过程。spring.cloud.bootstrap.enabled=false
1.2. 应用程序上下文层次结构
如果从 or 构建应用程序上下文,则引导程序上下文将作为父级添加到该上下文中。 Spring 的一个特性是子上下文从其父上下文继承属性源和配置文件,因此与在没有 Spring Cloud Config 的情况下构建相同的上下文相比,“主”应用程序上下文包含额外的属性源。 其他属性源包括:SpringApplication
SpringApplicationBuilder
- “bootstrap”:如果在引导上下文中找到任何属性,并且它们具有非空属性,则 optional将显示具有高优先级。 一个例子是来自Spring Cloud Config Server的属性。 有关如何自定义此属性源的内容,请参阅“自定义 Bootstrap 属性源”。
PropertySourceLocators
CompositePropertySource
- “applicationConfig: [classpath:bootstrap.yml]”(以及相关文件,如果 Spring 配置文件处于活动状态):如果您有 a(or),则这些属性用于配置引导上下文。 然后,当设置父上下文时,它们将添加到子上下文中。 它们的优先级低于在创建 Spring Boot 应用程序过程中添加到子级的 (或) 和任何其他属性源。 有关如何自定义这些属性源的内容,请参阅“更改引导程序属性的位置”。
bootstrap.yml
.properties
application.yml
.properties
由于属性源的排序规则,“引导”条目优先。 但是,请注意,它们不包含来自的任何数据,这些数据的优先级非常低,但可用于设置默认值。bootstrap.yml
您可以通过设置您创建的任何内容的父上下文来扩展上下文层次结构 — 例如,通过使用其自己的接口或使用便利方法 (,and)。 引导上下文是您自己创建的最高级祖先的父级。 层次结构中的每个上下文都有自己的“引导”(可能是空的)属性源,以避免无意中将值从父级提升到其后代。 如果有配置服务器,则层次结构中的每个上下文也可以(原则上)具有不同的远程属性源,因此具有不同的远程属性源。 普通 Spring 应用程序上下文行为规则适用于属性解析:子上下文中的属性将覆盖 父级,按名称和属性源名称。 (如果子项具有与父项同名的属性源,则父项中的值不包括在子项中)。ApplicationContext
SpringApplicationBuilder
parent()
child()
sibling()
spring.application.name
请注意,您可以在整个层次结构中共享这些内容,但这不是默认设置。 因此,同级上下文(特别是)不需要具有相同的配置文件或属性源,即使它们可能与其父级共享共同的值。SpringApplicationBuilder
Environment
1.3. 更改引导程序属性的位置
可以通过设置(默认值:)、(默认值:空)或(默认值:空)来指定(或)位置 — 例如,在系统属性中。bootstrap.yml
.properties
spring.cloud.bootstrap.name
bootstrap
spring.cloud.bootstrap.location
spring.cloud.bootstrap.additional-location
这些属性的行为类似于具有相同名称的变体。 默认位置将被替换,并且仅使用指定的位置。 要将位置添加到默认位置列表中,可以使用。 实际上,它们用于通过在其中设置这些属性来设置引导程序。 如果存在活动配置文件(在您正在构建的上下文中通过 API 发送),则也会加载该配置文件中的属性,与常规 Spring Boot 应用程序中的属性相同 — 例如,fromfor aprofile。spring.config.*
spring.cloud.bootstrap.location
spring.cloud.bootstrap.additional-location
ApplicationContext
Environment
spring.profiles.active
Environment
bootstrap-development.properties
development
1.4. 覆盖远程属性的值
引导上下文添加到应用程序的属性源通常是“远程的”(例如,来自 Spring Cloud Config Server)。 默认情况下,无法在本地覆盖它们。 如果要让应用程序使用自己的系统属性或配置文件覆盖远程属性,则远程属性源必须通过设置授予其权限(在本地设置此选项不起作用)。 设置该标志后,两个更细粒度的设置将控制远程属性相对于系统属性和应用程序的本地配置的位置:spring.cloud.config.allowOverride=true
-
spring.cloud.config.overrideNone=true
:从任何本地属性源覆盖。 -
spring.cloud.config.overrideSystemProperties=false
:只有系统属性、命令行参数和环境变量(而不是本地配置文件)应覆盖远程设置。
1.5. 自定义引导程序配置
引导上下文可以设置为通过在名为的键下添加条目来执行您喜欢的任何操作。 这包含用于创建上下文的 Springclasses 的逗号分隔列表。 您可以在此处创建您希望可用于自动布线的主应用程序上下文的任何 bean。 有一个特殊的合同类型。 如果要控制启动顺序,可以使用注释标记类(默认顺序为)。/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration
@Configuration
@Beans
ApplicationContextInitializer
@Order
last
添加自定义时,请注意您添加的类不会错误地放入“主”应用程序上下文中,而这些上下文可能不需要它们。 对引导配置类使用单独的包名称,并确保该名称尚未被您批注的配置类所涵盖。 |
引导过程通过将初始值设定项注入主实例(这是正常的 Spring 引导启动序列,无论它是作为独立应用程序运行还是部署在应用程序服务器中)结束。 首先,从中找到的类创建引导上下文。 然后,在启动之前将 allof 类型添加到主节点中。SpringApplication
spring.factories
@Beans
ApplicationContextInitializer
SpringApplication
1.6. 自定义引导属性源
引导过程添加的外部配置的默认属性源是 Spring Cloud 配置服务器,但您可以通过将类型的 bean 添加到引导上下文(通过)来添加其他源。 例如,可以从其他服务器或数据库插入其他属性。PropertySourceLocator
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"));
传入的就是要创建的那个 - 换句话说,我们为其提供额外的属性源。 它已经有正常的 Spring Boot 提供的属性源,因此您可以使用它们来查找特定于此的属性源(例如,通过键入它,就像在默认的 Spring Cloud Config Server 属性源定位器中所做的那样)。Environment
ApplicationContext
Environment
spring.application.name
如果创建包含此类的 jar,然后添加包含以下设置的 jar,则在其类路径中包含该 jar 的任何应用程序中都会出现:META-INF/spring.factories
customProperty
PropertySource
org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator
1.7. 日志配置
如果使用 Spring 引导来配置日志设置,则应将此配置放入如果您希望它应用于所有事件。bootstrap.[yml | properties]
要使 Spring Cloud 正确初始化日志记录配置,您不能使用自定义前缀。 例如,初始化日志记录系统时,春云无法识别 using。 |
1.8. 环境变化
应用程序侦听 anand 以几种标准方式对更改做出反应(可以按正常方式添加其他方式)。 当观察到 anis 时,它有一个已更改的键值列表,应用程序使用这些值来:EnvironmentChangeEvent
ApplicationListeners
@Beans
EnvironmentChangeEvent
- 在上下文中重新绑定任意豆。
@ConfigurationProperties
- 为 中的任何属性设置记录器级别。
logging.level.*
请注意,默认情况下,Spring 云配置客户端不会轮询 中的更改。 通常,我们不建议使用这种方法来检测更改(尽管您可以使用 aannotation 进行设置)。 如果您有横向扩展的客户端应用程序,最好将它广播到所有实例,而不是让它们轮询更改(例如,通过使用Spring Cloud Bus)。Environment
@Scheduled
EnvironmentChangeEvent
涵盖了一大类刷新用例,只要您实际可以对事件进行更改并发布事件即可。 请注意,这些 API 是公共的,是核心 Spring 的一部分)。 您可以通过访问端点(标准的 Spring 引导执行器功能)来验证更改是否绑定到bean。 例如,acan 可以在运行时更改它(Spring Boot 创建的默认值是 abean)并动态增长容量。 重新绑定不涵盖另一类大型用例,在这些用例中,您需要对刷新进行更多控制,并且需要对整个用例进行原子更改。 为了解决这些问题,我们做到了。EnvironmentChangeEvent
Environment
@ConfigurationProperties
/configprops
DataSource
maxPoolSize
DataSource
@ConfigurationProperties
@ConfigurationProperties
ApplicationContext
@RefreshScope
1.9. 刷新范围
当配置发生变化时,标记为特殊处理的弹簧。 此功能解决了有状态 Bean 的问题,这些 Bean 仅在初始化时注入其配置。 例如,如果ahas在通过数据库URL更改时打开连接,您可能希望这些连接的持有者能够完成他们正在执行的操作。 然后,下次某些东西从池中借用连接时,它会获得具有新 URL 的连接。@Bean
@RefreshScope
DataSource
Environment
有时,甚至可能强制要求对某些只能初始化一次的 bean 应用注释。 如果 Bean 是“不可变的”,则必须对 bean withe 进行注释,或者在属性键下指定类名:@RefreshScope
@RefreshScope
spring.cloud.refresh.extra-refreshable
如果你哈瓦阿豆那是,它不可能是 刷新。它是 的默认值。选择一个 不同的实现,如果你需要刷新它。 |
刷新作用域 bean 是惰性代理,在使用它们时(即调用方法时)进行初始化,作用域充当初始化值的缓存。 要强制 Bean 在下一次方法调用时重新初始化,必须使其缓存条目无效。
这是上下文中的 bean,并且有一个 public 方法,可以通过清除目标缓存来刷新范围内的所有 bean。 端点公开此功能(通过 HTTP 或 JMX)。 要按名称刷新单个 bean,还有一个方法。RefreshScope
refreshAll()
/refresh
refresh(String)
若要公开终结点,需要向应用程序添加以下配置:/refresh
management:
endpoints:
web:
exposure:
include: refresh
|
1.10. 加密和解密
Spring Cloud有一个预处理器,用于在本地解密属性值。 它遵循与Spring Cloud Config Server相同的规则,并具有相同的外部配置。 因此,您可以以以下形式使用加密值,并且只要存在有效的密钥,它们就会在主应用程序上下文获取设置之前解密。 要在应用程序中使用加密功能,您需要在类路径中包含 Spring Security RSA(Maven 坐标:),并且还需要在 JVM 中使用全强度的 JCE 扩展。Environment
encrypt.*
cipher*
Environment
org.springframework.security:spring-security-rsa
如果由于“非法密钥大小”而出现异常,并且使用 Sun 的 JDK,则需要安装 Java 加密扩展 (JCE) 无限强度管辖策略文件。 有关详细信息,请参阅以下链接:
- Java 6 JCE
- Java 7 JCE
- Java 8 JCE
将文件解压缩到您使用的任何版本的 JRE/JDK x64/x86 的 JDK/jre/lib/security 文件夹中。
1.11. 端点
对于 Spring 引导执行器应用程序,可以使用一些额外的管理端点。您可以使用:
-
POST
TOTO 更新和重新绑定和日志级别。 若要启用此终结点,必须设置。/actuator/env
Environment
@ConfigurationProperties
management.endpoint.env.post.enabled=true
-
/actuator/refresh
以重新加载引导上下文并刷新 Bean。@RefreshScope
-
/actuator/restart
关闭并重新启动它(默认禁用)。ApplicationContext
-
/actuator/pause
并用于调用方法(安东)。/actuator/resume
Lifecycle
stop()
start()
ApplicationContext
如果禁用端点,则端点 也将被禁用,因为它们只是一个特例。 |
2. 春云共享:常见抽象
服务发现、负载平衡和断路器等模式适合于一个通用的抽象层,所有 Spring Cloud 客户端都可以使用该抽象层,而与实现无关(例如,使用 Eureka 或 Consul 进行发现)。
2.1. 注释@EnableDiscoveryClient
Spring Cloud Commons提供注释。 这寻找与 theand 接口的实现。 发现客户端的实现在密钥下添加一个配置类。 实现示例包括Spring CloudNetflix Eureka,Spring Cloud Consul Discovery和Spring Cloud Zookeeper Discovery。@EnableDiscoveryClient
DiscoveryClient
ReactiveDiscoveryClient
META-INF/spring.factories
spring.factories
org.springframework.cloud.client.discovery.EnableDiscoveryClient
DiscoveryClient
默认情况下,Spring Cloud 将同时提供阻塞和反应式服务发现客户端。 您可以通过设置器轻松禁用阻塞和/或反应式客户端。 要完全禁用服务发现,您只需进行设置。spring.cloud.discovery.blocking.enabled=false
spring.cloud.discovery.reactive.enabled=false
spring.cloud.discovery.enabled=false
默认情况下,实现自动将本地 Spring 引导服务器注册到远程发现服务器。 可以通过设置来禁用此行为。DiscoveryClient
autoRegister=false
@EnableDiscoveryClient
|
2.1.1. 健康指标
共享资源自动配置以下 Spring 引导健康指示器。
发现客户端健康指示器
此运行状况指示器基于当前注册的实现。DiscoveryClient
- 要完全禁用,请设置。
spring.cloud.discovery.client.health-indicator.enabled=false
- 要禁用描述字段,请设置。 否则,它可能会像卷起一样冒泡。
spring.cloud.discovery.client.health-indicator.include-description=false
description
HealthIndicator
- 要禁用服务检索,请设置。 默认情况下,指标调用客户端的方法。在具有许多注册服务的部署中,也可能 在每次检查期间检索所有服务的成本很高。这将跳过服务检索,而是使用客户端的方法。
spring.cloud.discovery.client.health-indicator.use-services-query=false
getServices
probe
DiscoveryCompositeHealthContributor
此复合健康指标基于所有注册的豆类。要禁用, 设置。DiscoveryHealthIndicator
spring.cloud.discovery.client.composite-indicator.enabled=false
2.1.2. 订购发现客户端实例
DiscoveryClient
接口扩展。这在使用多个发现时很有用 客户端,因为它允许您定义返回的发现客户端的顺序,类似于 如何订购由 Spring 应用程序加载的 bean。默认情况下,anyis 的顺序设置为 。如果您想为自定义实现设置不同的顺序,只需覆盖 方法,以便它返回适合您的设置的值。除此之外,您还可以使用 属性,用于设置Spring Cloud等提供的实现顺序。为此,您只需要将(orfor Eureka)属性设置为所需的值。Ordered
DiscoveryClient
0
DiscoveryClient
getOrder()
DiscoveryClient
ConsulDiscoveryClient
EurekaDiscoveryClient
ZookeeperDiscoveryClient
spring.cloud.clientIdentifier.discovery.order
eureka.client.order
2.1.3. 简单发现客户端
如果没有服务注册表支持,则将使用类路径,实例,该类路径使用属性来获取有关服务和实例的信息。DiscoveryClient
SimpleDiscoveryClient
有关可用实例的信息应按以下格式传递给 via 属性:,其中公共前缀,然后站立 表示相关服务的 ID,同时表示实例的索引号 (如示例中所示,索引以开头),然后值 实例可用的实际 URI。spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080
spring.cloud.discovery.client.simple.instances
service1
[0]
0
uri
2.2. 服务注册表
共享资源现在提供了一个接口,该接口提供了诸如and之类的方法,使您可以提供自定义注册 services.is 标记接口。ServiceRegistry
register(Registration)
deregister(Registration)
Registration
以下示例显示了它们的用法:ServiceRegistry
@Configuration
@EnableDiscoveryClient(autoRegister=false)
public class MyConfiguration
private ServiceRegistry registry;
public MyConfiguration(ServiceRegistry registry)
this.registry = registry;
// called through some external process, such as an event or a custom actuator endpoint
public void register()
Registration registration = constructRegistration();
this.registry.register(registration);
每个实现都有自己的实现。ServiceRegistry
Registry
-
ZookeeperRegistration
与ZookeeperServiceRegistry
-
EurekaRegistration
与EurekaServiceRegistry
-
ConsulRegistration
与ConsulServiceRegistry
如果您使用的是接口,则需要传递 正确实现实现你 正在使用。ServiceRegistry
Registry
ServiceRegistry
2.2.1. 服务注册中心自动注册
默认情况下,该实现会自动注册正在运行的服务。 要禁用该行为,您可以设置: *永久禁用自动注册。 *通过配置禁用该行为。ServiceRegistry
@EnableDiscoveryClient(autoRegister=false)
spring.cloud.service-registry.auto-registration.enabled=false
服务注册表自动注册事件
服务自动注册时将触发两个事件。调用的第一个事件在注册服务之前触发。第二个 调用的事件在注册服务后触发。您可以注册一个 () 来侦听和响应这些事件。InstancePreRegisteredEvent
InstanceRegisteredEvent
ApplicationListener
如果属性设置为 ,则不会触发这些事件。 |
2.2.2. 服务注册表执行器端点
Spring Cloud Commons提供了一个执行器端点。 此端点依赖于 Spring 应用程序上下文中的 abean。 使用 GET 调用返回的状态。 将 POST 用于具有 JSON 正文的同一终结点会将当前状态更改为新值。 JSON 正文必须包含具有首选值的字段。 请参阅更新状态时用于允许值的实现文档以及为状态返回的值。 例如,尤里卡支持的状态是,,,和。/service-registry
Registration
/service-registry
Registration
Registration
status
ServiceRegistry
UP
DOWN
OUT_OF_SERVICE
UNKNOWN
2.3. Spring Rest模板作为负载均衡器客户端
您可以将 a配置为使用负载均衡器客户端。 若要创建负载平衡,请创建 aand 使用均衡器,如以下示例所示:RestTemplate
RestTemplate
RestTemplate
@Bean
@LoadBalanced
@Configuration
public class MyConfiguration
@LoadBalanced
@Bean
RestTemplate restTemplate()
return new RestTemplate();
public class MyClass
@Autowired
private RestTemplate restTemplate;
public String doOtherStuff()
String results = restTemplate.getForObject("http://stores/stores", String.class);
return results;
Abean 不再通过自动配置创建。 必须由各个应用程序创建。 |
URI 需要使用虚拟主机名(即服务名称,而不是
以上是关于Spring Cloud 云原生应用的主要内容,如果未能解决你的问题,请参考以下文章
阿里云ACM:云原生配置管理利器,让云上的Spring Cloud应用配置管理舞动起来
如何轻松地在不同平台上运行Spring Cloud微服务,通过示例演示云原生应用程序的真正威力