envoy開發調試環境搭建

image
image

前段時間研究envoy的filter開發,在windows機器環境上面折騰了會,這裏記錄一下,希望能夠幫助到大家少走一些坑

主要是使用vscode devContainer的方式來搭建開發調試環境, 這裏稍微解釋下,devContainer開發容器是把工程所需的環境打包成容器鏡像,在本機運行vscode後會連接到這個開發容器,特別envoy是個cpp項目,環境配置比較複雜,這種方式這樣大大提高了開發環境的搭建

但是對於計算機的配置有一些要求:

  • 內存>= 32G
  • 空餘磁盤空間>100G的

首先安裝DockerDeskTop

請配置啓用WSL2 image

會默認在WSL2環境啓用下面2個linux子系統 image

這裏有個坑 默認好像是安裝在系統盤C盤,如果你的C盤剩餘可用空間如果低於100G的話, 需要更改 WSL Docker Desktop 存儲路徑

我是將WSL Docker Desktop 存儲路徑轉存到了我的移動硬盤

image
image
image
image

有102G

具體如何操作這裏請參考 https://blog.csdn.net/qq12547345/article/details/125358539

下載envoy源碼

https://github.com/envoyproxy/envoy

git clone 這裏就得注意,我在windows環境git clone後會遇到文件的換行格式有問題,然後我用wsl的ubuntu機器git clone 就沒有這個問題。

也許是我的環境問題,如果你也遇到了提示文件格式有問題,可以試試

我本來是用最新版的嘗試,發現不行(請看文章最後我遇到的錯誤記錄),然後我就一個版本一個版本的試驗,在1.20.7版本搞成功了, 下面是基於1.20.7版本的envoy。

構建開發容器

打開vscode裝好 DevContainer這個插件

image
image

然後打開envoy工程

vscode會檢測到envoy工程的devcontainer配置文件 就會給個提示

image
image

這一步是根據devcontainer配置文件進行構建開發容器,需要花點時間,請耐心等待

在開發容器內生成相應的依賴文件

這一步成功完成後,代碼着色,代碼跳轉就沒問題

我們在vscode裏面新開一個Terminal

image
image

# 這個命令需要在容器內部執行
sudo chown -R vscode /workspaces
image
image

然後運行腳本

tools/vscode/refresh_compdb.sh
image
image

執行成功如下 image

會創建一個complie_commands.json文件 image

檢查代碼提示和跳轉確認都正常

image
image

以上代碼查看搞定了

調試環境

搞一個envoy的配置文件 envoy-demo.yaml

static_resources:
  listeners:
  - name: main
    address:
      socket_address:
        address: 0.0.0.0
        port_value: 8888
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: web_service
          http_filters:
          - name: envoy.filters.http.lua
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
              inline_code: |
                function envoy_on_request(request_handle)
                  local headers, body = request_handle:httpCall(
                  "soa_service",
                  {
                    [":method"] = "POST",
                    [":path"] = "/",
                    [":authority"] = "192.168.1.5"
                  },
                  "hello world",
                  5000)
                  request_handle:headers():add("foo", 'yuzd')
                end
                function envoy_on_response(response_handle)
                  body_size = response_handle:body():length()
                  response_handle:headers():add("test-body-size", tostring(body_size))
                end
          - name: envoy.filters.http.router
  clusters:
  - name: web_service
    type: STRICT_DNS  # static
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: web_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8000
  - name: soa_service
    type: STRICT_DNS  # static
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: soa_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 192.168.1.5
                port_value: 5000

上面的配置的意思是監聽了8080,然後配置轉發到 8000,並且配置了一個lua的httpfilter攔截器把流量轉到了 宿主機的5000

等會我們就在lua的http攔截器那裏打上斷點,看看是怎麼攔截的


tools/vscode/generate_debug_config.py //source/exe:envoy-static --args "-c envoy-demo.yaml"
image
image

在我電腦上執行需要約1個小時左右,取決於電腦配置

執行成功會生成調試的配置文件如下圖:

image
image

在main.cc 和lua_filter.cc裏面打上斷點

按照我們上面的envoy-demo.yaml配置

我們需要在容器內起一個8000端口的服務


python -m SimpleHTTPServer
image
image

然後再宿主機內起一個5000端口的服務 image

然後再vscode按F5 調試envoy

首先進入main.cc的斷點 image

啓動成功 vscode右下角會提示:

image
image

點擊OpenInBrower打開

請求到8888端口 envoy按照配置會轉發到 本地的8000端口(python服務) 且會走lua的httpfilter代碼,請求5000端口的服務

命中lua.cc的斷點 image

查看5000端口的服務,確認從envoy發出的請求 image

新版本的envoy遇到的問題記錄

採用如上方式編譯是成功的,代碼跳轉啥的也都是沒問題,就是一F5調試就會出現

image
image

提了issue: https://github.com/envoyproxy/envoy/issues/22788

再issue下面有個兄弟給了一個方法,試了也不行,目前我可成功調試的是envoy 1.20.7版本,具體原因不解,有知道麻煩給教育下~!

 

 

envoy相關知識

關注公衆號一起學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章