Condivisione della tecnologia

Gateway di SpringCloud

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

effetto

  • Gestione unificata, facile da monitorare
  • Sicurezza, limitazione di corrente: filtra le informazioni illegali a livello gateway
  • gateway esterno nginx, gateway intranet
  • nginx può essere migliorato con Lua o Kong

concetto

  • id: il nome è arbitrario
  • uri: l'indirizzo del servizio proxy. id e uri sono obbligatori, predicato e filtro sono facoltativi
  • Predicato: può essere utilizzato per abbinare l'URI per l'accesso al gateway. Se abbinato, avrà effetto il percorso corrente.
  • Filter: un'istanza di GatewayFilter, che aggiunge logica prima o dopo il proxy, con la massima flessibilità

Flusso di elaborazione

  • Innanzitutto, Handler Mapping elabora l'URL, quindi lo trasmette al Web Handler per l'elaborazione. Dopo aver completato l'elaborazione, chiama il servizio proxy effettivo. Dopo che il servizio proxy ha risposto, esegue la logica della seconda metà del filtro Restituisce il risultato a WebHandler, quindi a HandlerMapping e infine al client

utilizzo

gateway:
      discovery:
        locator:
          enabled: true # 启用自动根据服务ID生成路由
          lower-case-service-id: true # 设置路由的路径为小写的服务ID
  • 1
  • 2
  • 3
  • 4
  • 5

configurazione yml

  • Se gli elementi nell'elenco hanno più campi, sono necessari "-" e due punti per specificare rispettivamente ciascun campo e valore; se è presente un solo campo, è possibile utilizzare le virgole per separarlo;
  • Configurazione del tipo di oggetto, ogni campo può essere configurato tramite "-" e due punti
  • Tipo di mappa: chiave, valore separato da due punti
predicates:
  - Path=/sendOrder
  - Query=name,ma.
  - name: Query
    args:
      param: id
      regexp: d+
 #predicates是List, 它的元素是
 public class PredicateDefinition {

	@NotNull
	private String name;

	private Map<String, String> args = new LinkedHashMap<>();
  }
  等号分割转成对象的写法不是yml内置支持的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

predicato

  • La configurazione del predicato è una Lista, i cui elementi possono essere stringhe in un formato specifico o oggetti. Metodo di scrittura della stringa: divisa per segno uguale, la prima parte è il nome del predicato, la seconda parte args è separata da virgole, il valore viene salvato nel valore Map e la chiave Map viene generata automaticamente. Metodo di scrittura dell'oggetto: PredicateDefinition
  • Se negli argomenti stessi sono presenti virgole e due punti, non è possibile utilizzare il formato stringa
  • Il metodo shortcutType definisce il metodo di analisi dei parametri args su ConfigClass: shortcutFieldOrder rimuove il prefisso shortcutFieldPrefix e corrisponde al nome del campo ConfigClass. Il val del parametro args corrisponde al valore del campo di ConfigClass: Elenco separato da virgole : Elenco separato da virgole, ma l'ultimo Il valore è un valore booleano, che alla fine viene convertito in una mappa di 2 chiavi. Il valore della prima chiave è l'elenco davanti al valore booleano e la seconda chiave è il Valore booleano.
  • Utilizzato per abbinare le richieste di accesso al gateway (come URI, parametri di query, intestazioni di richiesta). Se abbinato, avrà effetto il percorso corrente.
  • Corrispondente all'implementazione di GatewayPredicate, la classe di implementazione viene creata dalla factory. La factory è la classe di implementazione di RoutePredicateFactory. La specifica di denominazione della classe di implementazione è: nome predicato+RoutePredicateFactory. Ad esempio, Path corrisponde a PathRoutePredicateFactory.
  • Il nome del predicato corrisponde al prefisso del nome della classe della classe di implementazione factory e il parametro del predicato args corrisponde alla ConfigClass della factory.
  • Lo sono più predicatiERelazione
  • Quando il predicato non viene superato, il gateway restituisce 404

Sentiero

  • Abbina percorsi, supporta la corrispondenza delle formiche ed estrai uriVariables tramite {}

Domanda

  • Esiste un nome del parametro di richiesta http corrispondente? Il valore può essere normale.
  • name è una query fissa, args ha 2 valori, param e regexp, corrispondenti al nome e al valore del parametro della query
  • Quando è configurato solo il nome, significa che finché esiste il parametro di richiesta, verrà passato.

Intestazione

  • HeaderRoutePredicateFactory
  • Corrisponde al nome e al valore dell'intestazione della richiesta. È possibile abbinare solo il nome. Il valore effettivo dell'intestazione della richiesta può essere multiplo. Finché esiste una corrispondenza, il valore di configurazione supporta le espressioni regolari.

Metodo

  • Corrisponde al metodo di richiesta HTTP. La configurazione deve essere in lettere maiuscole e separata da virgole.

IndirizzoRemoto

  • L'IP del client che corrisponde alla richiesta, per la precisione l'IP dell'ultimo proxy di rete, può essere multiplo, separato da virgole

Ospite

  • Corrisponde al valore della parte host nell'intestazione della richiesta Host (esclusa la porta). Può essere multiplo, separato da virgole e può essere abbinato da ant.
  • Utilizza AntPathMatcher per la corrispondenza e il separatore del percorso è "."

Biscotto

  • Corrisponde al nome e al valore del cookie. Il valore può essere abbinato regolarmente.

Peso

  • Utilizzato per il bilanciamento del carico di percorsi diversi nello stesso gruppo vengono caricati in base al peso.
  • È possibile configurare 2 valori, separati da virgole, che sono raggruppamento e peso.
  • WeightCalculatorWebFilter: all'avvio, viene generata una mappa a due livelli in base alla configurazione del peso. Il primo livello è il nome del gruppo e il secondo livello è l'ID di routing. Quando arriva la richiesta, viene generato un numero casuale 0~1 per ciascun gruppo viene selezionato un ID di instradamento.
  • WeightRoutePredicateFactory: durante il filtraggio dei predicati, filtra in base al gruppo e all'ID della route

filtro

  • Il metodo di scrittura della configurazione è lo stesso del predicato. Il metodo di scrittura della stringa: diviso per segno uguale La prima parte corrisponde al prefisso del nome della classe GatewayFilterFactory e la seconda parte è il parametro.
  • I filtri vengono utilizzati per modificare richieste e risposte

AggiungiIntestazioneRichiesta

  • Aggiungi intestazioni di richiesta, che possono essere ottenute dal backend
  • Il valore dell'intestazione della richiesta supporta l'acquisizione dinamica da uriVariables

PrefissoStriscia

  • Esiste un solo valore intero n. Dopo aver diviso il percorso richiesto per "/", rimuovere il prefisso n

Limitante

Interdominio

spring.cloud.gateway.globalcors:
  cors-configurations:
    '[/**]': #跨域的uriPattern
      allowedHeaders: "*"
      allowedOrigins: "*"
      allowedMethods:
        - POST
        - OPTIONS
        - GET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • Il server determina se si tratta di una richiesta tra domini in base al fatto che l'intestazione della richiesta Origin e lo schema, l'host e la porta dell'URL della richiesta siano gli stessi. Finché esiste una differenza, si tratta di una richiesta tra domini.
  • Deve essere presente una configurazione tra domini e l'URI richiesto corrisponde all'uriPattern della configurazione tra domini. Il gateway determinerà se è tra domini. Se è tra domini, consentirà le intestazioni delle richieste tra domini. origini, metodi di richiesta e richieste effettive nella configurazione tra domini Se l'intestazione della richiesta, l'origine e il metodo della richiesta corrispondono, se corrispondono tutti, esegue l'accesso tra domini, altrimenti restituisce 403Forbiden.
  • org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler
  • org.springframework.web.cors.reactive.DefaultCorsProcessor#process

Genera automaticamente percorsi

  • Supporta l'ottenimento dell'ID servizio tramite il rilevamento del servizio e genera automaticamente la configurazione di routing in base all'ID servizio.L'URI della configurazione di routing predefinita è lb://serviceId, il predicato è /serviceId/** e il filtro è Rewritepath per rimuovere serviceId.

filtro globale

Filtro client ReactiveLoadBalancer

  • Per elaborare l'URI di routing con lo schema lb, ottenere prima l'istanza del servizio in base al nome del servizio tramite ServiceInstanceListSupplier, quindi bilanciare il carico tramite l'istanza ReactorLoadBalancer

Filtro RouteToRequestUrl

  • Esegui 2 cose: 1. Supporta schemi a 2 livelli, salva lo schema esterno in GATEWAY_SCHEME_PREFIX_ATTR, quindi rimuovilo. 2. Utilizzare lo schema interno, l'host e la porta per sostituire l'URI effettivamente richiesto per ottenere l'inoltro.