构建应用程序的过程Apache Geode数据管理系统

时间:2022-12-22 11:30:38

构建应用程序的过程Apache Geode数据管理系统

本指南将引导您完成构建应用程序的过程Apache Geode数据管理系统。

您将构建什么

您将使用Apache Geode 的春季数据存储和检索 POJO。

你需要什么

  • 约15分钟
  • 最喜欢的文本编辑器或 IDE
  • JDK 1.8或以后
  • 格拉德尔 4+​或梅文 3.2+
  • 您也可以将代码直接导入到 IDE 中:
  • 弹簧工具套件 (STS)
  • 智能理念
  • VSCode

如何完成本指南

像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。

要从头开始,请继续从 Spring 初始化开始.

要跳过基础知识,请执行以下操作:

  • 下载​并解压缩本指南的源存储库,或使用吉特:git clone https://github.com/spring-guides/gs-accessing-data-gemfire.git
  • 光盘成gs-accessing-data-gemfire/initial
  • 跳转到定义简单实体.

完成后,您可以根据 中的代码检查结果。​​gs-accessing-data-gemfire/complete​

从 Spring 初始化开始

对于所有 Spring 应用程序,您应该从Spring Initializr.Spring Initializr 提供了一种快速的方式来提取应用程序所需的所有依赖项,并为您完成大量设置。这个例子需要 Spring for Apache Geode 依赖项。

你可以使用这个预初始化项目,然后单击生成以下载 ZIP 文件。此项目配置为适合本教程中的示例。

手动初始化项目:

  1. 在 Web 浏览器中,导航到https://start.spring.io.此服务拉入应用程序所需的所有依赖项,并为您完成大部分设置。
  2. 选择 Gradle 或 Maven 以及您要使用的语言。本指南假定您选择了 Java。
  3. 单击依赖关系,然后选择 Spring for Apache Geode
  4. 单击生成
  5. 下载生成的 ZIP 文件,该文件是配置了您选择的 Web 应用程序的存档。

如果您的 IDE 集成了 Spring Initializr,则可以从 IDE 完成此过程。

您也可以从 Github 分叉项目,然后在 IDE 或其他编辑器中打开它。

定义简单实体

Apache Geode 是一个内存数据网格 (IMDG),用于将数据映射到区域。您可以配置分布式区域,以便在群集中的多个节点之间对数据进行分区和复制。但是,在本指南中,我们使用了一个区域,因此您无需设置任何额外的内容,例如整个服务器集群。​​LOCAL​

Apache Geode 是一个键/值存储,一个区域实现接口。虽然你可以把一个区域看作一个,它比一个简单的Java要复杂得多,因为数据是在区域内分发、复制和管理的。​​java.util.concurrent.ConcurrentMap​​​​java.util.Map​​​​Map​

在此示例中,仅使用几个注释将对象存储在 Apache Geode(一个区域)中。​​Person​

​src/main/java/hello/Person.java​

package hello;

import java.io.Serializable;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.gemfire.mapping.annotation.Region;

import lombok.Getter;

@Region(value = "People")
public class Person implements Serializable {

@Id
@Getter
private final String name;

@Getter
private final int age;

@PersistenceConstructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return String.format("%s is %d years old", getName(), getAge());
}
}

这里有一个包含两个字段的类:和 。您还有一个持久性构造函数,用于在创建新实例时填充实体。该类使用​​Person​​​​name​​​​age​​龙目岛计划以简化实施。

请注意,此类用 .当 Apache Geode 存储此类的实例时,会在区域内创建一个新条目。此类还用 标记字段。这表示用于识别和跟踪 Apache Geode 内部数据的标识符。本质上,带注释的字段(例如)是键,实例是键/值条目中的值。Apache Geode 中没有自动生成密钥,因此您必须在将实体保存到 Apache Geode 之前设置 ID(该)。​​@Region("People")​​​​People​​​​name​​​​@Id​​​​Person​​​​@Id​​​​name​​​​Person​​​​name​

下一个重要的部分是人的年龄。在本指南的后面部分,我们将使用它来设计一些查询。

重写的方法打印出人员的姓名和年龄。​​toString()​

创建简单查询

Spring Data for Apache Geode 专注于使用 Spring 在 Apache Geode 中存储和访问数据。它还继承了Spring Data Commons项目的强大功能,例如派生查询的能力。从本质上讲,您不需要学习Apache Geode(OQL)的查询语言。您可以编写一些方法,框架会为您编写查询。

要查看其工作原理,请创建一个接口来查询存储在 Apache Geode 中的对象:​​Person​

​src/main/java/hello/PersonRepository.java​

package hello;

import org.springframework.data.gemfire.repository.query.annotation.Trace;
import org.springframework.data.repository.CrudRepository;

public interface PersonRepository extends CrudRepository<Person, String> {

@Trace
Person findByName(String name);

@Trace
Iterable<Person> findByAgeGreaterThan(int age);

@Trace
Iterable<Person> findByAgeLessThan(int age);

@Trace
Iterable<Person> findByAgeGreaterThanAndAgeLessThan(int greaterThanAge, int lessThanAge);

}

​PersonRepository​​从 Spring 数据共享扩展接口,并为存储库使用的值和 ID(键)指定通用类型参数的类型(分别为 和 )。此接口附带许多操作,包括基本的 CRUD(创建、读取、更新、删除)和简单的查询数据访问操作(例如 )。​​CrudRepository​​​​Person​​​​String​​​​findById(..)​

您可以根据需要通过声明其方法签名来定义其他查询。在这种情况下,我们添加 ,它本质上搜索类型的对象并找到与 .​​findByName​​​​Person​​​​name​

您还有:

  • ​findByAgeGreaterThan​​:寻找一定年龄以上的人
  • ​findByAgeLessThan​​:查找未满一定年龄的人
  • ​findByAgeGreaterThanAndAgeLessThan​​:寻找特定年龄段的人

让我们把它连接起来,看看它是什么样子的!

创建应用程序类

下面的示例创建一个包含所有组件的应用程序类:

​src/main/java/hello/Application.java​

package hello;

import static java.util.Arrays.asList;
import static java.util.stream.StreamSupport.stream;

import org.apache.geode.cache.client.ClientRegionShortcut;

import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.config.annotation.EnableEntityDefinedRegions;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;

@SpringBootApplication
@ClientCacheApplication(name = "AccessingDataGemFireApplication")
@EnableEntityDefinedRegions(
basePackageClasses = Person.class,
clientRegionShortcut = ClientRegionShortcut.LOCAL
)
@EnableGemfireRepositories
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
ApplicationRunner run(PersonRepository personRepository) {

return args -> {

Person alice = new Person("Adult Alice", 40);
Person bob = new Person("Baby Bob", 1);
Person carol = new Person("Teen Carol", 13);

System.out.println("Before accessing data in Apache Geode...");

asList(alice, bob, carol).forEach(person -> System.out.println("\t" + person));

System.out.println("Saving Alice, Bob and Carol to Pivotal GemFire...");

personRepository.save(alice);
personRepository.save(bob);
personRepository.save(carol);

System.out.println("Lookup each person by name...");

asList(alice.getName(), bob.getName(), carol.getName())
.forEach(name -> System.out.println("\t" + personRepository.findByName(name)));

System.out.println("Query adults (over 18):");

stream(personRepository.findByAgeGreaterThan(18).spliterator(), false)
.forEach(person -> System.out.println("\t" + person));

System.out.println("Query babies (less than 5):");

stream(personRepository.findByAgeLessThan(5).spliterator(), false)
.forEach(person -> System.out.println("\t" + person));

System.out.println("Query teens (between 12 and 20):");

stream(personRepository.findByAgeGreaterThanAndAgeLessThan(12, 20).spliterator(), false)
.forEach(person -> System.out.println("\t" + person));
};
}
}

在配置中,您需要添加注释。​​@EnableGemfireRepositories​

  • 默认情况下,扫描当前包以查找扩展 Spring Data 的存储库接口之一的任何接口。您可以使用它安全地告诉 Spring Data for Apache Geode 按类型扫描不同的根包,以查找特定于应用程序的存储库扩展。@EnableGemfireRepositoriesbasePackageClasses = MyRepository.class

需要包含一个或多个区域的 Apache Geode 缓存来存储所有数据。为此,您可以使用 Spring Data 之一进行 Apache Geode 方便的基于配置的注释:、 或 。​​@ClientCacheApplication​​​​@PeerCacheApplication​​​​@CacheServerApplication​

Apache Geode支持不同的缓存拓扑,例如客户端/服务器,点对点(p2p),甚至WAN安排。在 p2p 中,对等缓存实例嵌入在应用程序中,您的应用程序将能够作为对等缓存成员参与集群。但是,您的应用程序受到集群中作为对等成员的所有约束,因此这不像客户端/服务器拓扑那样常用。

在我们的例子中,我们使用创建一个“客户端”缓存实例,该实例能够连接到服务器集群并与之通信。但是,为简单起见,客户端使用客户端区域在本地存储数据,而无需设置或运行任何服务器。​​@ClientCacheApplication​​​​LOCAL​

现在,请记住您如何标记要存储在使用 SDG 映射注释调用的区域中,?您可以使用 Bean 定义在此处定义该区域。您需要注入刚刚定义的缓存实例,同时还要命名它。​​Person​​​​People​​​​@Region("People")​​​​ClientRegionFactoryBean<String, Person>​​​​People​

Apache Geode 缓存实例(无论是对等方还是客户端)只是存储数据的区域的容器。您可以将缓存视为 RDBMS 中的架构,将区域视为表。但是,缓存还执行其他管理功能来控制和管理您的所有区域。

类型为 ,将键类型 () 与值类型 () 匹配。​​<String, Person>​​​​String​​​​Person​

该方法使用 Spring Boot 启动应用程序并调用(另一个 Bean 定义),该定义使用应用程序的 Spring 数据存储库在 Apache Geode 上执行数据访问操作。​​public static void main​​​​SpringApplication.run()​​​​ApplicationRunner​

应用程序会自动连接您刚刚定义的实例。Spring Data for Apache Geode 动态创建一个具体类来实现此接口并插入所需的查询代码以满足接口的义务。该方法使用此存储库实例来演示功能。​​PersonRepository​​​​run()​

存储和获取数据

在本指南中,您将创建三个本地对象:AliceBaby Bob 和 Teen Carol。最初,它们仅存在于内存中。创建它们后,您必须将它们保存到Apache Geode。​​Person​

现在,您可以运行多个查询。第一个按名称查找每个人。然后,您可以使用 age 属性运行一些查询来查找成人、婴儿和青少年。打开日志记录后,您可以看到 Spring Data for Apache Geode 代表您写入的查询。

要查看由 SDG 生成的 Apache Geode OQL 查询,请将注释属性更改为 。由于查询方法(例如)是使用 SDG 的注释进行注释的,因此这将打开 Apache Geode 的 OQL 查询跟踪(查询级日志记录),它会显示生成的 OQL、执行时间、查询是否使用任何 Apache Geode 索引来收集结果以及查询返回的行数。​​@ClientCacheApplication​​​​logLevel​​​​config​​​​findByName​​​​@Trace​

构建可执行的 JAR

您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。

如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./gradlew bootRun​​​​./gradlew build​

java -jar build/libs/gs-accessing-data-gemfire-0.1.0.jar

如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:​​./mvnw spring-boot:run​​​​./mvnw clean package​

java -jar target/gs-accessing-data-gemfire-0.1.0.jar

此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件.

您应该看到类似以下内容(包含其他内容,例如查询):

Before linking up with {apache-geode-name}...
Alice is 40 years old.
Baby Bob is 1 years old.
Teen Carol is 13 years old.
Lookup each person by name...
Alice is 40 years old.
Baby Bob is 1 years old.
Teen Carol is 13 years old.
Adults (over 18):
Alice is 40 years old.
Babies (less than 5):
Baby Bob is 1 years old.
Teens (between 12 and 20):
Teen Carol is 13 years old.

总结

祝贺!您设置了 Apache Geode 缓存客户端,存储了简单的实体,并开发了快速查询。