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