Spring认证中国教育管理中心-ApacheGeode的Spring数据教程九

原标题:Spring认证中国教育管理中心-Apache Geode 的 Spring 数据教程九(Spring中国教育管理中心)

6. 使用注解用 Spring Container 引导 Apache Geode

Spring Data for Apache Geode (SDG) 2.0 引入了一个新的基于注释的配置模型,以使用 Spring 容器配置和引导 Apache Geode。

在 Spring 上下文中引入基于注解的 Apache Geode 配置方法的主要动机是使 Spring 应用程序开发人员能够尽可能快速 、轻松地启动和运行。

让我们开始吧!

如果您想更快地开始,请参阅快速入门部分。

6.1.介绍

考虑到所有配置属性 和不同的配置选项,Apache Geode 可能难以正确设置和使用 :

Java APIcache.xml带集群配置的Gfsh基于 Spring XML/Java 的配置

不同的受支持拓扑会产生进一步的复杂性:

(客户端/服务器点对点广域网)分布式系统设计模式 (例如无共享架构)。

基于注释的配置模型旨在简化所有这些以及更多。

基于注释的配置模型是使用 Spring Data for Apache Geode 的 XML 命名空间的基于 XML 的配置的替代方法。使用 XML,您可以使用gfeXML 模式进行配置,使用gfe-dataXML 模式进行数据访问。

从 SDG 2.0 开始,基于注释的配置模型尚不支持 Apache Geode 的 WAN 组件和拓扑结构的配置。

与 Spring Boot 一样,Spring Data for Apache Geode 基于注解的配置模型被设计为一种使用 Apache Geode 的自以为是的、约定优于配置的方法。事实上,这个基于注解的配置模型的灵感来自 Spring Boot 以及其他几个 Spring 和 Spring Data 项目。

按照惯例,所有注释都为所有配置属性提供合理且合理的默认值。给定注释属性的默认值直接对应于 Apache Geode 中为相同配置属性提供的默认值。

目的是让您通过在 Spring@Configuration或@SpringBootApplication类上声明适当的注释来启用 Apache Geode 功能或嵌入式服务,而无需为了使用功能或服务而不必要地配置大量属性。

再次,入门,快速和容易,是首要目标。

但是,如果您需要,可以自定义 Apache Geode 的配置元数据和行为的选项,并且 Spring Data for Apache Geode 基于注释的配置悄悄地退缩了。您只需要指定要调整的配置属性。此外,正如我们将在本文档后面看到的,有几种方法可以使用注释来配置 Apache Geode 功能或嵌入式服务。

您可以Annotations在org.springframework.data.gemfire.config.annotation 包中找到所有新的 SDG Java 。

6.2.使用 Spring 配置 Apache Geode 应用程序

与所有通过使用 注释应用程序类开始的 Spring Boot 应用程序一样@SpringBootApplication,Spring Boot 应用程序可以通过声明三个主要注释中的任何一个来轻松成为 Apache Geode 缓存应用程序:

@ClientCacheApplication@PeerCacheApplication@CacheServerApplication

这三个注解是 Spring 应用程序开发人员在使用 Apache Geode 时的起点。

要实现这些注释背后的意图,您必须了解可以使用 Apache Geode 创建两种类型的缓存实例:客户端缓存或对等缓存。

您可以将 Spring Boot 应用程序配置为具有 实例的 Apache Geode 缓存客户端ClientCache,它可以与用于管理应用程序数据的现有 Apache Geode 服务器集群进行通信。客户端-服务器拓扑是使用 Apache Geode 时最常用的系统架构,您可以使 Spring Boot 应用程序成为带有ClientCache实例的缓存客户端,只需使用 @ClientCacheApplication.

或者,Spring Boot 应用程序可能是 Apache Geode 集群的对等成员。也就是说,应用程序本身只是管理数据的服务器集群中的另一台服务器。春季启动应用程序创建一个“嵌入式”,同行Cache例如,当您使用注释应用程序类@PeerCacheApplication。

通过扩展,对等缓存应用程序也可以作为一个服务器CacheServer,允许缓存客户端连接并在服务器上执行数据访问操作。这是通过用@CacheServerApplication代替注释应用程序类来完成 的@PeerCacheApplication,这会创建一个对等Cache实例以及CacheServer允许缓存客户端连接的 。

默认情况下,Apache Geode 服务器不一定是缓存服务器。也就是说,服务器不一定只是因为它是服务器而设置为为缓存客户端提供服务。Apache Geode 服务器可以是集群管理数据的对等成员(数据节点),而不为任何客户端提供服务,而集群中的其他对等成员确实设置为除了管理数据之外还为客户端提供服务。还可以将集群中的某些对等成员设置为非数据节点,称为数据访问器,它们不存储数据,但充当为客户端提供服务的代理CacheServers。Apache Geode 支持许多不同的拓扑和集群安排,但超出了本文档的范围。

举例来说,如果您想创建一个 Spring Boot 缓存客户端应用程序,请从以下开始:

基于 Spring 的 Apache GeodeClientCache应用

@SpringBootApplication @ClientCacheApplication class ClientApplication { .. }

或者,如果您想创建一个带有嵌入式对等Cache实例的 Spring Boot 应用程序,您的应用程序将是由 Apache Geode 形成的集群(分布式系统)的服务器和对等成员,请从以下开始:

基于 Spring 的 Apache Geode 嵌入式对等Cache应用程序

@SpringBootApplication @PeerCacheApplication class ServerApplication { .. }

或者,您可以使用@CacheServerApplication注解代替@PeerCacheApplication来创建嵌入式对等Cache实例以及CacheServer运行于localhost、侦听默认缓存服务器端口 的实例40404,如下所示:

基于 Spring 的 Apache Geode 嵌入式对等Cache应用程序CacheServer

@SpringBootApplication @CacheServerApplication class ServerApplication { .. }

6.3.客户端/服务器应用程序详解

客户端可以通过多种方式连接到 Apache Geode 集群中的服务器并与之通信。最常见和推荐的方法是使用 Apache Geode Locators。

缓存客户端可以连接到 Apache Geode 集群中的一个或多个定位器,而不是直接连接到 CacheServer. 与直接CacheServer连接相比,使用定位器的优势在于定位器提供有关客户端连接到的集群的元数据。此元数据包括诸如哪些服务器包含感兴趣的数据或哪些服务器的负载量最少等信息。Pool结合定位器的客户端还提供故障转移功能,以防发生CacheServer崩溃。通过PARTITION在客户端中启用区域 (PR) 单跳功能,客户Pool端将直接路由到包含客户端请求和需要的数据的服务器。

定位器也是集群中的对等成员。定位器实际上构成了 Apache Geode 节点集群。即所有通过 Locator 连接的节点都是集群中的 peer,新成员使用 Locator 加入集群并寻找其他成员。

默认情况下,Apache Geode 设置一个“DEFAULT”,Pool连接到一个CacheServer正在运行的localhost,在创建实例40404时监听的端口ClientCache。ACacheServer侦听 port 40404,接受所有系统 NIC 上的连接。您无需执行任何特殊操作即可使用客户端-服务器拓扑。只需使用 注释您的服务器端 Spring Boot 应用程序@CacheServerApplication和您的客户端 Spring Boot 应用程序@ClientCacheApplication,您就可以开始了。

如果您愿意,您甚至可以使用 Gfsh 的start server命令启动您的服务器。@ClientCacheApplication 无论它是如何启动的,您的 Spring Boot仍然可以连接到服务器。但是,您可能更喜欢使用 Spring Data for Apache Geode 方法来配置和启动服务器,因为正确注释的 Spring Boot 应用程序类更直观且更易于调试。

作为应用程序开发人员,您无疑希望自定义PoolApache Geode 设置的“DEFAULT”以可能连接到一个或多个定位器,如以下示例所示:

ClientCache使用定位器的基于 Spring 的 Apache Geode应用程序

@SpringBootApplication @ClientCacheApplication(locators = { @Locator(host = "boombox" port = 11235), @Locator(host = "skullbox", port = 12480) }) class ClientApplication { .. }

除了locators属性之外,@ClientCacheApplication注释还有一个servers属性。如有必要,该servers属性可用于指定一个或多个嵌套@Server注释,让缓存客户端直接连接到一个或多个服务器。

您可以使用locatorsorservers属性,但不能同时使用两者(这是由 Apache Geode 强制执行的)。

您还可以使用 和注释配置其他Pool实例(Pool当ClientCache使用@ClientCacheApplication注释创建实例时,Apache Geode 提供的“DEFAULT”除外)。@EnablePool@EnablePools

@EnablePools是一个复合注释,它聚合@EnablePool了单个类上的多个嵌套注释。Java 8 及更早版本不允许在单个类上声明多个相同类型的注释。

以下示例使用@EnablePool和@EnablePools注释:

ClientCache使用多个命名的基于 Spring 的 Apache Geode应用程序Pools

@SpringBootApplication @ClientCacheApplication(logLevel = "info") @EnablePool(name = "VenusPool", servers = @Server(host = "venus", port = 48484), min-connections = 50, max-connections = 200, ping-internal = 15000, prSingleHopEnabled = true, readTimeout = 20000, retryAttempts = 1, subscription-enable = true) @EnablePools(pools = { @EnablePool(name = "SaturnPool", locators = @Locator(host="skullbox", port=20668), subsription-enabled = true), @EnablePool(name = "NeptunePool", severs = { @Server(host = "saturn", port = 41414), @Server(host = "neptune", port = 42424) }, min-connections = 25)) }) class ClientApplication { .. }

该name属性是@EnablePool注释的唯一必需属性。正如我们稍后将看到的,name属性的值对应Pool于在 Spring 容器中创建的bean 的名称以及用于引用相应配置属性的名称。它也是PoolApache Geode 注册和使用的名称。

同样,在服务器上,您可以配置CacheServers客户端可以连接的多个,如下所示:

CacheServer使用多个命名的基于 Spring 的 Apache Geode应用程序CacheServers

@SpringBootApplication @CacheSeverApplication(logLevel = "info", autoStartup = true, maxConnections = 100) @EnableCacheServer(name = "Venus", autoStartup = true, hostnameForClients = "venus", port = 48484) @EnableCacheServers(servers = { @EnableCacheServer(name = "Saturn", hostnameForClients = "saturn", port = 41414), @EnableCacheServer(name = "Neptune", hostnameForClients = "neptune", port = 42424) }) class ServerApplication { .. }

Like @EnablePools,@EnableCacheServers是一个复合注释,用于@EnableCacheServer 在单个类上聚合多个注释。同样,Java 8 及更早版本不允许在单个类上声明多个相同类型的注释。

细心的读者可能已经注意到的一件事是,在所有情况下,您都为所有主机名、端口和面向配置的注释属性指定了硬编码值。当应用程序被提升并部署到不同的环境时,这并不理想,例如从 DEV 到 QA,再到 STAGING 到 PROD。

下一节介绍如何处理在运行时确定的动态配置。

6.4.配置和引导定位器

除了 Apache Geode Cache 应用程序,您还可以创建 Apache Geode Locator 应用程序。

Apache Geode Locator 是一个 JVM 进程,它允许节点作为对等成员加入 Apache Geode 集群。定位器还使客户端能够发现集群中的服务器。定位器向客户端提供元数据,以在集群中的成员之间均匀地平衡负载,启用单跳数据访问操作以及其他操作。

对定位器的完整讨论超出了本文档的范围。鼓励读者阅读 Apache Geode用户指南 ,了解有关定位器及其在集群中的作用的更多详细信息。

要配置和引导独立的定位器进程,请执行以下操作:

Spring Boot、Apache Geode Locator 应用程序

@SpringBootApplication @LocatorApplication(port = 12345) class LocatorApplication { ... }

您可以在集群中启动多个定位器。唯一的要求是成员名称在集群中必须是唯一的。使用注释的name属性来相应@LocatorApplication地命名集群中的成员 Locator。或者,您可以spring.data.gemfire.locator.name在 Spring Boot 的 application.properties.

此外,如果您在同一台机器上分叉多个定位器,则必须确保每个定位器都在唯一的端口上启动。设置port注释属性或spring.data.gemfire.locator.port属性。

然后,您可以在由 Locator 或 Locators 加入的集群中启动 1 个或多个 Apache Geode 对等缓存成员,这些成员也使用 Spring 进行配置和引导,如下所示:

Spring Boot,Apache Geode CacheServerApplication 加入了 Locator on localhost, port12345

@SpringBootApplication @CacheServerApplication(locators = "localhost[12345]") class ServerApplication { ... }

同样,您可以根据需要启动任意数量的ServerApplication类,这些类由上面的定位器加入。您只需要确保该成员的名称是唯一的。

@LocatorApplication用于配置和引导独立的 Apache Geode Locator 应用程序进程。这个过程只能是一个定位器,没有别的。如果您尝试使用缓存实例启动 Locator,SDG 将抛出错误。

如果要同时启动缓存实例和嵌入式定位器,则应改用@EnableLocator注释。

在开发过程中启动嵌入式定位器很方便。但是,强烈建议您在生产中运行独立的 Locator 进程以获得高可用性。如果集群中的所有定位器都出现故障,则集群将保持不变,但是,没有新成员能够加入集群,这对于线性扩展以满足需求很重要。

有关 更多详细信息,请参阅配置嵌入式定位器部分。

6.5.运行时配置使用Configurers

设计基于注解的配置模型时的另一个目标是在注解属性中保持类型安全。例如,如果配置属性可以表示为int(例如端口号),则该属性的类型应该是int。

不幸的是,这不利于运行时的动态和可解析配置。

Spring 更精细的特性之一是能够在 Spring 容器中配置 bean 时在配置元数据的属性或属性中使用属性占位符和 SpEL 表达式。但是,这将要求所有注释属性都是 type String,从而放弃类型安全,这是不可取的。

因此,Apache Geode 的 Spring Data 借鉴了 Spring 中另一个常用的模式,Configurers. Configurer Spring Web MVC 提供了许多不同的接口,包括 org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer.

该Configurers设计模式使应用程序开发人员能够在启动时接收回调以自定义组件或 bean 的配置。框架回调用户提供的代码以在运行时调整配置。这种模式更常见的用途之一是根据应用程序的运行时环境提供条件配置。

Spring Data for Apache Geode 提供了几个Configurer回调接口来在运行时自定义基于注解的配置元数据的不同方面,在注解创建的 Spring 管理的 bean 被初始化之前:

CacheServerConfigurerClientCacheConfigurerContinuousQueryListenerContainerConfigurerDiskStoreConfigurerIndexConfigurerPeerCacheConfigurerPoolConfigurerRegionConfigurerGatewayReceiverConfigurerGatewaySenderConfigurer

例如,您可以使用CacheServerConfigurer和ClientCacheConfigurer分别自定义 Spring BootCacheServer和ClientCache应用程序使用的端口号。

考虑来自服务器应用程序的以下示例:

自定义 Spring BootCacheServer应用程序CacheServerConfigurer

@SpringBootApplication @CacheServerApplication(name = "SpringServerApplication") class ServerApplication { @Bean CacheServerConfigurer cacheServerPortConfigurer( @Value("${gemfire.cache.server.host:localhost}") String cacheServerHost @Value("${gemfire.cache.server.port:40404}") int cacheServerPort) { return (beanName, cacheServerFactoryBean) -> { cacheServerFactoryBean.setBindAddress(cacheServerHost); cacheServerFactoryBean.setHostnameForClients(cacheServerHost); cacheServerFactoryBean.setPort(cacheServerPort); }; } }

接下来,考虑来自客户端应用程序的以下示例:

自定义 Spring BootClientCache应用程序ClientCacheConfigurer

@SpringBootApplication @ClientCacheApplication class ClientApplication { @Bean ClientCacheConfigurer clientCachePoolPortConfigurer( @Value("${gemfire.cache.server.host:localhost}") String cacheServerHost @Value("${gemfire.cache.server.port:40404}") int cacheServerPort) { return (beanName, clientCacheFactoryBean) -> clientCacheFactoryBean.setServers(Collections.singletonList( new ConnectionEndpoint(cacheServerHost, cacheServerPort))); } }

通过使用提供的Configurers,您可以接收回调以进一步自定义在运行时、启动期间由关联注释启用的配置。

另外,当Configurer在Spring容器中声明为bean时,bean定义可以利用其他Spring容器的特性,例如属性占位符、使用@Value工厂方法参数注解的SpEL表达式等。

ConfigurersSpring Data for Apache Geode 提供的所有回调都需要两个信息:注解在 Spring 容器中创建的 bean 的名称和FactoryBean注解用来创建和配置 Apache Geode 组件的引用(例如,ClientCache使用ClientCacheFactoryBean)创建和配置实例。

SDGFactoryBeans是 SDG 公共 API 的一部分,如果未提供这种新的基于注解的配置模型,您将在 Spring 的 基于 Java 的容器配置中使用它。事实上,注释本身也在使用这些相同FactoryBeans 的配置。因此,从本质上讲,注释是一个外观,为方便起见提供了一个额外的抽象层。

鉴于Configurer可以像任何其他 POJO 一样将 a声明为常规 bean 定义,您可以组合不同的 Spring 配置选项,例如使用 Spring Profiles 并Conditions使用属性占位符和 SpEL 表达式。这些和其他漂亮的功能让您可以创建更加复杂和灵活的配置。

然而,Configurers并不是唯一的选择。

内容来源:Spring中国教育管理中心(Spring认证)

2021年2月,VMware公司正式与北京中科卓望网络科技有限公司(以下简称:中科卓望)达成战略合作,授予其 Spring 中国教育管理中心,携手 VMware 全球最新 Spring技术和认证体系,帮助中国院校构建专业教学内容,全面赋能未来开发人。