天天看點

Spring認證指南:了解如何使用 Gemfire 的資料結構建構應用程式

作者:IT膠囊
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-guides/gs-accessing-data-gemfire.git
  • CD光牒進入gs-accessing-data-gemfire/initial
  • 跳轉到定義一個簡單實體。

完成後,您可以對照中的代碼檢查結果gs-accessing-data-gemfire/complete。

從 Spring Initializr 開始

對于所有 Spring 應用程式,您應該從Spring Initializr開始。Spring Initializr 提供了一種快速的方法來擷取應用程式所需的所有依賴項,并為您完成大量設定。此示例需要 Spring for Apache Geode 依賴項。

您可以使用這個預先初始化的項目并單擊 Generate 下載下傳 ZIP 檔案。此項目配置為适合本教程中的示例。

手動初始化項目:

  1. 在 Web 浏覽器中,導航到https://start.spring.io。該服務提取應用程式所需的所有依賴項,并為您完成大部分設定。
  2. 選擇 Gradle 或 Maven 以及您要使用的語言。本指南假定您選擇了 Java。
  3. 單擊Dependencies并為 Apache Geode選擇Spring 。
  4. 單擊生成。
  5. 下載下傳生成的 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 緩存用戶端,存儲了簡單的實體,并開發了快速查詢。

繼續閱讀