隨著微服務架構的流行,API網關作為微服務架構中不可或缺的一環,在企業中也越來越被重視。 API閘道主要是扮演對外的門面,提供一個入口點,負責協定轉換、分散式負載平衡、安全認證、API管理等一系列功能。在許多應用場景中,API網關不僅在技術層面上解決了許多問題,還可以在業務層面上實現快速迭代、靈活擴展等好處。
本文將介紹如何使用Go語言建立一個基於Kong的API網關,包括使用Kong管理APIs和Plugins,以及使用Go語言和Kong API操作Kong配置。
一、Kong介紹
Kong是一個開源的API網關,提供了一系列完整的API管理和安全功能,可以運作在多種環境中。它主要提供了負載平衡、服務發現、路由、認證、授權、限流、監控、插件等管理工具。 Kong使用Nginx作為代理伺服器,利用插件機制為HTTP流量加入了各種進階功能。 Kong的插件可以根據需要啟用,這樣Kong就可以滿足各種特定業務場景和需求,因此也很受歡迎。
二、使用Kong管理APIs和Plugins
可以透過Kong官網的安裝指南,選擇不同的環境來安裝。這裡以Ubuntu為例:
$ echo "deb https://kong.bintray.com/kong-deb `lsb_release -sc` main" | sudo tee -a /etc/apt/sources.list $ curl -o bintray.key https://bintray.com/user/downloadSubjectPublicKey?username=bintray $ sudo apt-key add bintray.key $ sudo apt-get update && sudo apt-get install -y kong
安裝成功後會在/etc/kong
目錄下產生Kong的設定檔。
$ kong start
使用Kong的Admin API來管理API。
$ curl -i -X POST --url http://localhost:8001/apis/ --data 'name=helloworld' --data 'uris=/hello' --data 'upstream_url=http://example.com/hello'
上述範例透過Admin API建立了一個名為helloworld,路由URI為/hello,上游伺服器位址為http://example.com/hello的API,這樣,只要造訪http://localhost :8000/hello,就可以到http://example.com/hello。
使用Kong可以方便地加入Plugins,讓API的能力進一步增強。
$ curl -i -X POST --url http://localhost:8001/apis/helloworld/plugins/ --data 'name=key-auth'
上述範例透過Admin API為helloworld這個API新增了一個名為key-auth的外掛程式。這個外掛程式用於基於API Key(金鑰)進行認證。
三、使用Go語言和Kong API操作Kong配置
除了使用Admin API來管理API和Plugins,也可以使用Kong提供的RESTful API進行更細粒度的控制,它完全符合Kong內部的資料模型,比起Admin API更方便。
這裡我們將使用Go語言,結合Kong Client SDK操作Kong配置。
$ go get github.com/Kong/go-kong/kong
conf := kong.Configuration{ KongAdminURL: "http://localhost:8001", // Kong Admin接口地址 KongURL: "http://localhost:8000", // Kong代理服务地址 }
api := &kong.Api{ Name: kong.String("helloworld"), RequestHost: kong.String("example.com"), UpstreamURL: kong.String("http://example.com/hello"), } route := &kong.Route{ Name: kong.String("hello-route"), Paths: kong.StringSlice([]string{"/hello"}), Methods: kong.StringSlice([]string{"GET"}), }
建立好之後,可以使用以下程式碼將它們關聯起來:
service, err := kong.CreateServiceWithDefaults(conf, api) // 用默认配置创建Service if err != nil { panic(err) } route, err = kong.CreateRouteWithDefaults(conf, route, service) if err != nil { panic(err) }
這樣,就建立了一個名為helloworld,路由URI為/hello,上游伺服器位址為http:// example.com/hello,使用GET請求存取的Route。
新增Plugin也很簡單,這裡我們新增一個基於Token的Authentication插件,用於使用者認證。程式碼如下:
plugin := &kong.Plugin{ Name: kong.String("jwt"), Config: kong.Configuration{ "anonymous": "true", }, } route.Plugins = []*kong.Plugin{plugin} _, err = kong.UpdateRouteWithDefaults(conf, route, service) if err != nil { panic(err) }
這裡我們使用Plugin的名字為jwt,於是就可以加入JWT認證了。這裡我們使用了匿名認證。
總結
本文介紹了使用Go語言和Kong Client SDK來建立API網關的過程。透過使用Kong,可以快速建構API網關,管理API和插件,實現認證、限流等功能。使用Go語言和Kong Client SDK可以進一步控制和管理Kong。這些工具可以提高API網關的可擴充性和管理性,使得微服務更能服務業務。
以上是使用Go語言建構API網關的詳細內容。更多資訊請關注PHP中文網其他相關文章!