最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何使用Golang擴展Envoy

 更新時間:2023年06月11日 16:40:47   作者:豆?jié){大叔  
這篇文章主要為大家介紹了詳解如何使用Golang擴展Envoy實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、背景

主要介紹用 Golang 擴展 Envoy 的極速開發(fā)體驗

MoE(MOSN on Envoy)是 MOSN 團隊提出的技術(shù)架構(gòu),經(jīng)過近兩年的發(fā)展,在螞蟻內(nèi)部已經(jīng)得到了很好的驗證;并且去年我們也將底層的 Envoy Go 七層擴展貢獻了 Envoy 官方,MOSN 也初步支持了使用 Envoy 作為網(wǎng)絡(luò)底座的能力。

借此準(zhǔn)備寫一系列的文章,逐一介紹這里面的技術(shù)。本文作為開篇,將重點介紹 MoE 中的基礎(chǔ)技術(shù),Envoy Go 擴展。

二、FAQ

開始前,先給大家解答下幾個基本的問題:

1、MoE 與 Envoy Go 擴展有什么區(qū)別?

A:MoE 是技術(shù)架構(gòu),Envoy Go 擴展是連接 MOSN 和 Envoy 的基礎(chǔ)技術(shù)。

2、Envoy Go 擴展,與用 Go 來編譯 Wasm 有什么區(qū)別?

A:Envoy Go 支持 Go 語言的所有特性,包括 Goroutine;Go Wasm 則只能使用少量的 Go 語言特性,尤其是沒有 Goroutine 的支持。

3、Go 是靜態(tài)鏈接到 Envoy 么?

A:不是的,Go 擴展編譯成為 so,Envoy 動態(tài)加載 so,不需要重新編譯 Envoy

4、Envoy Go 支持流式處理么?

A:支持的。

由于 Go 擴展提供的是底層的 API,非常的靈活,使用上相對會稍微復(fù)雜一些;如果只想簡單的使用,可以使用 MOSN 的 filter,后面我們也會介紹。

三、需求

我們先實現(xiàn)一個小需求,來實際體會一下:

對請求需要進行驗簽,大致是從 URI 上的某些參數(shù),以及私鑰計算一個 token,然后和 header 中的 token 進行對比,對不上就返回 403。

很簡單的需求,僅僅作為示例,主要是體驗一下過程。??

四、代碼實現(xiàn)

完整的代碼可以看 envoy-go-filter-example[1] 這個倉庫,這里摘錄最核心的兩個函數(shù):

const secretKey = "secret"
func verify(header api.RequestHeaderMap) (bool, string) {
    token, ok := header.Get("token")
    if ok {
        return false, "missing token"
    }
    path, _ := header.Get(":path")
    hash := md5.Sum([]byte(path + secretKey))
    if hex.EncodeToString(hash[:]) != token {
        return false, "invalid token"
    }
    return true, ""
}
func (f *filter) DecodeHeaders(header api.RequestHeaderMap, endStream bool) api.StatusType {
    if ok, msg := verify(header); !ok {
        f.callbacks.SendLocalReply(403, msg, map[string]string{}, 0, "bad-request")
        return api.LocalReply
    }
    return api.Continue
}

DecodeHeaders 是擴展 filter 必須實現(xiàn)的方法,我們就是在這個階段對請求 header 進行校驗。

verify 是校驗函數(shù),這里的 RequestHeaderMap 是 Go 擴展提供的 interface,我們可以通過它來讀寫 header,其他都是常見的 Go 代碼寫法。

五、編譯

編譯很簡單,與常見的 Go 編譯一樣,這里我們使用 Golang 官方的 docker 鏡像來編譯:

docker run --rm -v `pwd`:/go/src/go-filter -w /go/src/go-filter \
-e GOPROXY=https://goproxy.cn \
golang:1.19 \
go build -v -o libgolang.so -buildmode=c-shared .

Go 編譯還是很快的,只需要幾秒鐘,當(dāng)前目錄下,就會產(chǎn)生一個 libgolang.so 的文件。反觀 Envoy 的編譯速度,一次全量編譯動輒幾十分鐘,或者上小時的,這幸福感提升了不止一個檔次。??

六、運行

我們可以使用 Envoy 官方提供的鏡像來運行,如下示例:

docker run --rm -v `pwd`/envoy.yaml:/etc/envoy/envoy.yaml \
        -v `pwd`/libgolang.so:/etc/envoy/libgolang.so \
        -p 10000:10000 \
        envoyproxy/envoy:contrib-dev \
        envoy -c /etc/envoy/envoy.yaml

只需要把上一步編譯的 libgolang.so 和 envoy.yaml 掛載進去就可以了。

值得一提的是,我們需要在 envoy.yaml 配置中啟用 Go 擴展,具體是這段配置:

http_filters:
  - name: envoy.filters.http.golang
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config
      library_id: example
      library_path: /etc/envoy/libgolang.so
      plugin_name: example-1

跑起來之后,我們測試一下:

$ curl 'http://localhost:10000/'
missing token
$ curl -s 'http://localhost:10000/' -H 'token: c64319d06364528120a9f96af62ea83d' -I
HTTP/1.1 200 OK

符合期望,是不是很簡單呢???

七、后續(xù)

什么?這個示例太簡單?

是的,這里主要是體驗下開發(fā)流程,下篇我們將再介紹更高級的玩法:

Go 接受來自 Envoy 側(cè)的配置、異步 Goroutine,以及與 Istio 配合的用法。

|相關(guān)鏈接|

[1]envoy-go-filter-example 倉庫:https://github.com/doujiang24/envoy-go-filter-example/tree/master/example-1

以上就是詳解如何使用Golang擴展Envoy的詳細內(nèi)容,更多關(guān)于Golang擴展Envoy的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • GO語言入門Golang進入HelloWorld

    GO語言入門Golang進入HelloWorld

    本篇文章是go語言基礎(chǔ)篇,非常適合go語言剛?cè)腴T的小白,主要介紹了GO語言入門Golang進入HelloWorld,跟著小編一起來編寫Go語言的第一程序helloworld吧
    2021-09-09
  • golang實現(xiàn)redis的延時消息隊列功能示例

    golang實現(xiàn)redis的延時消息隊列功能示例

    這篇文章主要介紹了golang實現(xiàn)redis的延時消息隊列功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 讓Go反射變快的方法實例探究

    讓Go反射變快的方法實例探究

    反射允許你在運行時獲得有關(guān) Go 類型的信息,如果你曾經(jīng)愚蠢地嘗試編寫 json.Unmarshal 之類的新版本,本文將探討的就是如何使用反射來填充結(jié)構(gòu)體值
    2024-01-01
  • GO workPool的線程池實現(xiàn)

    GO workPool的線程池實現(xiàn)

    本文主要介紹了GO workPool的線程池實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 用go gin server來做文件上傳服務(wù)

    用go gin server來做文件上傳服務(wù)

    今天小編就為大家分享一篇關(guān)于用go gin server來做文件上傳服務(wù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 基于原生Go語言開發(fā)一個博客系統(tǒng)

    基于原生Go語言開發(fā)一個博客系統(tǒng)

    這篇文章主要為大家詳細介紹了如何基于原生Go語言開發(fā)一個簡單的博客系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • GOLang?IO接口與工具使用方法講解

    GOLang?IO接口與工具使用方法講解

    這篇文章主要介紹了GOLang?IO接口與工具使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • golang判斷兩個事件是否存在沖突的方法示例

    golang判斷兩個事件是否存在沖突的方法示例

    這篇文章主要為大家詳細介紹了golang判斷兩個事件是否存在沖突的方法示例,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Go語言做爬蟲狀態(tài)碼返回418的問題解決

    Go語言做爬蟲狀態(tài)碼返回418的問題解決

    在使用Go語言做爬蟲時,使用http.Get(url)去獲取網(wǎng)頁內(nèi)容,狀態(tài)碼返回404,本文我們就詳細的介紹一下解決方法,感興趣的可以了解一下
    2021-12-12
  • Go Println和Printf的區(qū)別詳解

    Go Println和Printf的區(qū)別詳解

    這篇文章主要介紹了Go Println和Printf的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

胶南市| 宁安市| 山阴县| 高碑店市| 盐源县| 通州市| 怀来县| 新源县| 博客| 遂宁市| 尚义县| 广昌县| 慈溪市| 茂名市| 新闻| 孙吴县| 天台县| 荣昌县| 望都县| 澳门| 井研县| 南宫市| 阿拉善盟| 登封市| 濮阳县| 乐陵市| 大田县| 商水县| 溧阳市| 调兵山市| 修水县| 涟源市| 和龙市| 滁州市| 循化| 江达县| 商都县| 大关县| 长泰县| 雷山县| 宁德市|