[JAVA] Einführung in Spring Boot + In-Memory Data Grid

Nachdem ich das In-Memory-Datenraster studiert hatte, fragte ich mich, was passieren würde, wenn ich es tatsächlich in die App integrieren würde, also startete ich es.

Was ist ein In-Memory-Datenraster?

Weitere Informationen finden Sie im folgenden Artikel

Lassen Sie uns eine App mit SpringBoot + Apach GEODE erstellen

――Da ich es tatsächlich schaffen wollte, nachdem ich verschiedene Artikel gezappt hatte, gibt es ein Projekt namens "SpringDataGeode" im Git-Repository von Spring, daher werde ich versuchen, das speicherinterne Datenraster mit Spring Boot zu erleben.

Erstellen Sie eine App mit dem Client / Server-Modell von Apache GEODE

Erstellen Sie eine clientseitige App

build.gradle


dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web'){
      //Die log4j-Bibliothek ist Frühling-data-Ausgeschlossen, da dies mit der abhängigen log4j-Bibliothek der Geode in Konflikt steht
	  exclude group: 'org.springframework.boot', module:'spring-boot-starter-logging'
	}
    //Fügen Sie ein Projekt hinzu, das das Domänenmodell als Abhängigkeit behandelt
	compile project(':geodeCommon')
	compileOnly('org.projectlombok:lombok')
	compile(group: 'org.springframework.data', name: 'spring-data-geode', version: '2.1.3.RELEASE')
}

GeodeClientApplication.java


package spring.geode.client.geodeClient;

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

import spring.geode.client.geodeClient.repository.UserRepository;
import spring.geode.geodeCommon.model.User;

@SpringBootApplication
@ClientCacheApplication(name = "SpringGeodeClientApplication") //①
@EnableGemfireRepositories(basePackageClasses = UserRepository.class) //②
@EnableEntityDefinedRegions(basePackageClasses = User.class) //③
@EnablePdx //④
public class GeodeClientApplication {

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

}

UserController.java


package spring.geode.client.geodeClient.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;
import spring.geode.client.geodeClient.service.UserService;
import spring.geode.geodeCommon.model.User;
import spring.geode.geodeCommon.model.UserRequest;

@RestController
@RequiredArgsConstructor
public class UserController {
	private final UserService userService;
    //Benutzersuch-API nach Namen
	@RequestMapping(path = "/find/user/{name}", method = RequestMethod.GET)
	public User findById(@PathVariable String name) {
		return userService.findByName(name);
	}
    //Benutzer alle Such-API
	@RequestMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }
    //Neue Benutzerregistrierungs-API
	@RequestMapping(path = "/register/user", method = RequestMethod.POST)
	public String register(@RequestBody UserRequest request) {
		return userService.register(request).getName();
	}
}

UserService.java


package spring.geode.server.geodeServer.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;
import spring.geode.geodeCommon.model.User;
import spring.geode.geodeCommon.model.UserRequest;
import spring.geode.server.geodeServer.repository.UserRepository;

@RequiredArgsConstructor
@Service
public class UserService {
	private final UserRepository rep; 
	public User findByName(String name) {
		User user=rep.findByName(name).get(0);
		return user;
	}
	
	public User register(UserRequest request) {
		User commited = rep.save(new User(request));
		return commited;
	}
	
	public List<User> findAll(){
		List<User> users=new ArrayList<>();
		rep.findAll().forEach(user -> users.add(user));;
		return users;
	}
}

Repository-Klasse

UserRepository.java


package spring.geode.server.geodeServer.repository;

import java.util.List;

import org.springframework.data.gemfire.repository.GemfireRepository;

import spring.geode.geodeCommon.model.User;

public interface UserRepository extends GemfireRepository<User, Integer> {
	List<User> findByName(String name);
}

application.properties


spring.data.gemfire.pool.locators=localhost[40404]
server.port=9000

Client Legen Sie die IP und den Port des Locators fest, mit dem die Anwendung eine Verbindung herstellt. Geben Sie dieses Mal "localhost" an, um den Locator mit den Einstellungen der Serveranwendung zu starten.

Die Beziehung zwischen Client, Server und Locator in "Apache GEODE" wird im folgenden Artikel beschrieben. Übersicht über Apache GEODE

Zu diesem Zeitpunkt wurde die Client-Anwendung implementiert. Da für die Client- und Serverprojekte eine gemeinsame Klasse verwendet werden muss, werden die zu behandelnden Datenobjekte (Benutzerklasse) im Common-Projekt zusammengefasst und später erstellt.

Erstellen Sie eine serverseitige Anwendung

Mit Ausnahme der Startklasse können Sie den Clientanwendungscode so wie er ist in das Serveranwendungsprojekt einbringen.

GeodeServerApplication.java


package spring.geode.server.geodeServer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.gemfire.config.annotation.CacheServerApplication;
import org.springframework.data.gemfire.config.annotation.EnableEntityDefinedRegions;
import org.springframework.data.gemfire.config.annotation.EnableLocator;
import org.springframework.data.gemfire.config.annotation.EnableManager;
import org.springframework.data.gemfire.config.annotation.EnablePdx;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;

import spring.geode.geodeCommon.model.User;
import spring.geode.server.geodeServer.repository.UserRepository;

@SpringBootApplication
@CacheServerApplication(locators = "localhost[40404]") //①
@EnableGemfireRepositories(basePackageClasses = UserRepository.class)
@EnableEntityDefinedRegions(basePackageClasses = User.class)
@EnablePdx
public class GeodeServerApplication {

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

	@Configuration
	@EnableLocator(port = 40404) //②
	@EnableManager(start = true) //③
	static class LocatorManagerConfiguration {
	}

}

Zu diesem Zeitpunkt wurde die Serveranwendung implementiert.

Erstellen eines Datenmodells

UserRequest.java


package spring.geode.geodeCommon.model;

import java.io.Serializable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRequest implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private String name;
	private int age;
}

--Domänenmodell blieb in Apache GEODE erhalten

User.java


package spring.geode.geodeCommon.model;

import java.io.Serializable;
import java.util.UUID;

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

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Region("Users") //①
public class User implements Serializable {
	private static final long serialVersionUID = 1L;

	private Integer id;
	private String name;
	private int age;
	
	public User(UserRequest request) {
		this.name=request.getName();
		this.age=request.getAge();
		this.id=UUID.randomUUID().hashCode();
	}
}

settings.gradle


//geodeCommon sollte als der von Ihnen erstellte Projektname gelesen werden
include ':geodeCommon'
project(':geodeCommon').projectDir = new File('../geodeCommon')

Zu diesem Zeitpunkt ist die Implementierung des Datenmodells abgeschlossen.

Versuche zu beginnen

Da die Clientanwendung beim Start eine Verbindung zum Locator herstellt, muss zuerst die Serveranwendung gestartet werden.

--client application start (eingebetteter Tomcat startet mit der Portnummer 9000) スクリーンショット 2019-01-27 2.02.58.png

Wenn beide Anwendungen normal gestartet werden können, sollten Client, Locator und Server verbunden sein.

Versuchen Sie, den Benutzer bei der Clientanwendung zu registrieren

curl -H "Content-Type: application/json" -X POST -d '{"name":"John","age":23}' http://localhost:9000/register/user/;

curl -H "Content-Type: application/json" -X POST -d '{"name":"Bob","age":10}' http://localhost:9000/register/user/;

Versuchen Sie, in der Serveranwendung nach einem Benutzer zu suchen

curl -i http://localhost:9090/findAll

Es ist in Ordnung, wenn der in der Clientanwendung registrierte Benutzer in den Suchergebnissen gesucht werden kann

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 26 Jan 2019 17:10:37 GMT

[{"id":-1174841827,"name":"Bob","age":10},{"id":-516984913,"name":"John","age":23}]

Suchen Sie für alle Fälle auch nach dem Namen

curl -i http://localhost:9090/find/user/John;

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 26 Jan 2019 17:12:33 GMT

{"id":-516984913,"name":"John","age":23}

Ich konnte bestätigen, dass die Daten auf dem Client und dem Server synchronisiert wurden. Ich habe es unter Bezugnahme auf das folgende offizielle Dokument implementiert. https://geode.apache.org/docs/

In Zukunft werde ich versuchen, Anwendungen mit dem Peer-Modell, der Anwendungskonfiguration unter AWS, der asynchronen Persistenz usw. zu erstellen.

Recommended Posts

Einführung in Spring Boot + In-Memory Data Grid
Einführung in SpringBoot + In-Memory Data Grid (Datenpersistenz)
Einführung in Spring Boot + In-Memory-Datenraster (Ereignisverarbeitung)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Spring Boot ② ~ AOP ~
Einführung in Spring Boot Teil 1
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
[Einführung in Spring Boot] Senden Sie ein Formular mit thymeleaf
Versuchen Sie Spring Boot von 0 bis 100.
Einführung in Ratpack (7) - Guice & Spring
[Spring Boot] Senden Sie eine E-Mail
Erforderliche Schritte zum Ausgeben von asynchronen Spring Boot-Ereignissen
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
[So installieren Sie Spring Data Jpa]
So stellen Sie Spring Boot + PostgreSQL ein
Verwendung von ModelMapper (Spring Boot)
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Einführung in Spring Boot x Offene API ~ Offene API, erstellt mit Generationslückenmuster ~
02. Ich habe eine API erstellt, um eine Verbindung von Spring Boot zu MySQL (My Batis) herzustellen.
Die Geschichte des Übergangs von Spring Boot 1.5 zu 2.1
Änderungen bei der Migration von Spring Boot 1.5 auf Spring Boot 2.0
Änderungen bei der Migration von Spring Boot 2.0 zu Spring Boot 2.2
Antwortdaten direkt im Frühjahr schreiben
So teilen Sie eine Spring Boot-Nachrichtendatei
Fügen Sie Frühlingsstiefel und Gradle zur Sonnenfinsternis hinzu
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Beispiel für Batch-Prozessdaten in der Datenbank mit Apache Camel Spring Boot-Startern
Vom Erstellen eines Spring Boot-Projekts bis zum Ausführen einer Anwendung mit VS Code
Bucheinführung: Spring Boot Empfohlenes Nachschlagewerk für Anfänger!
Bis zur Datenerfassung mit Spring Boot + MyBatis + PostgreSQL
Verwendung des eingebauten h2db mit Federstiefel
So verkleinern Sie das Spring Boot Docker-Image
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
Spring Data REST HAL Browser bestätigt den Spring REST-Vorgang
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
Wenden Sie Twitter Bootstrap 4 mithilfe von Webjars auf Spring Boot 2 an
Erste Schritte mit Groovy für problematische Java-Ingenieure
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Spring Boot + Spring Data JPA Informationen zu mehreren Tabellenverknüpfungen
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
[Spring Batch] Gibt Tabellendaten in eine CSV-Datei aus
Einführung in Ruby 2
Spring Fox ① Einführung
Fordern Sie Spring Boot heraus
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Spring Boot Form
Einführung in Java
Spring Boot Denken Sie daran
gae + frühlingsstiefel
Einführung in Doma