隨著微服務架構的流行,API網關越來越受到關注。作為微服務架構中的重要組成部分之一,API網關是一個負責分發請求、路由請求以及過濾請求的應用程式。在許多企業中,Kong已成為最受歡迎的API網關之一,因為其靈活、可擴展且易於使用。
Beego是一個快速開發Go應用程式的框架,可以提供RESTful API開發的支援。在這篇文章中,我們將探討如何在Beego中使用Kong進行API閘道管理。
首先,我們需要安裝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服務。
在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,增加插件和路由來指定請求和回應的處理。
Kong支援許多插件,使我們可以在請求和回應時進行更高級的處理。常用的外掛程式包括rate-limiting
、key-auth
和oauth2
等。在這裡,我們將使用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來進行測試。
在這篇文章中,我們介紹如何使用Kong進行API網關管理,包括API的註冊、外掛程式的新增和路由的指定。使用Kong作為API的網關,可以實現更靈活、高效、安全的API管理和監控。
以上是在Beego中使用Kong進行API閘道管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!