[Cloud Native & Microservices > SCG Gateway Chapter 9] Caso detallado de Spring Cloud Gateway que integra Nacos para realizar la carga de solicitudes

I. Introducción

Hasta ahora, se ha publicado la serie de artículos de puerta de enlace de microservicio:

  1. [Cloud Native & Microservices > SCG Gateway Part 1] Por qué hay una puerta de enlace y cómo elegir una puerta de enlace en un entorno de producción
  2. Cloud Native y Microservices > SCG Gateway Part 2] Esos métodos de liberación en escala de grises en producción
  3. [Cloud Native & Microservices > SCG Gateway Part 3] ¿Qué es Spring Cloud Gateway y casos de uso detallados?
  4. Cloud Native & Microservices > SCG Gateway Part 4] Cómo usar las 11 PredicateFactorys integradas en Spring Cloud Gateway
  5. [Cloud Native & Microservices > SCG Gateway Part 5] Spring Cloud Gateway Custom PredicateFactory
  6. [Cloud Native & Microservices > SCG Gateway Chapter 6] 18 posturas de uso de filtros integradas en Spring Cloud Gateway
  7. [Cloud Native & Microservices > SCG Gateway Chapter 7] Spring Cloud Gateway implementa la limitación, la fusión y el reintento actuales en función de los filtros integrados
  8. [Cloud native & microservices > SCG gateway chapter 8] Spring Cloud Gateway tres formas de personalizar Filter y GlobalFilter

Se trataron los siguientes temas:

  1. ¿Por qué tener una puerta de enlace? ¿Cuál es el papel de una puerta de enlace?
  2. ¿Clasificación de las puertas de enlace?
  3. ¿Selección de tecnología de puerta de enlace?
  4. ¿Cuáles son los métodos de publicación en escala de grises comúnmente utilizados cuando se utilizan puertas de enlace?
  5. ¿Qué es Spring Cloud Gateway? ¿Caso de uso detallado?
  6. 11 tipos de PredicateFactory integrados en Spring Cloud Gateway
  7. ¿Cómo personalizar PredicateFactory?
  8. 18 filtros de uso común integrados en Spring Cloud Gateway
  9. Spring Cloud Gateway implementa la limitación, la fusión y el reintento actuales en función de los filtros integrados
  10. Tres formas de personalizar Filter y GlobalFilter en Spring Cloud Gateway

Este artículo continúa hablando sobre el caso de integración de Spring Cloud Gateway y el registro del servicio Nacos.

PD: información de la versión de SpringCloud:

<properties>
    <spring-boot.version>2.4.2</spring-boot.version>
    <spring-cloud.version>2020.0.1</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud alibaba-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. Gateway, caso de integración de Nacos

El directorio general del proyecto incluye dos módulos: nacos-gateway y nacos-provider-service.
inserte la descripción de la imagen aquí

Entre ellos, nacos-gateway se utiliza como puerta de enlace de enrutamiento y nacos-provider-service está integrado en Gateway como un microservicio común.

0. El principal proyecto padre spring-cloud-alibaba-center

Solo one y pom están reservados en el proyecto spring-cloud-alibaba-center, que se utiliza para la gestión de dependencias maven del proyecto general

1)pom.xml

<?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>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-cloud-alibaba-center</artifactId>
    <groupId>com.saint</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-alibaba-center</name>
    <packaging>pom</packaging>

    <modules>
        <module>gateway-center</module>
        <module>simple-service</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.4.2</spring-boot.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--整合spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1. Servicio común nacos-proveedor-servicio

El directorio de estructura de código general del proyecto nacos-provider-service es el siguiente:
inserte la descripción de la imagen aquí

Contiene un archivo pom.xml, un archivo de configuración application.yml, una clase de inicio y un controlador.

1, pom.xml

<?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-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

</project>

2, aplicación.yml

Establezca el puerto y el nombre del programa del servicio y registre el servicio con el registro de servicios Nacos.

server:
  port: 10001

spring:
  application:
    name: gateway-nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3. Inicie la clase NacosProviderApplication

package com.saint.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosProviderApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

4, Hola Controlador

package com.saint.nacos.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Saint
 */
@RestController
@RequestMapping("hello")
public class HelloController {
    
    

    @GetMapping("/sayHello")
    public String say() {
    
    
        System.out.println("[simple-service]:say Hello!");
        return "[simple-service]:say Hello!";
    }
}

5. Inicie el servicio de proveedor de nacos

Después de que el inicio sea exitoso, la salida de la consola es la siguiente:
inserte la descripción de la imagen aquí

6. Inicie nacos-proveedor-servicio-10002

Ingrese Edit Configurations, copie uno NacosProviderApplication, asígnele un nombre y configúrelo NacosProviderApplication-10002en los argumentos del programa para --server.port=10002
inserte la descripción de la imagen aquí
iniciar NacosProviderApplication-10002, la salida del registro de la consola es la siguiente:

inserte la descripción de la imagen aquí

7. Ingrese al panel de control de Nacos

La información de registro del servicio en este momento es la siguiente: dos instancias del servicio de proveedor de gateway-nacos;
inserte la descripción de la imagen aquí

2. Construya la puerta de enlace de nacos

El directorio de estructura de código general de nacos-gateway es el siguiente:
inserte la descripción de la imagen aquí

Contiene un archivo pom.xml, un archivo de configuración application.yml y una clase de inicio;

1, pom.xml

Hay dos puntos en el archivo pom que necesitan atención:

  1. Dado que Gateway usa Reactive, spring-boot-starter-webno se pueden aplicar dependencias;
  2. Debido a que hay varias instancias del servicio, debe introducirse spring-cloud-loadbalancerpara equilibrar la carga;
<?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-alibaba-center</artifactId>
        <groupId>com.saint</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <description>nacos-gateway</description>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--负载均衡器,如果不引入,或报错503-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

        <!--集成nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

</project>

2, aplicación.yml

server:
  port: 9999

spring:
  application:
    name: nacos-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          # 开启从注册中心动态创建路由的功能
          enabled: true
          # 是否使用service-id的小写,默认是大写
          lower-case-service-id: true
      routes:
        - id: gateway-nacos-service-route
          # 其中配置的lb://表示从注册中心获取服务,后面的gateway-nacos-provider表示目标服务在注册中心上的服务名
          uri: lb://gateway-nacos-provider
          predicates:
            - Path=/nacos/**
          filters:
            # 路由转发请求时,移除一层路径
            - StripPrefix=1

3. Inicie la clase NacosGatewayApplication

package com.saint.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author Saint
 */
@SpringBootApplication
public class NacosGatewayApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(NacosGatewayApplication.class, args);
    }
}

4. Inicie la puerta de enlace de gnacos

Después de que el inicio sea exitoso, la salida de la consola es la siguiente:
inserte la descripción de la imagen aquí

Puede ver que el número de puerto de Netty Server al que Gateway brinda servicios externamente es nuestro 9999 personalizado;

5, Tablero de Nacos

La información de registro del servicio en este momento es la siguiente: dos instancias del servicio de proveedor de gateway-nacos y una instancia del servicio de gateway-nacos;
inserte la descripción de la imagen aquí

3. Verificación del efecto de equilibrio de carga/enrutamiento

En los pasos anteriores, iniciamos nacos-provider-service y nacos-gateway a su vez;

Acceda al servicio de proveedor de nacos a través de Gateway (cuatro visitas):

inserte la descripción de la imagen aquí

efecto de equilibrio de carga

1> Primero mire la salida de la consola NacosProviderApplication:
inserte la descripción de la imagen aquí

2> Primero mire la salida de la consola NacosProviderApplication-10002:
inserte la descripción de la imagen aquí
combinada con la salida de la consola de las dos instancias de servicio, se accede a la instancia de servicio registrada en Nacos a través de la puerta de enlace para lograr el equilibrio de carga.

4. Resumen

La integración Spring Cloud Gateway de Nacos es la solución de integración principal en el ecosistema Spring Cloud, y el caso general sigue siendo muy simple.

En la publicación de blog de seguimiento, continuaremos hablando sobre cómo integrar actuadores en Spring Cloud Gateway para rastrear el estado del servicio e integrar zipkin para rastrear la información del enlace de llamada de servicio.

Supongo que te gusta

Origin blog.csdn.net/Saintmm/article/details/125832522
Recomendado
Clasificación