[JAVA] Introduction à Spring Boot + In-Memory Data Grid

Après avoir étudié la grille de données en mémoire, je me demandais ce qui se passerait si je l'incorporais réellement dans l'application, alors j'ai essayé de commencer.

Qu'est-ce qu'une grille de données en mémoire?

Apprenez en vous référant à l'article suivant

Créons une application avec SpringBoot + Apach GEODE

Comme je voulais le faire après avoir zappé divers articles, il existe un projet appelé SpringDataGeode dans le référentiel git de Spring, je vais donc essayer d'expérimenter la grille de données en mémoire avec Spring Boot en l'utilisant.

Créer une application avec le modèle client / serveur d'Apache GEODE

-Créez un modèle pour les applications client et serveur avec Spring Initializer. --Sélectionnez uniquement Web et lombok. --Cette fois, créez un projet avec gradle.

Créer une application côté client

--Ajout de spring-data-geode à la dépendance de build.gradle.

build.gradle


dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web'){
      //la bibliothèque log4j est le printemps-data-Exclus car il entre en conflit avec la bibliothèque log4j dépendante de la géode
	  exclude group: 'org.springframework.boot', module:'spring-boot-starter-logging'
	}
    //Ajouter un projet qui gère le modèle de domaine en tant que dépendance
	compile project(':geodeCommon')
	compileOnly('org.projectlombok:lombok')
	compile(group: 'org.springframework.data', name: 'spring-data-geode', version: '2.1.3.RELEASE')
}

--Code de classe de démarrage

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);
	}

}

--Explication des annotations --①: Paramètre pour démarrer en tant qu'application client dans ʻApache GEODE -②: Paramètre pour que la classe spécifiée fonctionne comme un accesseur de données de ʻApache GEODE --③: Paramètre pour créer automatiquement la région spécifiée (tableau en RDB) -④: Paramètres de sérialisation / désérialisation des données de ʻApache GEODE` (non requis)

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;
    //API de recherche d'utilisateurs par nom
	@RequestMapping(path = "/find/user/{name}", method = RequestMethod.GET)
	public User findById(@PathVariable String name) {
		return userService.findByName(name);
	}
    //API de recherche de tous les utilisateurs
	@RequestMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }
    //Nouvelle API d'enregistrement d'utilisateur
	@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;
	}
}

Classe de référentiel

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 Définissez l'adresse IP et le port du localisateur auquel l'application se connecte. Cette fois, spécifiez localhost pour démarrer le localisateur avec les paramètres de l'application serveur.

«La relation entre le client, le serveur et le localisateur dans Apache GEODE» est décrite dans l'article suivant. Présentation d'Apache GEODE

À ce stade, l'application cliente a été implémentée. Puisqu'il est nécessaire d'utiliser une classe commune pour les projets client et serveur, les objets de données (classe utilisateur) à gérer seront regroupés dans le projet commun et créés ultérieurement.

Créer une application côté serveur

À l'exception de la classe de démarrage, vous pouvez importer le code d'application client tel quel dans le projet d'application serveur.

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 {
	}

}

--Explication des annotations --①: ʻParamétrage pour démarrer en tant qu'application serveur dans Apache GEODE. Définissez le localisateur de connexion sur le port 40404 de localhost`. --②: Paramètre pour démarrer le localisateur sur le port 40404 --③: Paramètre pour démarrer le service qui surveille l'application client / serveur

À ce stade, l'application serveur a été implémentée.

Créer un modèle de données

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;
}

--ʻLe modèle de domaine a persisté dans Apache GEODE`

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();
	}
}

--Explication des annotations --①: définissez la région à laquelle ce modèle est associé.

settings.gradle


//geodeCommon doit être lu comme le nom du projet que vous avez créé
include ':geodeCommon'
project(':geodeCommon').projectDir = new File('../geodeCommon')

À ce stade, la mise en œuvre du modèle de données est terminée.

Essayez de commencer

Étant donné que l'application cliente se connecte au localisateur au démarrage, il est nécessaire de démarrer d'abord l'application serveur.

--Démarrez l'application serveur (Tomacat intégré commence par le numéro de port 9090) スクリーンショット 2019-01-27 2.01.43.png

--client application start (Tomcat intégré commence par le numéro de port 9000) スクリーンショット 2019-01-27 2.02.58.png

Si les deux applications peuvent être démarrées normalement, le client, le localisateur et le serveur doivent être connectés.

Essayez d'enregistrer l'utilisateur avec l'application client

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/;

Essayez de rechercher un utilisateur à partir de l'application serveur

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

C'est OK si l'utilisateur enregistré dans l'application cliente peut être recherché dans les résultats de la recherche

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}]

Juste au cas où, recherchez également en spécifiant le nom

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}

J'ai pu confirmer que les données étaient synchronisées sur le client et le serveur. Je l'ai implémenté en référence au document officiel suivant. https://geode.apache.org/docs/

À l'avenir, j'essaierai de créer des applications avec le modèle homologue, la configuration des applications sur AWS, la persistance asynchrone, etc.

Recommended Posts

Introduction à Spring Boot + In-Memory Data Grid
Introduction à SpringBoot + In-Memory Data Grid (persistance des données)
Introduction à Spring Boot + In-Memory Data Grid (traitement des événements)
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Introduction à Spring Boot, partie 1
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Essayez Spring Boot de 0 à 100.
Introduction à Ratpack (7) --Guice & Spring
[Spring Boot] Envoyer un e-mail
Étapes requises pour émettre des événements asynchrones Spring Boot
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
[Comment installer Spring Data Jpa]
Comment configurer Spring Boot + PostgreSQL
Comment utiliser ModelMapper (Spring boot)
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Introduction à Spring Boot x Open API ~ Open API créée avec le modèle d'écart de génération ~
02. J'ai créé une API pour me connecter de Spring Boot à MySQL (My Batis)
L'histoire de la transition de Spring Boot 1.5 à 2.1
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
Pour écrire des données de réponse directement dans Spring
Comment diviser un fichier de message Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
Exemple de traitement par lots de données sur DB avec des démarreurs Apache Camel Spring Boot
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code
Introduction du livre: Spring Boot Livre de référence recommandé pour les débutants!
Jusqu'à l'acquisition de données avec Spring Boot + MyBatis + PostgreSQL
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Essayez d'implémenter la fonction de connexion avec Spring Boot
Le navigateur Spring Data REST HAL confirme l'opération Spring REST
Comment ajouter un chemin de classe dans Spring Boot
Comment se lier avec un fichier de propriétés dans Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Je voulais classer la botte à ressort dans un multi-projet
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
Premiers pas avec Groovy pour les ingénieurs Java gênants
[Spring Boot] Comment se référer au fichier de propriétés
Spring Boot + Spring Data JPA À propos des jointures de table multiples
Spring Boot - Comment définir le délai d'expiration de la session
[Spring Batch] Données de la table de sortie dans un fichier CSV
Introduction à Ruby 2
Spring Fox ① Introduction
Défi Spring Boot
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Forme de botte de printemps
Introduction à Java
Spring Boot Rappelez-vous
gae + botte à ressort
Introduction à Doma