Uso preliminar de la puerta de enlace

Introducción a la puerta de enlace

Gateway es un componente de puerta de enlace en Spring Cloud, Spring Cloud Gateway tiene como objetivo proporcionar una forma simple y eficiente de enrutar a las API. Spring Cloud usa la puerta de enlace Zuul en la versión 1.x, pero usa Gateway en lugar de Zuul en la versión 2.x. Zuul es una implementación basada en Servlet y pertenece a la programación de bloqueo. SpringCloudGateway se basa en WebFlux proporcionado en Spring5, que pertenece a la implementación de la programación reactiva y tiene un mejor rendimiento.

La función de la puerta de enlace.

  • Autenticación y verificación de permisos para solicitudes de usuarios
  • Dirija las solicitudes de los usuarios a los microservicios e implemente el equilibrio de carga
  • Limitar las solicitudes de los usuarios

Construir puerta de enlace

1. Crear un proyecto Spring Boot
inserte la descripción de la imagen aquí
2. Importar dependencias de puerta de enlace y nacos

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

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<version>2.2.5.RELEASE</version>
</dependency>

3. Escriba la configuración de enrutamiento y la dirección de nacos

server:
  port: 10010 #网关端口
spring:
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes: #网关路由配置
        - id: user-service #路由id,保证唯一
          uri: lb://userservice #路由的目标地址,lb就是负载均衡,后面跟服务名称
          predicates: #路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** #这个是按照路径匹配,只要以/user/开头就符合要求
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

4. Inicio
5. Prueba
inserte la descripción de la imagen aquí

Fábrica de afirmación de ruta

Las aserciones de enrutamiento completadas en los predicados en el archivo de configuración de la puerta de enlace serán leídas y procesadas por Predicate Factory, y luego se convertirán en condiciones para el juicio de enrutamiento. Spring Cloud nos proporciona doce fábricas de aserciones
inserte la descripción de la imagen aquí

Cada documentación oficial de fábrica de afirmaciones proporciona ejemplos
inserte la descripción de la imagen aquí

nombre ilustrar Ejemplo
Después es una solicitud después de un cierto punto en el tiempo - Después=2037-01-20T17:42:47.789-07:00[América/Denver]
Antes es una solicitud antes de un cierto punto en el tiempo - Antes=2031-04-13T15:14:47.433+08:00[Asia/Shanghái]
Entre es una solicitud antes de un cierto punto en el tiempo - Entre=2037-01-20T17:42:47.789-07:00[América/Denver], 2037-01-21T17:42:47.789-07:00[América/Denver]
Galleta La solicitud debe contener ciertas cookies. - Galleta=chocolate, cap.
Encabezamiento La solicitud debe contener ciertos encabezados. - Encabezado=X-Solicitud-Id, \d+
Anfitrión La solicitud debe ser para acceder a un cierto host (nombre de dominio) - Host=**.algúnhost.org,**.otrohost.org
Método El método de solicitud debe ser el método especificado. - Método=OBTENER,POST
Sendero La ruta de la solicitud debe cumplir con las reglas especificadas - Ruta=/rojo/{segmento},/azul/**
Consulta Los parámetros de solicitud deben contener los parámetros especificados - Consulta=nombre, Jack o - Consulta=nombre
DirecciónRemota La ip del solicitante debe estar en el rango especificado - Dirección remota = 192.168.1.1/24
Peso manejo de peso - Peso=grupo1, 2

filtro de ruta

GatewayFilter es un filtro provisto en la puerta de enlace, que puede procesar las solicitudes que ingresan a la puerta de enlace y las respuestas devueltas por los microservicios.
inserte la descripción de la imagen aquí
Spring proporciona 31 fábricas de filtros de ruta diferentes ( dirección del documento )
inserte la descripción de la imagen aquí

spring:
  cloud:
    gateway:
      routes:
      - id: lb://userservice
        uri: https://example.org
        predicates:
        - Path=/user/**
        filters: #过滤器(与id同级)
        - AddRequestHeader=X-Request-red, blue#添加请求头

Si desea que tenga efecto para todas las rutas, puede escribir la fábrica de filtros por defecto

spring:
  cloud:
    gateway:
      routes:
        #路由1
        #路由2
        #... 
      default-filters: #与routes同级
      - AddResponseHeader=X-Response-Default-Red, Default-Blue
      - PrefixPath=/httpbin

filtro global

La función del filtro global es procesar todas las solicitudes y respuestas de microservicios que ingresan a la puerta de enlace, al igual que GatewayFilter. La diferencia es que GatewayFilter se define por configuración y la lógica de procesamiento es fija. La lógica de GlobalFilter debe implementarse escribiendo su propio código. Se define implementando la interfaz GlobalFilter.

【Caso】

Defina un filtro global, intercepte solicitudes y determine si los parámetros de la solicitud cumplen las siguientes condiciones:
1. Si hay autorización en los parámetros,
2. Si el valor del parámetro de autorización es admin. Liberar si ambos están satisfechos, de lo contrario interceptar

//指定Order值得第一种方式使用注解
//指定Order值得第二种方式实现Ordered接口重写getOrder方法
//@Order(-1)//值越小优先执行
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    
    
    /**
     * @param exchange:请求上下文,里面可以获取Request、Response等信息
     * @param chain:用来把请求委托给下一个过滤器
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //获取参数中的authorization参数
        String auth = queryParams.getFirst("authorization");
        //校验参数值是否等于admin
        if ("admin".equals(auth)){
    
    
            //是,放行
            return chain.filter(exchange);
        }
        //否,拦截
        //设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401未登录
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
    
    
        return -1;
    }
}

prueba
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

orden de ejecución del filtro

  • Cada filtro debe especificar un valor de orden de tipo Int. Cuanto menor sea el valor de la orden, mayor será la prioridad y mayor el orden de ejecución.
  • GlobalFilter especifica el valor del pedido implementando la interfaz Ordered o agregando la anotación @Order
  • Spring especifica el orden del filtro de ruta y el filtro predeterminado, y el valor predeterminado es aumentar desde 1 de acuerdo con el orden de la declaración.
  • Cuando el valor de orden del filtro es el mismo, se ejecutará en el orden predeterminadoFilter > Route Filter > GlobalFilter.

Manejo de problemas entre dominios

Problema de dominio cruzado: el navegador prohíbe que el autor de la solicitud entre dominios con el servidorsolicitud de ajax, la solicitud está bloqueada por el navegador

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求 
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

Supongo que te gusta

Origin blog.csdn.net/m0_60117382/article/details/123951864
Recomendado
Clasificación