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+port
vers “注册”
ServiceB.
Inscription au service
À l' heure actuelle, le registre populaire sont plus fréquents avec zookeeper
, ectd
, consul
, eureka
et 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 dueureka
client 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 ledevops
systè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 lekubernetes
système .coredns
api 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 sonteureka
,zookeeper
etc. - 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
“私有”协议
, commedubbo
+zk
eteureka
; - L'autre est universel
DNS协议
, commek8s
+coredns
.
- "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.
- 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
, Windows
et Mac OS X
), le package d'installation ne contient qu'un fichier exécutable, ce qui est pratique pour le déploiement et Docker
peut 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.
Téléchargé est un zip
package compressé, après décompression, c'est un exe
fichier exécutable.
Consul commence
Le terminal entre dans le consul
dossier 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.
Exemple de projet: enregistrement et découverte du service de configuration SpringBoot
-
Nouveau projet Maven
serviceA
-
Ajouter une dépendance
En pom.xml
ajoutant Spring Cloud
, Consul
registre 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.4
Spring CloudFinchley.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>
- Ajouter un fichier de configuration
Dans le resources
cas du nouveau application.yml
fichier 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的服务名称
- Commencer les cours
Créez un nouveau package dans le répertoire java com.hory.serviceA
et créez une nouvelle classe de démarrage dans le package ServiceApplication
:
Ajoutez des @EnableDiscoveryClient
commentaires 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.
Après le test, n'oubliez pas d'éteindre Consul (le terminal Ctrl+C
ferme Consul).