共计 7660 个字符,预计需要花费 20 分钟才能阅读完成。
Spring 认证指南:理解如何应用 Gemfire 的数据结构构建应用程序。(Spring 中国教育管理中心)
Spring 认证指南:理解如何应用 Gemfire 的数据结构构建应用程序
在 Pivotal GemFire 中拜访数据
本指南将疏导您实现构建 Apache Geode 数据管理系统应用程序的过程。
你将建造什么
您将应用 Spring Data for Apache Geode 来存储和检索 POJO。
你须要什么
约 15 分钟
最喜爱的文本编辑器或 IDE
JDK 1.8 或更高版本
Gradle 4+ 或 Maven 3.2+
您还能够将代码间接导入 IDE:
弹簧工具套件 (STS)
IntelliJ IDEA
如何实现本指南
像大多数 Spring 入门指南一样,您能够从头开始并实现每个步骤,也能够绕过您曾经相熟的根本设置步骤。无论哪种形式,您最终都会失去工作代码。
要从头开始,请持续从 Spring Initializr 开始。
要跳过基础知识,请执行以下操作:
下载并解压本指南的源代码库,或应用 Git 克隆它:git clone https://github.com/spring-gui…
光盘进入 gs-accessing-data-gemfire/initial
跳转到定义一个简略实体。
实现后,您能够对照中的代码查看后果
gs-accessing-data-gemfire/complete。
从 Spring Initializr 开始
对于所有 Spring 应用程序,您应该从 Spring Initializr 开始。Spring Initializr 提供了一种疾速的办法来获取应用程序所需的所有依赖项,并为您实现大量设置。此示例须要 Spring for Apache Geode 依赖项。
您能够应用这个事后初始化的我的项目并单击 Generate 下载 ZIP 文件。此我的项目配置为适宜本教程中的示例。
手动初始化我的项目:
在 Web 浏览器中,导航到 https://start.spring.io。该服务提取应用程序所需的所有依赖项,并为您实现大部分设置。
抉择 Gradle 或 Maven 以及您要应用的语言。本指南假设您抉择了 Java。
单击 Dependencies 并为 Apache Geode 抉择 Spring。
单击生成。
下载生成的 ZIP 文件,该文件是依据您的抉择配置的 Web 应用程序的存档。
如果您的 IDE 具备 Spring Initializr 集成,您能够从您的 IDE 实现此过程。
你也能够从 Github 上 fork 我的项目并在你的 IDE 或其余编辑器中关上它。
定义一个简略的实体
Apache Geode 是一种将数据映射到区域的内存中数据网格 (IMDG)。您能够配置在集群中的多个节点之间分区和复制数据的分布式区域。然而,在本指南中,咱们应用了一个 LOCAL 区域,因而您无需设置任何额定内容,例如整个服务器集群。
Apache Geode 是一个键 / 值存储,一个区域实现
java.util.concurrent.ConcurrentMap 接口。只管您能够将区域视为 java.util.Map,但它比简略的 Java 简单得多 Map,因为数据是在区域内散布、复制和治理的。
在此示例中,您 Person 仅应用几个正文将对象存储在 Apache Geode(一个区域)中。
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. 在创立新实例时,您还有一个长久构造函数来填充实体。该类应用 Project Lombok 来简化实现。
请留神,这个类是用 正文的 @Region(“People”)。当 Apache Geode 存储此类的实例时,会在该区 People 域内创立一个新条目。此类还 name 用 标记该字段 @Id。这示意用于辨认和跟踪 PersonApache Geode 外部数据的标识符。实质上,带 @Id 正文的字段(例如 name)是键,而 Person 实例是键 / 值条目中的值。Apache Geode 中没有主动生成密钥,因而您必须在 name 将实体长久化到 Apache Geode 之前设置 ID (the)。
下一个重要的局部是这个人的年龄。在本指南的前面局部,咱们应用它来设计一些查问。
被笼罩的 toString()办法打印出人的姓名和年龄。
创立简略查问
Spring Data for Apache Geode 专一于应用 Spring 在 Apache Geode 中存储和拜访数据。它还继承了 Spring Data Commons 我的项目的弱小性能,例如派生查问的能力。实质上,您不须要学习 Apache Geode (OQL) 的查询语言。您能够编写一些办法,框架会为您编写查问。
要查看其工作原理,请创立一个查问 Person 存储在 Apache Geode 中的对象的接口:
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 Data Commons 扩大接口,并为 RepositoryCrudRepository 应用的值和 ID(键)指定泛型类型参数的类型(别离为和)。该接口带有许多操作,包含根本的 CRUD(创立、读取、更新、删除)和简略的查问数据拜访操作(例如)。PersonStringfindById(..)
您能够依据须要通过申明其办法签名来定义其余查问。在这种状况下,咱们增加 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 注解。
默认状况下,@EnableGemfireRepositories 扫描以后包以查找扩大 Spring Data 存储库接口之一的任何接口。您能够应用它 basePackageClasses = MyRepository.class 来平安地通知 Spring Data for Apache Geode 按类型扫描不同的根包以获取特定于应用程序的存储库扩大。
须要蕴含一个或多个区域的 Apache Geode 缓存来存储所有数据。为此,您能够应用 Spring Data for Apache Geode 不便的基于配置的正文之一:@ClientCacheApplication、@PeerCacheApplication 或 @CacheServerApplication.
Apache Geode 反对不同的缓存拓扑,例如客户端 / 服务器、点对点 (p2p),甚至是 WAN 安顿。在 p2p 中,对等缓存实例嵌入在应用程序中,您的应用程序将可能作为对等缓存成员参加集群。然而,您的应用程序受到作为集群中对等成员的所有束缚,因而这不像客户端 / 服务器拓扑那样罕用。
在咱们的例子中,咱们应用 @ClientCacheApplication 创立一个“客户端”缓存实例,它可能连贯到服务器集群并与之通信。然而,为了简略起见,客户端通过应用 LOCAL 客户端区域在本地存储数据,而无需设置或运行任何服务器。
当初,还记得您是如何标记 Person 为存储在 People 应用 SDG 映射正文调用的区域中的 @Region(“People”)吗?您能够应用 ClientRegionFactoryBean<String, Person>bean 定义在此处定义该区域。您须要注入一个刚刚定义的缓存实例,同时命名它 People。
Apache Geode 缓存实例(无论是对等方还是客户端)只是存储数据的区域容器。您能够将缓存视为 RDBMS 中的模式,将区域视为表。然而,缓存还执行其余治理性能来管制和治理您的所有区域。
类型是,将键类型 () 与值类型 ()<String, Person> 匹配。StringPerson
该 public static void main 办法应用 Spring BootSpringApplication.run()启动应用程序并调用 ApplicationRunner(另一个 bean 定义),它应用应用程序的 Spring Data 存储库在 Apache Geode 上执行数据拜访操作。
PersonRepository 应用程序主动拆卸您刚刚定义的实例。Spring Data for Apache Geode 动态创建一个具体的类来实现这个接口并插入所需的查问代码来满足接口的任务。该 run()办法应用此存储库实例来演示性能。
存储和获取数据
在本指南中,您将创立三个本地 Person 对象:Alice、Baby Bob 和 Teen Carol。最后,它们只存在于内存中。创立它们后,您必须将它们保留到 Apache Geode。
当初您能够运行多个查问。第一个按名字查找每个人。而后,您能够应用 age 属性运行一些查问来查找成人、婴儿和青少年。关上日志记录后,您能够看到 Spring Data for Apache Geode 代表您编写的查问。
要查看 SDG 生成的 Apache Geode OQL 查问,请将 @ClientCacheApplication 正文 logLevel 属性更改为 config。因为查询方法(例如 findByName)应用 SDG 的 @Trace 注解进行了注解,所以这会关上 Apache Geode 的 OQL 查问跟踪(查问级日志记录),它会显示生成的 OQL、执行工夫、查问是否应用了任何 Apache Geode 索引来收集后果以及查问返回的行数。
构建一个可执行的 JAR
您能够应用 Gradle 或 Maven 从命令行运行应用程序。您还能够构建一个蕴含所有必要依赖项、类和资源的单个可执行 JAR 文件并运行它。构建可执行 jar 能够在整个开发生命周期、跨不同环境等中轻松地作为应用程序交付、版本化和部署服务。
如果您应用 Gradle,则能够应用./gradlew bootRun. 或者,您能够应用构建 JAR 文件./gradlew build,而后运行 JAR 文件,如下所示:
java -jar build/libs/gs-accessing-data-gemfire-0.1.0.jar
如果您应用 Maven,则能够应用./mvnw spring-boot:run. 或者,您能够应用构建 JAR 文件,./mvnw clean package 而后运行该 JAR 文件,如下所示:
java -jar 指标 /gs-accessing-data-gemfire-0.1.0.jar
此处形容的步骤创立了一个可运行的 JAR。您还能够构建经典的 WAR 文件。
您应该会看到相似这样的内容(带有其余内容,例如查问):
在与 {apache-geode-name} 链接之前 …
爱丽丝往年 40 岁。宝贝鲍勃 1 岁。青少年卡罗尔往年 13 岁。
按姓名查找每个人 …
爱丽丝往年 40 岁。宝贝鲍勃 1 岁。青少年卡罗尔往年 13 岁。
成人(18 岁以上):
爱丽丝往年 40 岁。
婴儿(5 岁以下):
宝贝鲍勃 1 岁。
青少年(12 至 20 岁):
青少年卡罗尔往年 13 岁。
概括
祝贺!您设置了一个 Apache Geode 缓存客户端,存储了简略的实体,并开发了疾速查问。