Registro y descubrimiento de servicios
Consul es un marco de microservicios y una solución para el registro y descubrimiento de servicios. Antes de hablar de Cónsul, veamos qué es 服务注册与发现
.
En el sistema de microservicios, el registro de servicios y el descubrimiento de servicios son los dos módulos principales. Cuando el servicio A llama al servicio B, necesita encontrar el servicio B a través del módulo de descubrimiento de servicios IP和端口列表
, y la instancia del servicio B debe registrar la IP y el puerto del servicio en el registro de servicios cuando se inicia. A continuación se muestra una estructura típica:
En otras palabras, ServiceA necesita encontrar ServiceRegistry a “发现”
ServiceB, mientras que ServiceB necesita enviar su propio servicio a ServiceRegistry cada vez que comienza ip+port
a “注册”
ServiceB.
Registro de servicio
En la actualidad, el registro populares son más comunes con zookeeper
, ectd
, consul
, eureka
y así sucesivamente.
Por lo general, hay tres de registro de 自注册
servicios: 第三方注册
, 注册中心主动同步
,.
- Autorregistro El
autoregistro, como su nombre lo indica, consiste en服务提供方
enviar la IP y el puerto del servicio al centro de registro cuando se inicia el servicio, y心跳方式
mantener un estado saludable; cuando el servicio se desconecta, los datos correspondientes se borrarán por sí mismos . Un ejemplo típico es usar eleureka
cliente para publicar microservicios. - Registro de terceros El registro
de terceros se refiere a la existencia de un sistema de terceros responsable de agregar o eliminar datos del servicio en el registro cuando el servicio se inicia o se detiene. El uso típico es que eldevops
sistema o el sistema de programación de contenedores ajusta activamente el servicio de registro de la interfaz del centro de registro. - Sincronización del centro de registro activo De manera
similar al método de registro de terceros, el método de registro activo significa que el centro de registro y el sistema de programación o publicación están conectados para sincronizar activamente la última lista de IP del servicio; un ejemplo son los datos de suscripción en elkubernetes
sistema .coredns
api server
Descubrimiento de servicios
Antes de iniciar realmente una llamada de servicio, la persona que llama debe obtener el servicio correspondiente disponible en el registro IP和端口列表
, es decir 服务发现
. El descubrimiento de servicios se puede dividir en dos categorías por la intrusión de las aplicaciones:
- El
método de descubrimiento de servicios basado en SDK requiere que la persona que llama confíe en el SDK correspondiente y llame explícitamente al código del SDK para implementar la llamada de servicio, que es intrusiva para la empresa. Algunos ejemplos típicos soneureka
,zookeeper
etc. - El DNS basado en
DNS en sí es un sistema de resolución de nombres de dominio, que puede cumplir con escenarios simples de descubrimiento de servicios, como que las dos partes acuerden puertos, protocolos de serialización, etc. Sin embargo, esto está lejos de satisfacer las necesidades de escenarios de microservicios reales. En los últimos años, la industria ha propuesto el descubrimiento de servicios basados en DNS.
Protocolo de interacción de descubrimiento de servicios
En la arquitectura de microservicios, el protocolo de comunicación para el registro y el descubrimiento de servicios se puede dividir aproximadamente en dos categorías:
- Uno es
“私有”协议
, comodubbo
+zk
yeureka
; - El otro es universal
DNS协议
, comok8s
+coredns
.
- Acuerdo "privado"
El protocolo "privado" tiene un alto grado de personalización y puede implementar funciones más avanzadas con productos específicos, como zk + dubbo, que puede admitir conexiones push y largas. Sin embargo, el protocolo "privado" también trae otro problema, es decir, la apertura es muy pobre, el acceso de terceros necesita usar un SDK específico y la función de idiomas cruzados no es buena. En un entorno de microservicio o nube, el registro y el descubrimiento de servicios en varios idiomas es un escenario muy común.
- Protocolo DNS
El protocolo DNS es un protocolo "antiguo" y uno de los protocolos más básicos y comunes. El descubrimiento de servicios basado en el protocolo DNS tiene una buena versatilidad y se puede acceder a casi todos los idiomas sin problemas. En comparación con el descubrimiento de servicios del protocolo "privado", el descubrimiento de servicios basado en el protocolo DNS todavía tiene algunos problemas por resolver, como el problema del puerto y el problema del almacenamiento en caché del marco del lenguaje.
Cónsul
Consul es una herramienta de código abierto lanzada por HashiCorp, que se utiliza para implementar el descubrimiento de servicios y la configuración de sistemas distribuidos. En comparación con otras soluciones encontradas en el registro del servicio distribuido, Cónsul del programa más de "ventanilla única", construida 服务注册与发现框架
,, 分布一致性协议实现
, 健康检查
, Key/Value存储
, 多数据中心方案
ya no tendrá que depender de otras herramientas (como ZooKeeper, etc.), es relativamente fácil de usar.
Cónsul está escrito en lenguaje Go, por lo que tiene la portabilidad naturales (apoyo Linux
, Windows
y Mac OS X
), el paquete de instalación sólo contiene un archivo ejecutable, que es conveniente para el despliegue y Docker
puede trabajar sin problemas con otros envases ligeros.
Instalación del cónsul
Visite el sitio web oficial de Consul y elija descargar la última versión de Consul según el tipo de sistema operativo. La dirección de descarga es https://www.consul.io/downloads.html.
Downloaded es un zip
paquete comprimido, después de la descompresión, es un exe
archivo ejecutable.
Cónsul comienza
El terminal ingresa a la consul
carpeta donde se encuentra el archivo ejecutable y luego ejecuta el siguiente comando para comenzar:
consul agent -dev
La información del proceso de inicio es la siguiente:
[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}]"
...
Después de que el inicio sea exitoso, visite http: // localhost: 8500. Si puede ver la interfaz de administración del servicio Consul como se muestra en la figura siguiente, significa que el servidor de registro puede proporcionar servicios normalmente.
Ejemplo de proyecto: registro y descubrimiento del servicio de configuración SpringBoot
-
Proyecto New Maven
serviceA
-
Agregar dependencia
Al pom.xml
agregar Spring Cloud
, el Consul
registro y las dependencias relacionadas con Spring Boot.
- Nota: Spring Boot 2.1 y versiones posteriores tendrán problemas con el registro del servicio Consul, lo que puede deberse a cambios de configuración o cambios en los métodos de soporte, por lo que aquí ajustamos la versión de Spring Boot a la versión de
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>
- Agregar archivo de configuración
En resources
caso de que el nuevo application.yml
archivo de configuración, agregue la configuración del registro del servicio:
server:
port: 8000
spring:
application:
name: serviceA
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${
spring.application.name} # 注册到consul的服务名称
- Comenzar la clase
Cree un nuevo paquete en el directorio de java com.hory.serviceA
y cree una nueva clase de inicio en el paquete ServiceApplication
:
Agregue @EnableDiscoveryClient
comentarios para habilitar el soporte de descubrimiento de servicios.
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);
}
}
prueba
Inicie el servidor de supervisión del servicio, visite http: // localhost: 8500 y compruebe que el servicio se ha registrado correctamente en el registro.
Después de la prueba, no olvide apagar Consul (la terminal Ctrl+C
cierra Consul).