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

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

PHPz
發布: 2023-06-22 17:13:45
原創
1631 人瀏覽過

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

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

  1. 安裝Kong

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

使用yum安裝Kong:

1

2

3

4

5

6

7

$ 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。

1

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

登入後複製

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

1

2

3

4

5

6

7

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

 

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

 

func NewKongClient() (*kong.Client, error) {

    return kong.NewClient(kong.String(KongAdminURL))

}

登入後複製

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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的存取速度。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板