Spring Cloud (5): Registro e descoberta do serviço Consul

1. Introdução ao Consul

O Consul é um sistema de gerenciamento de configuração e descoberta de serviço distribuído de código aberto desenvolvido pela HashiCorp usando a linguagem Go.
Fornece o gerenciamento de serviço, centro de configuração, barramento de controle e outras funções no sistema de microsserviço. Cada uma dessas funções pode ser usada separadamente ou em conjunto para construir uma rede de serviço completa. Em suma, a Consul oferece uma solução de grade de serviço completa.

Tem muitas vantagens: incluindo: baseado no protocolo de jangada, relativamente simples. Suporta verificação de saúde, suporte HTTP e protocolo DNS ao mesmo tempo, suporte a cluster WAN de data center cruzado, fornece interface gráfica, plataforma cruzada, suporte a janelas, linux, mac.

  • Descoberta de serviço: forneça dois métodos de descoberta: HTTP e DNS
  • Monitoramento de integridade: suporte a vários protocolos, HTTP, TCP, Docker, personalização de script Shell
  • Armazenamento KV: métodos de armazenamento de chave e valor
  • Vários data centers: O Consul oferece suporte a vários data centers
  • Interface visual da web

2. Instalação do Consul

Tutorial: https://www.springcloud.cc/spring-cloud-consul.html

Versão docker 2.1

Endereço de download: https://www.consul.io/downloads.html é
muito lento, você pode usar o docker para instalar

docker pull consul:1.6.1
docker run --name consul -p 8500:8500  -d consul:1.6.1

Acesso: ip do anfitrião onde está localizado o cônsul: 8500
Insira a descrição da imagem aqui

2.2 versão Windows

  • Após a conclusão do download, há apenas um arquivo consul.exe, clique duas vezes para executá-lo no caminho do disco rígido para ver as informações da versão
consul --version
  • Comece com o modo de desenvolvimento
consul agent -dev

Visite: http; // localhost: 8500

3 provedor de serviço

3.1 Módulo de construção

Crie um novo módulo cloud-providerconsul-payment8006

3.2 Alterar POM

<?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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.lele.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-providerconsul-payment8006</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

3,3 建 l

server:
  port: 8006

spring:
  application:
    name: consul-provider-payment

# consul注册中心地址
  cloud:
    consul:
      host: localhost #consul所在服务器的ip
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${
    
    spring.application.name}
        heartbeat:
          enabled: true

3.4 Classe Inicial Principal

package com.lele.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author: lele
 * @date: 2021/3/12 7:17
 * @description:
 */
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(PaymentMain8006.class, args);
    }
}

Controlador 3,5

package com.lele.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * @author: lele
 * @date: 2021/3/12 7:19
 * @description:
 */
@RestController
@Slf4j
public class PaymentController {
    
    

    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "/payment/consul")
    public String paymentConsul() {
    
    
        return "spring cloud with consul:" + serverPort + "\t" + UUID.randomUUID().toString();
    }
}

3.6 Teste

Inicie 8006, visite http: // localhost: 8006 / pagamento / consul
Insira a descrição da imagem aqui

4. Consumidor de serviço

4.1 Módulo de compilação

Crie um novo módulo cloud-consumerconsul-order80

4,2 POM

<?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">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.lele.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumerconsul-order80</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

4,3 marga

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${
    
    spring.application.name}
        heartbeat:
          enabled: true

4.4 Classe Inicial Principal

package com.lele.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author: lele
 * @date: 2021/3/13 18:49
 * @description:
 */
@SpringBootApplication
@EnableDiscoveryClient  //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
public class OrderConsulMain80 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(OrderConsulMain80.class, args);
    }
}
  • ApplicationContextConfig
package com.lele.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author: lele
 * @date: 2021/3/13 18:56
 * @description:
 */
@Configuration
public class ApplicationContextConfig {
    
    
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
    
    
        return new RestTemplate();
    }
}

4.5 controlador

package com.lele.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author: lele
 * @date: 2021/3/13 19:00
 * @description:
 */
@RestController
@Slf4j
public class OrderConsulController {
    
    
    public static final String INVOKE_URL = "http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/consul")
    public String paymentInfo() {
    
    
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
        return result;
    }
}

4.6 Teste

Inicie o 8006 e visite http: // localhost: 8006 / pagamento / consul;
Insira a descrição da imagem aqui

Reinicie o Consul80 e visite http: // localhost / consumidor / pagamento / consul
Insira a descrição da imagem aqui

5. Semelhanças e diferenças entre os três centros de registro

BONÉ

  • C: Consistência (consistência forte)
  • R: Disponibilidade
  • P: Tolerância de partição (tolerância de partição) A
    teoria CAP concentra-se na granularidade dos dados, em vez da estratégia geral de design do sistema.

Diagrama CAP clássico

  • No máximo, dois podem ser mais bem satisfeitos ao mesmo tempo;
  • O núcleo da teoria do CAP é: um sistema distribuído não pode satisfazer os três requisitos de consistência, disponibilidade e tolerância a falhas de partição ao mesmo tempo. Portanto, de acordo com o princípio do CAP, o banco de dados NoSQL é dividido em satisfazer o princípio CA, satisfazendo os Princípio de CP e satisfação do AP. Três categorias de princípios:
    • Cluster de ponto único CA, um sistema que atende a consistência e disponibilidade, geralmente não muito poderoso em escalabilidade
    • Consistência de satisfação de CP, sistema de tolerância a falhas de partição, geralmente o desempenho não é particularmente alto
    • AP - um sistema que atende a disponibilidade e tolerância a falhas de partição pode geralmente ter requisitos mais baixos de consistência.
      Insira a descrição da imagem aqui

AP (Eureka)
Arquitetura de AP, quando as partições de rede aparecem, a fim de garantir a disponibilidade, o sistema B pode retornar o valor antigo para garantir a disponibilidade do sistema.
Conclusão: Violou os requisitos de consistência C, atendendo apenas à disponibilidade e tolerância a falhas de partição, nomeadamente AP.
Insira a descrição da imagem aqui

CP (Zookeeper / Consul)
Arquitetura CP, quando surge a partição da rede, de forma a garantir consistência, o pedido deve ser rejeitado, caso contrário a consistência não pode ser garantida
Conclusão: Viola os requisitos de disponibilidade A e apenas cumpre consistência e falha de partição tolerância, nomeadamente CP.
Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/houwanle/article/details/114681143
Recomendado
Clasificación