Spring Cloud (5): registro y descubrimiento del servicio Consul

1. Introducción a Consul

Consul es un sistema de gestión de configuración y descubrimiento de servicios distribuidos de código abierto desarrollado por HashiCorp utilizando el lenguaje Go.
Proporciona la gestión de servicios, centro de configuración, bus de control y otras funciones en el sistema de microservicios.Cada una de estas funciones se puede utilizar por separado o juntas para construir una red de servicio completa.En resumen, Consul proporciona una solución Grid de servicio completo.

Tiene muchas ventajas: incluyendo: basado en el protocolo de balsa, relativamente simple. Admite verificación de estado, admite protocolos HTTP y DNS al mismo tiempo, admite clústeres WAN de centros de datos cruzados, proporciona interfaz gráfica, multiplataforma, admite windows, linux, mac.

  • Descubrimiento de servicios: proporcione dos métodos de descubrimiento: HTTP y DNS
  • Supervisión del estado: admite varios protocolos, HTTP, TCP, Docker, personalización de scripts de Shell
  • Almacenamiento de KV: métodos de almacenamiento de claves y valores
  • Múltiples centros de datos: Consul admite múltiples centros de datos
  • Interfaz web visual

2. Instalación del cónsul

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

2.1 versión de Docker

Dirección de descarga: https://www.consul.io/downloads.html es
demasiado lento, puede usar Docker para instalar

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

Acceso: ip del host donde se encuentra el cónsul: 8500
Inserte la descripción de la imagen aquí

2.2 versión de Windows

  • Una vez completada la descarga, solo hay un archivo consul.exe, haga doble clic para ejecutarlo en la ruta del disco duro para ver la información de la versión
consul --version
  • Comience con el modo de desarrollo
consul agent -dev

Visita: http; // localhost: 8500

3 Proveedor de servicios

3.1 Módulo de construcción

Crear un nuevo módulo cloud-providerconsul-payment8006

3.2 Cambiar 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 Clase de inicio 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);
    }
}

3.5 controlador

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 Prueba

Inicie 8006, visite http: // localhost: 8006 / payment / consul
Inserte la descripción de la imagen aquí

4. Consumidor de servicios

4.1 Construir módulo

Crear un nuevo 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 Clase de inicio 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 Prueba

Inicie 8006 y visite http: // localhost: 8006 / payment / consul;
Inserte la descripción de la imagen aquí

Reinicie Consul80 y visite http: // localhost / consumer / payment / consul
Inserte la descripción de la imagen aquí

5. Similitudes y diferencias entre los tres centros de registro

GORRA

  • C: consistencia (fuerte consistencia)
  • A: disponibilidad
  • P: Tolerancia a la partición (tolerancia a la partición) La
    teoría CAP se centra en la granularidad de los datos, más que en la estrategia general de diseño del sistema.

Diagrama CAP clásico

  • A lo sumo, dos pueden estar mejor satisfechos al mismo tiempo;
  • El núcleo de la teoría CAP es: un sistema distribuido no puede satisfacer los tres requisitos de consistencia, disponibilidad y tolerancia a fallas de partición al mismo tiempo. Por lo tanto, de acuerdo con el principio CAP, la base de datos NoSQL se divide en satisfacer el principio CA, satisfaciendo el Principio de CP y satisfacción del AP. Tres categorías de principios:
    • Clúster de CA de un solo punto, un sistema que cumple con la coherencia y la disponibilidad, generalmente no muy potente en escalabilidad
    • CP-satisfice la coherencia, el sistema de tolerancia a fallos de la partición, por lo general, el rendimiento no es particularmente alto
    • AP: un sistema que cumple con la disponibilidad y la tolerancia a fallas de partición generalmente puede tener requisitos más bajos de consistencia.
      Inserte la descripción de la imagen aquí

AP (Eureka)
Arquitectura AP, cuando aparecen particiones de red, para garantizar la disponibilidad, el sistema B puede devolver el valor anterior para garantizar la disponibilidad del sistema.
Conclusión: violó los requisitos de consistencia C y solo cumplió con la disponibilidad y la tolerancia a fallas de la partición, es decir, AP.
Inserte la descripción de la imagen aquí

CP (Zookeeper / Consul)
Arquitectura CP, cuando aparece la partición de red, para asegurar la consistencia se debe rechazar la solicitud, de lo contrario no se puede garantizar la consistencia.
Conclusión: Viola los requisitos de disponibilidad A y solo cumple con consistencia y falla de partición tolerancia, a saber, CP.
Inserte la descripción de la imagen aquí

Supongo que te gusta

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