Springcloud Gateway - fábrica de asserção de gateway e detalhes de filtro e configuração de problemas entre domínios

Fábrica de asserção Springcloud-Gateway Gateway e detalhes de filtro e configuração de problemas entre domínios

3.3 Fábrica de predicados de rota

3.3.1 Onze fábricas básicas de predicados fornecidas pelo Spring (documentos oficiais podem ser consultados, não há necessidade de memorizá-los de cor)

insira a descrição da imagem aqui

3.3.2 Tome After como exemplo para demonstrar a fábrica de asserções

Configure a asserção de roteamento de orderservice, After só pode ser acessado no horário especificado

- id: order-service #路由id 可自定义但要保证唯一性
  uri: lb://orderservice #路由的目标地址
  predicates: #判断请求是否符合路由规则的条件
    - Path=/order/**
    - After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

Após configurar a fábrica de asserções, se as regras de asserção não forem atendidas, acessar o orderservice pelo gateway reporta 404
insira a descrição da imagem aqui

Defina Depois como antes para acessar com sucesso

Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]

insira a descrição da imagem aqui

3.4 Filtro de rota GatewayFilter

3.4.1 Quando os usuários solicitam serviços de gateway, eles primeiro inserem a rota e depois passam por uma série de cadeias de filtros (conforme mostrado na figura)

insira a descrição da imagem aqui

3.4.2 Tome AddRequestHeader como exemplo para demonstrar

Adicione um cabeçalho de solicitação a todas as solicitações que entram no userservice: Springcloud 666

1. Modifique o arquivo application.yml no gateway e adicione um filtro à rota userservice

- id: user-service #路由id 可自定义但要保证唯一性
  uri: lb://userservice #路由的目标地址
  predicates: #判断请求是否符合路由规则的条件
   - Path=/user/**
  filters:
    - AddRequestHeader=Truth,springcloud 666

2. springmvc obtém o cabeçalho da solicitação

@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id ,
                      @RequestHeader (value = "Truth",required = false)String truth) {
    
    
    System.out.println(truth);
    return userService.queryById(id);
}

3. Obteve o cabeçalho da solicitação com sucesso

insira a descrição da imagem aqui

4. Configure o mesmo filtro para todos os microsserviços, você pode usar filtros padrão (observe que o filtro anterior foi anotado neste momento)

  routes: #网关的路由配置
        - id: user-service #路由id 可自定义但要保证唯一性
          uri: lb://userservice #路由的目标地址
          predicates: #判断请求是否符合路由规则的条件
           - Path=/user/**
#          filters:
#            - AddRequestHeader=Truth,springcloud 666
        - id: order-service #路由id 可自定义但要保证唯一性
          uri: lb://orderservice #路由的目标地址
          predicates: #判断请求是否符合路由规则的条件
            - Path=/order/**
            - Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
      default-filters:
        - AddRequestHeader=Truth,springcloud 666!

5. O cabeçalho da solicitação ainda pode ser obtido com sucesso, indicando que o filtro padrão também está em vigor

insira a descrição da imagem aqui

3.4.3 Filtro Global

1. A função do filtro global é processar todas as requisições e respostas de microsserviços que entram no gateway, que é o mesmo do GatewayFilter, porém existem diferenças entre os dois, a diferença é

O GatewayFilter é definido por arquivos de configuração, que são adequados para processar algumas respostas logicamente fixadas, enquanto a lógica do GlobalFilter precisa ser implementada escrevendo o código você mesmo, o que é mais flexível

2. Maneira personalizada, implementando a interface GlobalFilter para obter um filtro global para obter uma autenticação de login simples

@Component
@Order(-1)
public class AuthorizeFilter implements GlobalFilter {
    
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //获取参数中的authorization参数
        String authorization = queryParams.getFirst("authorization");
        //判断参数值是否等于admin
        if ("admin".equals(authorization)) {
    
    
            //是就放行
            return chain.filter(exchange);
        }
        //设置响应状态码401表示用户未登录
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //拦截
        return exchange.getResponse().setComplete();

    }
}

3. Quando não há parâmetro de solicitação, um código de status 401 é relatado, indicando que você não está logado

insira a descrição da imagem aqui

4. Quando há parâmetros de solicitação, os dados são obtidos com sucesso

insira a descrição da imagem aqui

3.4.4 Ordem de execução dos filtros

3.4.4.1 Tipos de Filtros de Rota

Quando uma solicitação entra no gateway, ela encontra três tipos de filtros: filtro de rota atual, DefaultFilter, GlobalFilter

Depois de solicitar o roteamento, o filtro de roteamento atual, DefaultFilter e GlobalFilter serão mesclados em uma cadeia de filtros (ou seja, uma coleção) e cada filtro será executado após a classificação

insira a descrição da imagem aqui

3.4.4.2 Ordem de Execução

Cada filtro deve especificar um valor de pedido do tipo int, quanto menor o valor do pedido, maior a prioridade e maior a ordem de execução.

GlobalFilter especifica o valor do pedido implementando a interface Ordered ou adicionando a anotação @Order, que é especificada por nós mesmos

A ordem dos filtros de roteamento e defaultFilter é especificada pelo Spring, e o padrão é aumentar de 1 de acordo com a ordem de declaração.

Quando os valores de ordem dos filtros forem iguais, eles serão executados na ordem defaultFilter > Routing Filter > GlobalFilter.

3.5 Resolução de problemas entre domínios

3.5.1 Definição de cross-domain

Nomes de domínio inconsistentes são cross-domain, incluindo principalmente:

Nomes de domínio diferentes: www.taobao.com e www.taobao.org e www.jd.com e miaosha.jd.com

Mesmo nome de domínio, portas diferentes: localhost:8080 e localhost8081

Problema entre domínios: o navegador proíbe o originador da solicitação de fazer uma solicitação ajax entre domínios com o servidor e a solicitação é interceptada pelo navegador

(Observe que a solicitação ajax do navegador normalmente é enviada ao servidor, mas o servidor não responde)

Solução: configuração do CORS

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 # 这次跨域检测的有效期






















































Acho que você gosta

Origin blog.csdn.net/weixin_64133130/article/details/130296037
Recomendado
Clasificación