Implementieren Sie die Spring-Cloud-Gateway-Funktion durch die dreifache Leistung des Higress Wasm-Plug-Ins

Autor: Wei Xin, Higress Committer, vom Distributed System Laboratory der Nanjing University of Aeronautics and Astronautics

Einführung: In diesem Artikel wird mit Ihnen besprochen, wie Spring Cloud Gateway das Anforderungsszenario für die HTTP-Anforderungs-/Antwortkonvertierung erfüllt, und Ihnen die Lösung für die Verwendung des Higress Cloud Native Gateway in diesem Szenario vorgestellt und auch den Leistungsunterschied zwischen den beiden verglichen. .

SCG-Änderungsanfrage/-antwort

Wenn wir in Spring Cloud Gateway [ 1] (im Folgenden als SCG bezeichnet) HTTP-Anforderungen oder -Antworten ändern müssen, stellt SCG viele integrierte GatewayFilter [ 2] bereit , um unsere Anforderungen für dieses Anwendungsszenario zu erfüllen, z. B. AddRequestHeader, AddRequestParameter, DedupeResponseHeader, MapRequestHeader, ModifyRequestBody usw.

Betrachten Sie den folgenden einfachen Anwendungsfall:

  • Fügen Sie den Anforderungsheader hinzu.

  • Ordnen Sie den Wert des Anforderungsheaders X-First zu X-Second zu.

  • Anforderungsabfrageparameter k1=v1 hinzufügen;

  • Eliminieren Sie doppelte Antwortheader mit X-Dedupe.

Mit GatewayFilter in SCG können wir es wie folgt konfigurieren:

# application.yaml:

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: lb://httpbin-svc
          predicates:
            - Path=/{api}/**
          filters:
            - AddRequestHeader=X-First, {api}
            - MapRequestHeader=X-First, X-Second
            - AddRequestParameter=k1, v1
            - DedupeResponseHeader=X-Dedupe, RETAIN_FIRST

Ich glaube, dass Studierende mit Erfahrung in der Verwendung von SCG mit der oben genannten Konfiguration vertraut sein werden, daher konzentriert sich dieser Artikel auf eine andere Lösung, die die oben genannten Anforderungen vollständig erfüllen kann und eine bessere Leistung bietet – die Verwendung des Transformer-Plug-Ins des Higress Cloud Native Gateway.

Higress-Plug-in und SCG-Leistungsvergleich

Wir schalten das Higress Transformer-Plug-in [ 3] und die entsprechenden SCG-GatewayFilter auf demselben Durchsatzniveau (QPS) ein/aus und zählen den Overhead der beiden für CPU- und Speicherressourcen.

Nach dem Testen von [ 13] kamen wir zu folgendem Schluss:

  • Unter der Bedingung, dass Higress das Transformer-Plug-in nicht aktiviert und SCG GatewayFilters nicht aktiviert, beträgt der CPU- und Speicherressourcen-Overhead von SCG etwa das 3,30- bzw. 4,88-fache des von Higress;
  • Unter der Voraussetzung, dass das Transformer-Plug-in in Higress und die entsprechenden GatewayFilter in SCG aktiviert sind, beträgt der CPU- und Speicherressourcen-Overhead von SCG etwa das 2,98- bzw. 3,19-fache des von Higress.

Es ist ersichtlich, dass Higress Transformer im Vergleich zu SCG GatewayFilter eine recht gute Leistung aufweist!

Als nächstes werden wir das Higress Cloud Native Gateway und das oben erwähnte Higress Transformer Plug-In weiter vorstellen.

Higress-Einführung

Higress [ 4] ist ein Cloud-natives Gateway der nächsten Generation, das auf Alibabas interner Envoy Gateway-Praxis basiert und mit Open Source Istio + Envoy als Kern aufgebaut ist. Es erreicht hohe Integrationsfähigkeiten und eine tiefe Integration von Traffic Gateway + Microservice Gateway + Security Gateway. Microservice-Technologie-Stacks wie Dubbo, Nacos und Sentinel können Benutzern dabei helfen, die Kosten für die Gateway-Bereitstellung sowie den Betrieb und die Wartung erheblich zu reduzieren, ohne die Funktionen zu beeinträchtigen. Sie unterstützen Ingress- und Gateway-APIs hinsichtlich der Standards vollständig und übernehmen aktiv Standard-API-Spezifikationen unter Cloud Native Gleichzeitig unterstützt Higress Controller auch die reibungslose Migration von Nginx Ingress und hilft Benutzern, schnell und ohne Kosten auf Higress zu migrieren.

Higress stellt eine Reihe von Wasm (WebAssembly) SDK [ 5] bereit , mit denen Entwickler problemlos C++, Golang und Rust verwenden können, um Wasm-Plug-Ins zu entwickeln und die Gateway-Funktionen zu verbessern. Im Folgenden werden die Grundfunktionen des Higress Transformer-Plug-Ins vorgestellt und abschließend kurz die Kerncodelogik des Transformer-Plug-Ins erläutert.

Einführung in das Transformator-Plug-in

Das Higress Transformer-Plugin kann Anforderungs-/Antwort-Header, Anforderungsabfrageparameter und Anforderungs-/Antworttextparameter konvertieren. Zu den unterstützten Konvertierungsoperationstypen gehören Löschen (Entfernen), Umbenennen (Umbenennen), Aktualisieren (Ersetzen), Hinzufügen (Hinzufügen), Anhängen, Zuordnen und Deduplizieren.

Als nächstes reproduzieren wir den eingangs erwähnten einfachen Anwendungsfall von SCG GatewayFilter, um die Verwendung des Plug-Ins zu demonstrieren (das Plug-In kann einfach mit der Higress-Konsole unten bereitgestellt werden, natürlich können Sie auch die K8s YAML-Manifeste verwenden). Methode [ 12] ):

  1. Installieren Sie Higress zunächst schnell gemäß der offiziellen Dokumentation [ 6] . Die Ergebnisse sind wie folgt:
$ kubectl -n higress-system get deploy
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
higress-console              1/1     1            1           1d
higress-console-grafana      1/1     1            1           1d
higress-console-prometheus   1/1     1            1           1d
higress-controller           1/1     1            1           1d
higress-gateway              1/1     1            1           1d
  1. Fügen Sie den Domänennamen (foo.bar.com) und die Routing-Konfiguration (foo) über die Higress-Konsole hinzu und leiten Sie den Datenverkehr an den Back-End- Dienst httpbin [ 7] weiter:

  1. Fügen Sie das Transformer-Plug-in für die foo-Route hinzu (das Plug-in wird derzeit nicht in das offizielle Image-Repository gepusht, Sie können zuerst docker.io/weixinx/transformer:v0.1.0 verwenden oder zum Code-Repository gehen, um es zu erstellen selbst):

Hinweis: Um die Anforderungs- und Antwortkonvertierungsanforderungen gleichzeitig zu erfüllen, müssen wir der Foo-Route ein weiteres Transformer-Plug-In mit dem Namen „transformator-resp“ hinzufügen, um die Antwortrichtung zu verwalten.

  1. Fügen Sie die Transformer-Konfiguration hinzu und aktivieren Sie das Plug-in:
  • Fügen Sie den Anforderungsheader hinzu.
  • Ordnen Sie den Wert des Anforderungsheaders X-First zu X-Second zu.
  • Anforderungsabfrageparameter k1=v1 hinzufügen;
  • Eliminieren Sie doppelte Antwortheader mit X-Dedupe.
# transformer:
type: request  # 指定 Transformer 类型
rules:         # 指定转换规则
- operate: add # 指定转换操作类型
  headers:     # 指定头部转换规则
  - key: X-First
    value: $1  # 正则表达式捕获组 $1,支持 RE2 语法
    path_pattern: ^\/(\w+)[\?]{0,1}.*$
  querys:      # 指定查询参数转换规则
  - key: k1
    value: v1
- operate: map
  headers:
  - key: X-First
    value: X-Second
---
# transformer-resp:
type: response
rules:
- operate: dedupe
  headers:
  - key: X-Dedupe
    value: RETAIN_FIRST
  1. Senden Sie eine Testanfrage:
# 验证请求方向转换
$ curl -v -H "host: foo.bar.com" "console.higress.io/get"
...
>
< HTTP/1.1 200 OK
...
<
{
  "args": {
    # 添加了查询参数 k1=v1
    "k1": "v1"
  },
  "headers": {
    ...
    "X-First": "get", # 添加了请求头部 X-First,值 "get" 来自请求路径
    "X-Second": "get" # 映射了请求头部 X-Second
  },
  ...
  # 添加了查询参数 k1=v1
  "url": "http://foo.bar.com/get?k1=v1"
}


# 验证响应方向转换
$ curl -v -H "host: foo.bar.com" \
"console.higress.io/response-headers?X-Dedupe=1&X-Dedupe=2&X-Dedupe=3"
...
>
< HTTP/1.1 200 OK
< x-dedupe: 1 # 保留了响应头部 X-Dedupe 的第一个值
...
<
{
  ...
  # 通过查询参数传给 httpbin 的自定义响应头部
  "X-Dedupe": [
    "1",
    "2",
    "3"
  ],
  ...
}

❗️Zu beachten sind:

  • Wenn wie im obigen Beispiel eine Anforderungs- und Antwortkonvertierung gleichzeitig verarbeitet werden muss, müssen Sie der entsprechenden Route zwei Transformer-Plug-Ins hinzufügen, um die Anforderungsrichtung bzw. die Antwortrichtung zu verarbeiten (Optimierung).
  • Die vom Anforderungstext unterstützten Inhaltstypen sind: application/json, application/x-www-form-urlencoded, multipart/form-data; während der Antworttext nur application/json unterstützt;
  • Weitere Anweisungen finden Sie in der Plug-in-Dokumentation [ 3] .

Transformatorlogik

In diesem Abschnitt wird kurz die Kerncodelogik des Higress Transformer-Plug-Ins erläutert, in der Hoffnung, Studenten zu helfen, die an der Optimierung des Plug-Ins oder der Durchführung einer Sekundärentwicklung interessiert sind.

Erstens befindet sich der Plug-in-Code im Verzeichnis „plugins/wasm-go/extensions/transformer“ des Higress-Warehouses und wird mit dem von Higress bereitgestellten Wasm SDK [ 5] entwickelt ( Einzelheiten finden Sie in der offiziellen Dokumentation [ 8]). wie man Wasm-Plug-Ins entwickelt ).

Plug-in-Konfigurationsmodell TransformerConfig:

# 模型以插件配置的形式暴露给用户
type TransformerConfig struct {
  typ   string          # Transformer 类型,[request, response]
  rules []TransformRule # 转换规则
  
  trans Transformer # Transformer 实例,不对用户暴露配置,用于实际的转换操作
}

type TransformRule struct {
  operate string   # 转换操作类型
  headers []Param  # header 参数 
  querys  []Param  # query 参数
  body    []Param  # body 参数
}

type Param struct {
  key         string # 表示字段的 key
  value       string # 表示字段的 value 或 key (map) 或 strategy (dedupe)
  valueType   string # 为 application/json body 指定 value 的数据类型
  hostPattern string # host 正则匹配模式
  pathPattern string # path 正则匹配模式
}

Transformer als Schnittstelle verfügt über zwei Implementierungen von Anforderung und Antwort (requestTransformer, ResponseTransformer). Es implementiert hauptsächlich drei Schnittstellenmethoden: TransformHeaders, TransformerQuerys und TransformBody:

type Transformer interface {
 TransformHeaders(host, path string, hs map[string][]string) error
 TransformQuerys(host, path string, qs map[string][]string) error
 TransformBody(host, path string, body interface{}) error
 ...
}

var _ Transformer = (*requestTransformer)(nil)
var _ Transformer = (*responseTransformer)(nil)

Da Header und Abfrageparameter (Abfragen) beide in Form von Schlüsselwerten vorliegen, wird für beide eine einheitliche Verarbeitungslogik über kvHandler verwendet. Und da Anfrage und Antwort unterschiedliche Inhaltstypen für den Text unterstützen, werden sie über requestBodyHandler separat verarbeitet ( kvHandler, jsonHandler-Kombination) und ResponseBodyHandler (jsonHandler) zur Verarbeitung. Zusammenfassend lässt sich sagen, dass Sie beim Ändern der Plug-In-Logik hauptsächlich kvHandler und jsonHandler ändern müssen, wobei jsonHandler auf den Werkzeugbibliotheken GJSON [ 9] und SJSON [ 10] basiert.

Derzeit ist die Konvertierungssequenz im Handler fest codiert (Entfernen -> Umbenennen -> Ersetzen -> Hinzufügen -> Anhängen -> Zuordnen -> Deduplizieren). Wir haben Pläne, dies zu optimieren, und interessierte Studenten sind herzlich willkommen, mitzumachen ~

Zusammenfassen

Dieser Artikel stellt Ihnen das Higress Transformer-Plug-In vor und vergleicht seine Leistung mit Spring Cloud Gateway. Am Ende des Artikels wird auch die Kerncodelogik des Plug-Ins erläutert. Ich hoffe, es kann Ihnen bei der Migration von Spring Cloud helfen Tor zur Higress!

Wenn Sie glauben, dass Higress für Sie hilfreich ist, gehen Sie bitte zu Github: Higress [ 11] , um uns zu markieren⭐️! Ich freue mich darauf, Sie in der Higress-Community kennenzulernen~

Verwandte Links:

[1] Spring Cloud Gateway

https://cloud.spring.io/spring-cloud-gateway/reference/html/

[2] SCG GatewayFilter-Fabriken

https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories

[3] Higress Transformer-Plug-in

https://github.com/alibaba/higress/tree/main/plugins/wasm-go/extensions/transformer

[4] Offizielle Dokumentation von Higress

https://higress.io/zh-cn/

[5] Higress Wasm SDK

https://github.com/alibaba/higress/tree/main/plugins

[6] Higress-Schnellstart

https://higress.io/zh-cn/docs/user/quickstart

[7] httpbin

https://httpbin.org/

[8] Entwickeln Sie das Higress Wasm-Plugin

https://higress.io/zh-cn/docs/user/wasm-go

[9] GJSON

https://github.com/tidwall/gjson

[10] SJSON

https://github.com/tidwall/sjson

[11] Higress-Code-Repository

https://github.com/alibaba/higress

[12] Transformer-Demo

https://github.com/higress-group/higress-demo/tree/main/wasm-demo/wasm-demo-go/wasm-plugin-transformer

[13] Leistungsvergleichskonfiguration

https://gist.github.com/WeixinX/c24f4ded37832dd7e753b2d27470f0fc

Der Autor eines bekannten Open-Source-Projekts verlor seinen Job aufgrund von Manie – „Suche nach Geld online“ No Star, No Fix 2023 Die zehn besten technischen Errungenschaften der Welt werden veröffentlicht: ChatGPT, Hongmeng Operating System, China Space Station und andere ausgewählte ByteDance wurden von OpenAI „verboten“. Google kündigt die beliebteste Chrome-Erweiterung im Jahr 2023 an Akademiker Ni Guangnan: Ich hoffe, dass inländische SSD importierte HDD ersetzen wird, um Xiaomi-Mobiltelefon BL zu entsperren? Stellen Sie zunächst eine Interviewfrage für Java-Programmierer. Arm hat mehr als 70 chinesische Ingenieure entlassen und plant, sein chinesisches Softwaregeschäft neu zu organisieren. OpenKylin 2.0 enthüllt | UKUI 4.10 Doppeldiamantendesign, schön und hochwertig! Manjaro 23.1 veröffentlicht, Codename „Vulcan“
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/3874284/blog/10344814
Recomendado
Clasificación