代理型別升級,APISIX 支援 Kafka 作為上游

Apache_APISIX發表於2022-07-05

Apache Kafka 是一個開源流處理平臺,是一種高吞吐量的分散式釋出訂閱訊息系統,可以處理消費者在網站中的所有動作流資料,其所有功能都是以分散式、高度可擴充套件、彈性、容錯和安全的方式提供的。

在 Apache APISIX 2.14 版本中釋出了一個新功能,即提供 Kafka 型別的上游,使用者可以通過在路由中配置 scheme 為 Kafka 的上游開啟 Kafka 消費者功能,從而在各種環境中實現訊息訂閱。

本文將介紹 Kafka 釋出訂閱功能及 kafka-proxy 外掛的使用細節,為大家呈現如何將 APISIX 與 Kafka 結合使用在瀏覽器等連線受限的場景,實現對 Kafka 中訊息的消費。

原理

Kafka 使用自定義的 TCP 協議實現 Broker 與消費者之間的通訊。在 Apache APISIX 中,你可以通過四層代理實現這部分的代理,但對於終端使用者(如瀏覽器等)與 Broker 通訊這種無法直接使用 TCP 連線的場景,則沒有辦法進行很好的支援。

而現在,客戶端可通過 WebSocket 連線到 APISIX,在 APISIX 內部建立與 Kafka 的連線,進而處理客戶端的命令(如獲取偏移量、獲取訊息等)。通過 WebSocket 的連線,可以避免在瀏覽器這種無法直接使用 TCP 連線的場景中從 Kafka 中拉取訊息。

通過上述流程圖可以看到,這裡內部使用自定義的 Protobuf 協議作為通訊協議,通過便捷的編譯過程,使其後續可在多種語言的程式中使用。在過程中,主要通過 ListOffsets 命令來獲取偏移量,通過 Fetch 命令來獲取訊息。

除此之外,由於 Kafka 消費者的功能是基於 APISIX 的 PubSub 框架,所以你也可以基於該框架擴充套件其他訊息系統,實現更豐富的釋出訂閱能力。

如何使用

設定 Kafka 路由

APISIX 新增了一種新的上游 Scheme 型別,除支援 HTTP、GRPC 等協議外,現在也支援了 Kafka。在操作過程中,只需將 scheme 欄位值設定為 kafkanodes 欄位中設定為 Kafka Broker 的地址與埠,即可開啟 APISIX 的 Kafka 釋出訂閱支援。

curl -X PUT 'http://127.0.0.1:9080/apisix/admin/routes/kafka' \
    -H 'X-API-KEY: ${api-key}' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/kafka",
    "upstream": {
        "nodes": {
            "kafka-server:9092": 1
        },
        "type": "none",
        "scheme": "kafka"
    }
}'

(可選)設定 TLS 握手

當 Kafka 上游的 tls 欄位存在時,APISIX 會為該連線開啟 TLS 握手,同時 tls 中還有一個 verify 欄位,你可以通過它控制 TLS 握手時是否校驗伺服器證書。

curl -X PUT 'http://127.0.0.1:9080/apisix/admin/routes/kafka' \
    -H 'X-API-KEY: ${api-key}' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/kafka",
    "upstream": {
        "nodes": {
            "kafka-server:9092": 1
        },
        "type": "none",
        "scheme": "kafka",
        "tls": {
            "verify": true
        }
    }
}'

(可選)設定 SASL/PLAIN 認證

為了支援認證功能,APISIX 中還提供了 kafka-proxy 外掛,使用者可以通過它為 Kafka 的路由配置 SASL 認證功能,當前它僅支援 PLAIN 模式的認證。

curl -X PUT 'http://127.0.0.1:9080/apisix/admin/routes/kafka' \
    -H 'X-API-KEY: ${api-key}' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/kafka",
    "plugins": {
        "kafka-proxy": {
            "sasl": {
              "username": "user",
              "password": "pwd"
            }
        }
    },
    "upstream": {
        "nodes": {
            "kafka-server:9092": 1
        },
        "type": "none",
        "scheme": "kafka"
    }
}'

設定客戶端及測試

你可以從 Apache APISIX 的 GitHub 倉庫中獲取 PubSub 的協議定義,這其中包含 Kafka 的命令與響應,需要將它編譯成所需語言的 SDK。

之後便可通過客戶端(如瀏覽器)以 WebSocket 連線之前設定的 Kafka 路由 URI ws://127.0.0.1:9080/kafka,向其傳送 PubSubReq 資料。這其中包含需要使用的命令,APISIX 將從 Kafka 中獲取資料,並向客戶端傳送 PubSubResp 響應資料。

如使用完畢,只需要移除路由即可關閉該端點的 Kafka 功能。得益於 APISIX 動態化特性,無需重啟即可實現狀態更新。

總結

關於 Kafka 釋出訂閱功能的更多說明和完整配置列表,你可以參考下方連結:

目前,Apache APISIX 也在進行其他訊息系統的釋出訂閱能力支援,如果你對此感興趣,也歡迎閱讀釋出訂閱(PubSub)模組的開發文件 https://apisix.apache.org/zh/...

如果你有任何想法,也可以在 GitHub Discussion 中發起討論,或通過社群郵件列表進行交流。

相關文章