«Enregistrement du service Cosul et découverte» de microservices

Inscription et découverte de service

Consul est un cadre de microservices et une solution pour l'enregistrement et la découverte de services. Avant de parler de Consul, voyons de quoi il s'agit 服务注册与发现.

Dans le système de microservices, l'enregistrement et la découverte de services sont les deux modules principaux. Lorsque le service A appelle le service B, il doit trouver le service B via le module de découverte de service IP和端口列表, et l'instance du service B doit enregistrer l'adresse IP et le port du service dans le registre de service lors de son démarrage. Une structure typique est illustrée ci-dessous:

En d'autres termes, ServiceA doit trouver ServiceRegistry vers “发现”ServiceB, tandis que ServiceB doit envoyer son propre service à ServiceRegistry chaque fois qu'il démarre ip+portvers “注册”ServiceB.

Inscription au service

À l' heure actuelle, le registre populaire sont plus fréquents avec zookeeper, ectd, consul, eurekaet ainsi de suite.

En général , il y a trois enregistrement des 自注册services: 第三方注册, 注册中心主动同步,.

  • Auto-enregistrement
    L'auto-enregistrement, comme son nom l'indique, consiste à 服务提供方envoyer l'adresse IP et le port du service au centre d'enregistrement lorsque le service est démarré et à 心跳方式maintenir un état sain; lorsque le service est hors ligne, les données correspondantes seront supprimées par lui-même . Un exemple typique est l'utilisation du eurekaclient pour publier des microservices.
  • Enregistrement par un
    tiers L' enregistrement par un tiers fait référence à l'existence d'un système tiers chargé d'ajouter ou de supprimer des données de service dans le registre lorsque le service démarre ou s'arrête. L'utilisation typique est que le devopssystème ou le système de planification de conteneurs ajuste activement le service d'enregistrement de l'interface du centre d'enregistrement.
  • Synchronisation du centre d'enregistrement actif
    Similaire à la méthode d'enregistrement par un tiers, la méthode d'enregistrement active signifie que le centre d'enregistrement et le système de planification ou de publication sont connectés pour synchroniser activement la dernière liste d'adresses IP de service; un exemple est les données d' abonnement dans le kubernetessystème .corednsapi server

Découverte de service

Avant de lancer réellement un appel de service, l'appelant doit obtenir le service correspondant disponible à partir du registre IP和端口列表, c'est-à-dire 服务发现. La découverte de services peut être divisée en deux catégories à partir du caractère intrusif des applications:

  • La
    méthode de découverte de service basée sur le SDK nécessite que l'appelant s'appuie sur le SDK correspondant et appelle explicitement le code du SDK pour implémenter l'appel de service, ce qui est intrusif pour l'entreprise. Des exemples typiques sont eureka, zookeeperetc.
  • DNS-Based
    DNS lui-même est un système de résolution de nom de domaine, qui peut répondre à des scénarios simples de découverte de services, tels que les deux parties s'entendent sur les ports, les protocoles de sérialisation, etc. Cependant, cela est loin de répondre aux besoins des vrais scénarios de microservices. Ces dernières années, la découverte de services basée sur le DNS a été proposée par l'industrie.

Protocole d'interaction de découverte de service

Dans l'architecture de microservice, le protocole de communication pour l'enregistrement et la découverte de services peut être divisé en deux catégories:

  • L'un est “私有”协议, comme dubbo+ zket eureka;
  • L'autre est universel DNS协议, comme k8s+ coredns.
  1. "Accord privé

Le protocole «privé» a un haut degré de personnalisation et peut implémenter des fonctions plus avancées avec des produits spécifiques, tels que zk + dubbo, qui peuvent prendre en charge les connexions push et longues. Cependant, le protocole "privé" apporte également un autre problème, c'est-à-dire que l'ouverture est très faible, l'accès tiers doit utiliser un SDK spécifique et la fonctionnalité multilingue n'est pas bonne. Dans un environnement de microservice ou de cloud, l'inscription et la découverte de services multilingues sont un scénario très courant.

  1. Protocole DNS

Le protocole DNS est un "ancien" protocole, et l'un des protocoles les plus basiques et les plus courants. La découverte de services basée sur le protocole DNS offre une bonne polyvalence et presque toutes les langues sont accessibles de manière transparente. Par rapport à la découverte de service du protocole «privé», la découverte de service basée sur le protocole DNS a encore quelques problèmes à résoudre, comme le problème de port et le problème de mise en cache du framework de langage.

Consul

Consul est un outil open source lancé par HashiCorp, utilisé pour implémenter la découverte de services et la configuration de systèmes distribués. Par rapport à d' autres solutions trouvées dans l' enregistrement de service distribué, consul du programme plus un « guichet unique », construit 服务注册与发现框架,, 分布一致性协议实现, 健康检查, Key/Value存储, 多数据中心方案plus besoin de compter sur d' autres outils (comme ZooKeeper, etc.), est relativement simple à utiliser.

Consul est écrit en langage Go, il a donc la portabilité naturelle (prise en charge Linux, Windowset Mac OS X), le package d'installation ne contient qu'un fichier exécutable, ce qui est pratique pour le déploiement et Dockerpeut fonctionner de manière transparente avec d' autres conteneurs légers.

Installation du consul

Visitez le site Web officiel de Consul et choisissez de télécharger la dernière version de Consul en fonction du type de système d'exploitation. L'adresse de téléchargement est https://www.consul.io/downloads.html.
Insérez la description de l'image ici
Téléchargé est un zippackage compressé, après décompression, c'est un exefichier exécutable.

Consul commence

Le terminal entre dans le consuldossier où se trouve le fichier exécutable, puis exécute la commande suivante pour démarrer:

consul agent -dev

Les informations sur le processus de démarrage sont les suivantes:

[superfarr@19:20:59]:~->cd /Users/superfarr/Documents/iCollections/casaba/consul[superfarr@19:21:08]:~/Documents/iCollections/casaba/consul->consul agent -dev
==> Starting Consul agent...
           Version: '1.8.2'
           Node ID: 'f011f480-5d47-e343-c26a-6bbd32675721'
         Node name: 'superfarrdeMacBook-Pro.local'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

    2020-10-11T19:21:18.633+0800 [DEBUG] agent: Using random ID as node ID: id=f011f480-5d47-e343-c26a-6bbd32675721
    2020-10-11T19:21:18.638+0800 [WARN]  agent: Node name will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.: node_name=superfarrdeMacBook-Pro.local
    2020-10-11T19:21:18.650+0800 [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:f011f480-5d47-e343-c26a-6bbd32675721 Address:127.0.0.1:8300}]"
...

Une fois le démarrage réussi, visitez le site http: // localhost: 8500. Si vous pouvez voir l'interface de gestion des services Consul comme illustré ci-dessous, cela signifie que le serveur de registre peut fournir des services normalement.
Insérez la description de l'image ici

Exemple de projet: enregistrement et découverte du service de configuration SpringBoot

  1. Nouveau projet MavenserviceA

  2. Ajouter une dépendance

En pom.xmlajoutant Spring Cloud, Consulregistre et dépendances liées Boot Spring.

  • Remarque: Spring Boot 2.1 et les versions ultérieures auront des problèmes avec l'enregistrement du service Consul, qui peuvent être dus à des changements de configuration ou à des changements dans les méthodes de support, nous ajustons donc ici la version Spring Boot à la version 2.0.4Spring Cloud Finchley.RELEASE.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hory</groupId>
    <artifactId>service</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <!-- spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- spring-boot-admin -->
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server-ui</artifactId>
            <version>2.0.4</version>
        </dependency>

        <!--consul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>

    <!--spring cloud-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  1. Ajouter un fichier de configuration

Dans le resourcescas du nouveau application.ymlfichier de configuration, ajoutez la configuration du registre de service:

server:
  port: 8000
spring:
  application:
    name: serviceA
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        serviceName: ${
    
    spring.application.name}	# 注册到consul的服务名称
  1. Commencer les cours

Créez un nouveau package dans le répertoire java com.hory.serviceAet créez une nouvelle classe de démarrage dans le package ServiceApplication:

Ajoutez des @EnableDiscoveryClientcommentaires pour activer la prise en charge de la découverte de services.

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @Author Hory
 * @Date 2020/10/11
 */
@EnableAdminServer
@EnableDiscoveryClient  //开启服务发现
@SpringBootApplication
public class ServiceApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(ServiceApplication.class, args);
    }
}

tester

Démarrez le serveur de surveillance de service, visitez http: // localhost: 8500 et constatez que le service a été correctement enregistré dans le registre.
Insérez la description de l'image ici
Après le test, n'oubliez pas d'éteindre Consul (le terminal Ctrl+Cferme Consul).

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44471490/article/details/109016074
conseillé
Classement