Ein kurzer Leitfaden für Spring Cloud Consul

Eine Kurzanleitung für Spring Cloud Consul

1. Überblick

Das ProjektSpring Cloud Consulbietet eine einfache Integration in Consul for Spring Boot-Anwendungen.

Consul ist ein Tool, das Komponenten zur Lösung einiger der häufigsten Herausforderungen in einer Mikrodienstarchitektur bereitstellt:

  • Service Discovery (Dienstermittlung) - Zum automatischen Registrieren und Aufheben der Registrierung der Netzwerkspeicherorte von Dienstinstanzen

  • Integritätsprüfung - um festzustellen, ob eine Dienstinstanz aktiv ist

  • Verteilte Konfiguration - um sicherzustellen, dass alle Dienstinstanzen dieselbe Konfiguration verwenden

In diesem Artikel erfahren Sie, wie Sie eine Spring Boot-Anwendung für die Verwendung dieser Funktionen konfigurieren können.

2. Voraussetzungen

Zunächst wird empfohlen, einen kurzen Blick aufConsul und alle seine Funktionen zu werfen.

In diesem Artikel verwenden wir einen Consul-Agenten, der auflocalhost:8500 ausgeführt wird. Weitere Informationen zum Installieren von Consul und zum Ausführen eines Agenten finden Sie inlink.

Zuerst müssen wir die Abhängigkeit vonspring-cloud-starter-consul-allzu unserenpom.xmlhinzufügen:


    org.springframework.cloud
    spring-cloud-starter-consul-all
    1.3.0.RELEASE

3. Service-Ermittlung

Schreiben wir unsere erste Spring Boot-Anwendung und verbinden uns mit dem laufenden Consul-Agenten:

@SpringBootApplication
public class ServiceDiscoveryApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ServiceDiscoveryApplication.class)
          .web(true).run(args);
    }
}

By default, Spring Boot will try to connect to the Consul agent at localhost:8500. Um andere Einstellungen zu verwenden, müssen wir die Dateiapplication.yml aktualisieren:

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

Wenn wir dann die Site des Konsulagenten im Browser umhttp://localhost:8500 besuchen, werden wir feststellen, dass unsere Anwendung ordnungsgemäß in Consul mit der Kennung von“$\{spring.application.name}:$\{profiles separated by comma}:$\{server.port}” registriert wurde.

Um diesen Bezeichner anzupassen, müssen wir die Eigenschaftspring.cloud.discovery.instanceId mit einem anderen Ausdruck aktualisieren:

spring:
  application:
    name: myApp
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${random.value}

Wenn wir die Anwendung erneut ausführen, sehen wir, dass sie mit dem Bezeichner“MyApp” plus einem zufälligen Wert registriert wurde. Wir benötigen dies, um mehrere Instanzen Ihrer Anwendung auf unserem lokalen Computer auszuführen.

Schließlichto disable Service Discovery, we need to set the property spring.cloud.consul.discovery.enabled to false.

3.1. Nachschlagen von Diensten

Wir haben unsere Anwendung bereits in Consul registriert, aber wie können Kunden die Service-Endpunkte finden? Wir benötigen einen Discovery-Client-Service, um einen laufenden und verfügbaren Service von Consul zu erhalten.

Spring provides a DiscoveryClient API for this, die wir mit der Annotation@EnableDiscoveryClient aktivieren können:

@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
    // ...
}

Dann können wir dieDiscoveryClient-Bean in unseren Controller injizieren und auf die Instanzen zugreifen:

@RestController
public class DiscoveryClientController {

    @Autowired
    private DiscoveryClient discoveryClient;

    public Optional serviceUrl() {
        return discoveryClient.getInstances("myApp")
          .stream()
          .map(si -> si.getUri());
          .findFirst()
    }
}

Schließlich definieren wir unsere Anwendungsendpunkte:

@GetMapping("/discoveryClient")
public String discoveryPing() throws RestClientException,
  ServiceUnavailableException {
    URI service = serviceUrl()
      .map(s -> s.resolve("/ping"))
      .orElseThrow(ServiceUnavailableException::new);
    return restTemplate.getForEntity(service, String.class)
      .getBody();
}

@GetMapping("/ping")
public String ping() {
    return "pong";
}

Der Pfad von“myApp/ping”ist der Name der Spring-Anwendung mit dem Service-Endpunkt. Der Konsul stellt alle verfügbaren Anwendungen mit dem Namen“myApp”. zur Verfügung

4. Gesundheitsprüfung

Consul überprüft regelmäßig den Zustand der Service-Endpunkte.

Standardmäßig istSpring implements the health endpoint to return 200 OK if the app is up. Wenn wir den Endpunkt anpassen möchten, müssen wir dieapplication.yml: aktualisieren

spring:
  cloud:
    consul:
      discovery:
        healthCheckPath: /my-health-check
        healthCheckInterval: 20s

Infolgedessen fragt Consul alle 20 Sekunden den Endpunkt von“/my-health-check”ab.

Definieren Sie unseren benutzerdefinierten Integritätsprüfungsdienst, um den Status einesFORBIDDENzurückzugeben:

@GetMapping("/my-health-check")
public ResponseEntity myCustomCheck() {
    String message = "Testing my healh check function";
    return new ResponseEntity<>(message, HttpStatus.FORBIDDEN);
}

Wenn wir zur Website des Konsulagenten gehen, werden wir feststellen, dass unsere Anwendung fehlschlägt. Um dies zu beheben, sollte der Dienst“/my-health-check”den Statuscode von HTTP200 OKzurückgeben.

5. Verteilte Konfiguration

Diese Funktionallows synchronizing the configuration among all the services. Consul überwacht alle Konfigurationsänderungen und löst dann die Aktualisierung aller Dienste aus.

Zuerst müssen wir die Abhängigkeit vonspring-cloud-starter-consul-configzu unserenpom.xmlhinzufügen:


    org.springframework.cloud
    spring-cloud-starter-consul-config
    1.3.0.RELEASE

Wir müssen auch die Einstellungen des Konsul- und Spring-Anwendungsnamens von derapplication.yml-Datei in diebootstrap.yml-Datei verschieben, die Spring zuerst lädt.

Dann müssen wir Spring Cloud Consul Config aktivieren:

spring:
  application:
    name: myApp
  cloud:
    consul:
      host: localhost
      port: 8500
      config:
        enabled: true

Spring Cloud Consul Config sucht nach den Eigenschaften in Consul bei“/config/myApp”. Wenn wir also eine Eigenschaft namens“my.prop” haben, müssten wir diese Eigenschaft auf der Consul-Agentensite erstellen.

Wir können die Eigenschaft erstellen, indem wir zum Abschnitt“KEY/VALUE” gehen und dann“/config/myApp/my/prop” in der Form“Create Key” und“Hello World” als Wert eingeben. Klicken Sie abschließend auf die Schaltfläche“Create”.

Beachten Sie, dass bei Verwendung von Spring-Profilen die Profile neben dem Namen der Spring-Anwendung angehängt werden müssen. Wenn wir beispielsweise das Profil vondevverwenden, lautet der endgültige Pfad in Consul“/config/myApp,dev”.

Nun wollen wir sehen, wie unser Controller mit den injizierten Eigenschaften aussieht:

@RestController
public class DistributedPropertiesController {

    @Value("${my.prop}")
    String value;

    @Autowired
    private MyProperties properties;

    @GetMapping("/getConfigFromValue")
    public String getConfigFromValue() {
        return value;
    }

    @GetMapping("/getConfigFromProperty")
    public String getConfigFromProperty() {
        return properties.getProp();
    }
}

Und die KlasseMyProperties:

@RefreshScope
@Configuration
@ConfigurationProperties("my")
public class MyProperties {
    private String prop;

    // standard getter, setter
}

Wenn wir die Anwendung ausführen, haben die Feldervalue undproperties den gleichen“Hello World”-Wert von Consul.

5.1. Aktualisieren der Konfiguration

Was ist mit der Aktualisierung der Konfiguration, ohne die Spring Boot-Anwendung neu zu starten?

Wenn wir zur Site des Konsulagenten zurückkehren und die Eigenschaft“/config/myApp/my/prop” mit einem anderen Wert wie“New Hello World” aktualisieren, ändert sich das Feldvalue nicht und das Feldproperties hat wurde wie erwartet auf“New Hello World” aktualisiert.

Dies liegt daran, dass das Feldproperties eineMyProperties-Klasse ist und die Annotation@RefreshScopehat. All beans annotated with the @RefreshScope annotation will be refreshed after configuration changes.

Im wirklichen Leben sollten wir die Immobilien nicht direkt in Consul haben, sondern sie dauerhaft irgendwo aufbewahren. Wir können dies mitConfig Server tun.

6. Fazit

In diesem Artikel erfahren Sie, wie Sie unsere Spring Boot-Anwendungen für die Zusammenarbeit mit Consul für Service Discovery-Zwecke einrichten, die Regeln für die Integritätsprüfung anpassen und eine verteilte Konfiguration freigeben.

Wir haben auch eine Reihe von Ansätzen für Kunden eingeführt, um diese registrierten Dienste aufzurufen.

Wie üblich können Quellenover on GitHub gefunden werden.