Pasarela de puerta de enlace integrada SpringCloud

1. Puerta de enlace de servicio

El motivo del surgimiento de la puerta de enlace API es el surgimiento de la arquitectura de microservicios. Los diferentes microservicios generalmente tienen diferentes direcciones de red, y los clientes externos pueden necesitar llamar a las interfaces de múltiples servicios para completar un requisito comercial. Si el cliente se comunica directamente con cada servicio de microservicio comunicación, habrá los siguientes problemas:

(1) El cliente solicitará diferentes microservicios varias veces, lo que aumenta la complejidad del cliente.
(2) Hay solicitudes entre dominios, que son relativamente complicadas de manejar en ciertos escenarios.
(3) La autenticación es compleja y cada servicio requiere una autenticación independiente.
(4) Difícil de refactorizar, con la iteración del proyecto, es posible que sea necesario volver a dividir los microservicios. Por ejemplo, varios servicios pueden combinarse en uno o un servicio puede dividirse en varios. Si el cliente se comunica directamente con el microservicio, la refactorización será difícil de implementar.
(5) Algunos microservicios pueden usar protocolos hostiles de firewall/navegador, y el acceso directo será difícil.

Estos problemas se pueden resolver con la ayuda de API Gateway. La puerta de enlace API es la capa intermedia entre el cliente y el servidor, y todas las solicitudes externas pasarán primero por la puerta de enlace API. Es decir, la implementación de la API tiene en cuenta más la lógica comercial, mientras que la seguridad, el rendimiento y el monitoreo pueden realizarse mediante puertas de enlace API, lo que no solo mejora la flexibilidad comercial sino que también no carece de seguridad.

En cierto sentido, puede reemplazar la función de la solicitud de distribución del puerto proxy de nginx. Y al mismo tiempo, la configuración en la puerta de enlace del servicio también puede resolver el problema de las solicitudes entre dominios entre el front-end y el back-end.

2. Puerta de enlace de la nube de primavera

Spring Cloud Gateway es una puerta de enlace oficial desarrollada por Spring basada en tecnologías como Spring 5.0, Spring Boot 2.0 y Project Reactor. Spring Cloud Gateway tiene como objetivo proporcionar un método de gestión de enrutamiento API simple, eficaz y unificado para la arquitectura de microservicios. Spring Cloud Gateway es utilizado como Spring Cloud La puerta de enlace en el ecosistema tiene como objetivo reemplazar a Netflix Zuul, que no solo proporciona un método de enrutamiento unificado, sino que también proporciona funciones básicas de la puerta de enlace basadas en la cadena Filer, como: seguridad, monitoreo/compra, limitación actual, etc.

3. Construcción de servicios

3.1 Construir servidor-puerta de enlace

Crear un nuevo módulo en el proyecto.

3.2 Modificar la configuración pom.xml

Modificar pom.xml

<dependencies>
    <dependency>
        <groupId>com.atguigu.yygh</groupId>
        <artifactId>common-util</artifactId>
        <version>1.0</version>
    </dependency>

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

    <!-- 服务注册 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

3.3 Agregar un archivo de configuración en recursos

1, propiedades de la aplicación

# 服务端口
server.port=80
# 服务名
spring.application.name=service-gateway

# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#使用服务发现路由
spring.cloud.gateway.discovery.locator.enabled=true

#设置路由id
spring.cloud.gateway.routes[0].id=service-hosp
#设置路由的uri
spring.cloud.gateway.routes[0].uri=lb://service-hosp
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[0].predicates= Path=/*/hosp/**

#设置路由id
spring.cloud.gateway.routes[1].id=service-cmn
#设置路由的uri
spring.cloud.gateway.routes[1].uri=lb://service-cmn
#设置路由断言,代理servicerId为auth-service的/auth/路径
spring.cloud.gateway.routes[1].predicates= Path=/*/cmn/**

3.4 Agregar clase de inicio

package com.atguigu.yygh;

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

@SpringBootApplication
public class ServerGatewayApplication {
    
    

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

3.5 Procesamiento entre dominios

Origen cruzado: restricciones del navegador en la política del mismo origen de JavaScript.
Las siguientes situaciones son de dominio cruzado:
Ejemplos de razones de dominio cruzado

Nombres de dominio diferentes www.jd.com
y www.taobao.com el mismo nombre de dominio, puerto diferente Es el mismo que el puerto, pero la ruta de solicitud es diferente y no pertenece al dominio cruzado, como: www.jd .com/item www.jd.com/goods http y https también pertenecen al dominio cruzado de localhost:1000 a localhost:8888, que pertenece a Los puertos son diferentes, dominio cruzado.





3.5.1 ¿Por qué hay problemas entre dominios?

El dominio cruzado no necesariamente tiene problemas de dominio cruzado.
Porque el problema de dominios cruzados es una restricción de seguridad de los navegadores para las solicitudes Ajax: las solicitudes Ajax iniciadas por una página solo pueden estar en la misma ruta que el nombre de dominio de la página actual, lo que puede prevenir ataques entre sitios.
Entonces: el problema de dominio cruzado es una especie de limitación para ajax .
Pero esto trae inconvenientes a nuestro desarrollo, y en el entorno de producción real, definitivamente habrá muchas interacciones entre servidores, y las direcciones y puertos pueden ser diferentes.¿Qué debemos hacer?

3.5.2 Resolución de problemas entre dominios

La clase de configuración global implementa
la clase CorsConfig

@Configuration
public class CorsConfig {
    
    
    @Bean
    public CorsWebFilter corsFilter() {
    
    
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

3.6 Ajuste del Servicio

En la actualidad, hemos realizado el procesamiento de dominios cruzados en la puerta de enlace, por lo que el servicio de servicio no necesita realizar el procesamiento de dominios cruzados. Quite la etiqueta @CrossOrigin agregada a la clase de controlador antes para evitar excepciones del programa.

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/122490865
Recomendado
Clasificación