Registro e descoberta de serviço
Consul é um framework de microsserviços e uma solução para registro e descoberta de serviços. Antes de falar sobre Consul, vamos ver o que é 服务注册与发现
.
No sistema de microsserviço, registro de serviço e descoberta de serviço são os dois módulos principais. Quando o serviço A chama o serviço B, ele precisa encontrar o serviço B por meio do módulo de descoberta de serviço IP和端口列表
e a instância do serviço B precisa registrar o IP e a porta do serviço no registro de serviço quando é iniciado. Uma estrutura típica é mostrada abaixo:
Em outras palavras, ServiceA precisa encontrar ServiceRegistry para “发现”
ServiceB, enquanto ServiceB precisa enviar seu próprio serviço para ServiceRegistry toda vez que ele inicia ip+port
para “注册”
ServiceB.
Registro de serviço
No momento, o registro populares são mais comuns com zookeeper
, ectd
, consul
, eureka
e assim por diante.
Normalmente existem três inscrição 自注册
serviços: 第三方注册
, 注册中心主动同步
,.
- Autorregistro
O autorregistro, como o nome indica, é para服务提供方
enviar o IP e a porta do serviço para a central de registro quando o serviço é iniciado e心跳方式
manter um estado de integridade; quando o serviço ficar offline, os dados correspondentes serão excluídos por si só . Um exemplo típico é usar oeureka
cliente para publicar microsserviços. - Registro de
terceiros O registro de terceiros refere-se à existência de um sistema de terceiros responsável por adicionar ou excluir dados de serviço no registro quando o serviço é iniciado ou interrompido. O uso típico é que odevops
sistema ou sistema de programação de contêineres ajusta ativamente o serviço de registro da interface do centro de registro. - Sincronização do centro de registro ativo
Semelhante ao método de registro de terceiros, o método de registro ativo significa que o centro de registro e o sistema de agendamento ou publicação estão conectados para sincronizar ativamente a lista de IP de serviço mais recente; um exemplo são os dados de assinatura nokubernetes
sistema .coredns
api server
Descoberta de serviço
Antes de realmente iniciar uma chamada de serviço, as necessidades de chamada para obter o serviço correspondente disponível a partir do registro IP和端口列表
, ou seja 服务发现
. A descoberta de serviço pode ser dividida em duas categorias de intrusão de aplicativos:
- O
método de descoberta de serviço baseado em SDK requer que o chamador confie no SDK correspondente e chame explicitamente o código SDK para implementar a chamada de serviço, que é intrusiva para o negócio. Exemplos típicos sãoeureka
,zookeeper
etc. - O DNS baseado em
DNS em si é um sistema de resolução de nome de domínio, que pode atender a cenários de descoberta de serviço simples, como as duas partes concordam sobre portas, protocolos de serialização e assim por diante. No entanto, isso está longe de atender às necessidades de cenários reais de microsserviços. Nos últimos anos, a descoberta de serviço baseada em DNS foi proposta pela indústria.
Protocolo de interação de descoberta de serviço
Na arquitetura de microsserviço, o protocolo de comunicação para registro e descoberta de serviço pode ser dividido em duas categorias:
- Um é
“私有”协议
, comodubbo
+zk
eeureka
; - O outro é universal
DNS协议
, comok8s
+coredns
.
- Acordo "privado"
O protocolo "privado" tem um alto grau de customização e pode implementar funções mais avançadas com produtos específicos, como zk + dubbo, que pode suportar conexões push e longas. Porém, o protocolo "privado" também traz outro problema, ou seja, a abertura é muito pobre, o acesso de terceiros precisa usar um SDK específico e o recurso de cross-language não é bom. Em um microsserviço ou ambiente de nuvem, o registro e a descoberta de serviço entre idiomas é um cenário muito comum.
- Protocolo DNS
O protocolo DNS é um protocolo "antigo" e um dos protocolos mais básicos e comuns. A descoberta de serviço baseada no protocolo DNS tem boa versatilidade e quase todos os idiomas podem ser acessados facilmente. Comparada com a descoberta de serviço do protocolo "privado", a descoberta de serviço baseada no protocolo DNS ainda apresenta alguns problemas a serem resolvidos, como o problema da porta e o problema de cache do framework da linguagem.
Cônsul
Consul é uma ferramenta de código aberto lançada pela HashiCorp, usada para implementar a descoberta de serviço e configuração de sistemas distribuídos. Em comparação com outras soluções encontradas no registro de serviço distribuído, Cônsul do programa mais "one-stop", construído 服务注册与发现框架
,, 分布一致性协议实现
, 健康检查
, Key/Value存储
, 多数据中心方案
não necessidade de contar com outras ferramentas (como ZooKeeper, etc.), é relativamente simples de usar.
Consul é escrito em linguagem Go, por isso tem portabilidade natural (suporte Linux
, Windows
e Mac OS X
), o pacote de instalação contém apenas um arquivo executável, que é conveniente para a implantação e Docker
pode funcionar perfeitamente com outros recipientes leves.
Instalação Consul
Visite o site oficial da Consul e opte por fazer o download da última versão do Consul de acordo com o tipo de sistema operacional. O endereço de download é https://www.consul.io/downloads.html.
Baixado é um zip
pacote compactado, após a descompactação, é um exe
arquivo executável.
Consul começa
O terminal entra na consul
pasta onde o arquivo executável está localizado e, em seguida, executa o seguinte comando para iniciar:
consul agent -dev
As informações do processo de inicialização são as seguintes:
[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}]"
...
Depois que a inicialização for bem-sucedida, visite http: // localhost: 8500. Se você puder ver a interface de gerenciamento de serviço do Consul conforme mostrado na figura abaixo, significa que o servidor de registro pode fornecer serviços normalmente.
Exemplo de projeto: registro e descoberta do serviço de configuração SpringBoot
-
Novo projeto Maven
serviceA
-
Adicionar dependência
Em pom.xml
adição Spring Cloud
, Consul
registro e da mola de arranque relacionada dependências.
- Nota: Spring Boot 2.1 e versões posteriores terão problemas com o registro do serviço Consul, que podem ser devido a mudanças de configuração ou mudanças nos métodos de suporte, então aqui ajustamos a versão Spring Boot para a
2.0.4
versão 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>
- Adicionar arquivo de configuração
No resources
caso do novo application.yml
arquivo de configuração, adicione a configuração do registro do serviço:
server:
port: 8000
spring:
application:
name: serviceA
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${
spring.application.name} # 注册到consul的服务名称
- Começar a aula
Crie um novo pacote no diretório java com.hory.serviceA
e crie uma nova classe de inicialização no pacote ServiceApplication
:
Adicione @EnableDiscoveryClient
comentários para habilitar o suporte à descoberta de serviço.
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);
}
}
teste
Inicie o servidor de monitoramento de serviço, visite http: // localhost: 8500 e descubra que o serviço foi registrado com êxito no registro.
Após o teste, não se esqueça de desligar o Consul (o terminal Ctrl+C
fecha o Consul).