[JAVA] Faisons un disjoncteur pour le service backend à l'aide de l'actionneur de Spring Boot (partie 1)

Conditions préalables

Lors du développement d'un système, il est parfois déraisonnable de dire: «Même si le service backend échoue et commence à renvoyer une erreur, il devrait fonctionner correctement pour que l'ensemble du système ne devienne pas instable». droite?

Dans un tel cas, il est gênant de penser seul au fonctionnement, j'ai donc expérimenté la possibilité d'utiliser la fonction Spring Boot pour en faire un disjoncteur.

En fin de compte, je veux que cela fonctionne bien sur AWS, mais la première moitié dépend de la méthode de mise en œuvre.

Préparation pour Spring Boot

Pour le moment, il ne doit fonctionner que comme une application Web avec un minimum, alors créez un projet de démarrage vide à partir du modèle.

En plus de la valeur par défaut, définissez les dépendances suivantes dans pom.xml.

pom.xml


    <dependencies>
        ……
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        ……
    </dependencies>

RestController n'est pas la partie principale de ce temps, c'est donc un manuel. Avec la configuration minimale, cela ressemble à ce qui suit.

WebController.java


package com.example;
 
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class WebController {
 
  @RequestMapping("/hello")
  public String hello() {
    return "hello()";
  }
   
}

Définition supplémentaire de la vérification de l'état du service backend

De là, Spring Boot Documentation En lisant.

Enregistrez la vérification de l'état du service de backend en tant que vérification de l'état personnalisée. Cette fois, j'expérimente le service backend en tant que fonction Lambda pour un contrôle facile, donc Lambda est inclus dans le nom de la vérification de l'état, mais si vous pouvez le changer en n'importe quel nom.

Implémentez l'interface de l'indicateur de santé comme suit. En faisant cela, il semble qu'il sera automatiquement enregistré dans le bean au démarrage. Je ne comprends pas le mécanisme détaillé. Je dois étudier correctement.

LambdaHealthIndicator.java


package com.example;

import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.IOException;

@Component
public class LambdaHealthIndicator implements HealthIndicator {

  @Override
  public Health health() {
    int statusCode = check();
    if (statusCode != HttpURLConnection.HTTP_OK) {
      return Health.down().withDetail("HTTP Request Error", statusCode).build();
    } else {
      return Health.up().withDetail("HTTP Request Success", statusCode).build();
    }
  }
    
  private int check(){
    String strUrl = "Fonction Lambda suspendue ALB/NLB/URL de la passerelle API";
    URL url = null;
    HttpURLConnection  urlConn = null;
    int statusCode = 200;

    try {
      url = new URL(strUrl);
      urlConn = (HttpURLConnection) url.openConnection();
      urlConn.setRequestMethod("GET");
      urlConn.connect();
      statusCode = urlConn.getResponseCode();	
    } catch (IOException e) {
      e.printStackTrace();
      statusCode = 503;
    } finally {
      if (urlConn != null) {
        urlConn.disconnect();
      }
    }
    return statusCode;
  }
}

À propos, avec cela seul, dans l'affichage par défaut d'Acutuator, même si vous accédez à `` / actuator / health```

{"status":"UP"}

Je reviendrai seulement. Il est nécessaire de modifier les propriétés de l'application comme suit.

application.properties


management.endpoint.health.show-details=always
management.health.defaults.enabled=false
management.health.lambda.enabled=true

La première ligne est une option pour afficher les détails de la vérification de l'état. Si la deuxième ligne est vraie, l'espace disque sera également affiché et il sera difficile à voir, alors désactivez-le dans cet article. La troisième ligne active l'ajout de `` LambdaHealthIndicator ''. Comme mentionné dans la documentation, le préfixe de l'indicateur de santé semble être traité comme un paramètre.

Essayez d'expérimenter

Lorsque vous démarrez l'application ci-dessus et accédez à `` http: // localhost: 8080 / actuator / health```

{"status":"UP","components":{"lambda":{"status":"UP","details":{"HTTP Request Success":200}}}}

Est affiché. Ici, si vous effectuez une limitation (= réservation pour une exécution simultanée: 0) à partir du réglage de la fonction Lambda sur le back-end et mettez-la dans un état où la réponse 502 est renvoyée par ALB,

{"status":"DOWN","components":{"lambda":{"status":"DOWN","details":{"HTTP Request Error":502}}}}

Et l'erreur est correctement détectée. Si vous vérifiez l'en-tête avec les outils de développement de Chrome,

キャプチャ3.PNG

Le code de réponse est également 503, donc si vous pointez le contrôle de santé ici, vous pouvez le traiter comme un disjoncteur!

Recommended Posts

Faisons un disjoncteur pour le service backend à l'aide de l'actionneur de Spring Boot (partie 1)
Créons une application Web de gestion de livres avec Spring Boot part1
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
Créons une application Web de gestion de livres avec Spring Boot part3
Créons une application Web de gestion de livres avec Spring Boot part2
Faisons une API simple avec EC2 + RDS + Spring boot ①
Faisons une application de communication dans LAN Partie 2 Afficher une fenêtre utilisant JavaFX / Attendre la réception du socket
Écrivons un code de test pour la fonction de connexion avec Spring Boot
Un débutant Java a essayé de créer une application Web simple à l'aide de Spring Boot
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Présentation de Spring Boot Actuator, une fonctionnalité qui facilite l'utilisation des applications Spring Boot
[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Faisons un site de shopping en utilisant Stripe! (Achat)
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Comment écrire un test unitaire pour Spring Boot 2
Faisons un pseudo modèle en utilisant active_hash ~ Prefectural data ~
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
[Spring Boot] Comment créer un projet (pour les débutants)
[Bases de Java] Créons un triangle avec une instruction for
Faisons un robot! "Une simple démo de Java AWT Robot"
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Un mémorandum lors de la création d'un service REST avec Spring Boot
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1