首頁  >  文章  >  後端開發  >  在Beego中使用Kong進行API閘道管理

在Beego中使用Kong進行API閘道管理

PHPz
PHPz原創
2023-06-22 17:13:451266瀏覽

隨著微服務架構的流行,API網關越來越受到關注。作為微服務架構中的重要組成部分之一,API網關是一個負責分發請求、路由請求以及過濾請求的應用程式。在許多企業中,Kong已成為最受歡迎的API網關之一,因為其靈活、可擴展且易於使用。

Beego是一個快速開發Go應用程式的框架,可以提供RESTful API開發的支援。在這篇文章中,我們將探討如何在Beego中使用Kong進行API閘道管理。

  1. 安裝Kong

首先,我們需要安裝Kong。 Kong可以在不同的平台上運行,包括Windows、Linux、Docker等。這裡以在Linux上安裝Kong為例。

使用yum安裝Kong:

$ echo '[bintray--kong-kong-rpm]
name=bintray--kong-kong-rpm
baseurl=https://kong.bintray.com/kong-community-edition-rpm/centos/$releasever/$basearch/
gpgcheck=0
repo_gpgcheck=0
enabled=1' | sudo tee /etc/yum.repos.d/bintray-kong-kong-rpm.repo
$ sudo yum install -y kong

安裝完成後,執行kong啟動Kong服務。

  1. 建立API

在Beego中實作API,並將其註冊到Kong中,使其成為可供外部存取的API。

在Beego實作API比較簡單,這裡不做太多介紹。要注意的是,需要在Beego中使用Kong的Admin API,因此需要安裝Kong的官方Go客戶端:kong-go-sdk。

$ go get github.com/Kong/go-kong/kong

在創建API之前,我們需要有一個Kong Admin API的客戶端對象,如下所示:

import "github.com/Kong/go-kong/kong"

const KongAdminURL = "http://localhost:8001"

func NewKongClient() (*kong.Client, error) {
    return kong.NewClient(kong.String(KongAdminURL))
}

然後,我們可以透過程式碼實現API的註冊。以下是一個簡單的範例:

func RegisterAPI(name, upstreamURL, requestHost, stripPath string) error {
    kongClient, err := NewKongClient()
    if err != nil {
        return fmt.Errorf("create kong client error: %v", err)
    }

    targetURL, err := url.Parse(upstreamURL)
    if err != nil {
        return fmt.Errorf("parse target url error: %v", err)
    }

    api := &kong.API{
        Name:        kong.String(name),
        Uris:        kong.StringSlice("/" + name),
        UpstreamURL: kong.String(targetURL.String()),
        RequestHost: kong.String(requestHost),
        StripUri:    kong.Bool(true),
        StripPath:   kong.Bool(stripPath),
    }

    _, err = kongClient.APIs().Create(kongContext.Background(), api)
    if err != nil {
        return fmt.Errorf("register api to kong error: %v", err)
    }

    return nil
}

在上面的程式碼中,我們首先建立了一個Kong Admin API的客戶端對象,然後使用kong.API 建立一個API 對象,如API名稱、API對應的Upstream URL、要求的網域名稱、是否啟用URI移除、是否啟用URI截斷等選項。最後,我們使用Kong Admin API 的 client 來建立API。

接下來,我們需要設定Kong,增加插件和路由來指定請求和回應的處理。

  1. 配置Kong

Kong支援許多插件,使我們可以在請求和回應時進行更高級的處理。常用的外掛程式包括rate-limitingkey-authoauth2等。在這裡,我們將使用rate-limiting外掛程式來限制API的存取速度。

func AddPlugin(apiName string) error {
    kongClient, err := NewKongClient()
    if err != nil {
        return fmt.Errorf("create kong client error: %v", err)
    }

    api, err := kongClient.APIs().Get(kongContext.Background(), &apiName)
    if err != nil {
        return fmt.Errorf("get api error: %v", err)
    }

    plugin := &kong.RateLimiting{
        Name:       kong.String("rate-limiting"),
        ConsumerID: nil,
        Limit:      kong.Int(10),
        Policy:     kong.String("local"),
    }

    _, err = kongClient.Plugins().Create(kongContext.Background(), &kong.Plugin{
        APIID: api.ID,
        Name:  plugin.Name,
        Config: kong.Configuration{
            kong.String("consumer_id"): plugin.ConsumerID,
            kong.String("limit"):       plugin.Limit,
            kong.String("policy"):      plugin.Policy,
        },
    })

    if err != nil {
        return fmt.Errorf("add rate-limiting plugin error: %v", err)
    }

    return nil
}

func AddRoute(apiName string) error {
    kongClient, err := NewKongClient()
    if err != nil {
        return fmt.Errorf("create kong client error: %v", err)
    }

    route := &kong.Route{
        Name:   kong.String(apiName),
        Paths:  kong.StringSlice(fmt.Sprintf("/%s", apiName)),
        StripPath: kong.Bool(true),
        PreserveHost: kong.Bool(false),
        RegexPriority: kong.Int(0),
        Service: &kong.Service{
            ID: kong.String(apiName),
        },
    }

    _, err = kongClient.Routes().Create(kongContext.Background(), route)
    if err != nil {
        return fmt.Errorf("add route error: %v", err)
    }

    return nil
}

在上面的程式碼中,我們使用鍊式呼叫實作了Kong的插件和路由。

為了示範方便,我們只加入了一個限流插件。執行CreateRateLimiting函數,我們會在Kong網關中建立一個名為「rate-limiting」的插件,並將其套用到名為「api-name」的API上。程式碼中,10代表了並發請求數的限制。

運行方法時需要傳入API的名稱,我們需要先使用api名稱在網關中建立API。呼叫 RegisterAPI 函數,向Kong網關註冊我們在 Beego 應用程式中實現的API。

在執行 AddPlugin 函數和 AddRoute 函數後,我們的 API 已經註冊到 Kong 閘道中。

這裡我們採用的是在 Beego 應用程式中直接向 Kong API 網關註冊 API 的方法,其實 Kong 也支援使用設定檔或其他方式透過 Kong Manager 或 Kong Dashboard 進行 API 的註冊。不過這些方式需要我們手動在 Kong API 閘道後台操作,操作繁瑣、耗時。

最後,我們只需要透過Kong的API網關存取我們在Beego中實現的API。我們可以使用Postman或其他REST client來進行測試。

  1. 總結:

在這篇文章中,我們介紹如何使用Kong進行API網關管理,包括API的註冊、外掛程式的新增和路由的指定。使用Kong作為API的網關,可以實現更靈活、高效、安全的API管理和監控。

以上是在Beego中使用Kong進行API閘道管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn