envoy開發調試環境搭建


envoy開發調試環境搭建

文章插圖
image
前段時間研究envoy的filter開發 , 在windows機器環境上面折騰了會 , 這里記錄一下,希望能夠幫助到大家少走一些坑
主要是使用vscode devContainer的方式來搭建開發調試環境,這里稍微解釋下,devContainer開發容器是把工程所需的環境打包成容器鏡像,在本機運行vscode后會連接到這個開發容器,特別envoy是個cpp項目 , 環境配置比較復雜,這種方式這樣大大提高了開發環境的搭建
但是對于計算機的配置有一些要求:
  • 內存>= 32G
  • 空余磁盤空間>100G的
首先安裝DockerDeskTop請配置啟用WSL2
envoy開發調試環境搭建

文章插圖
會默認在WSL2環境啟用下面2個linux子系統
envoy開發調試環境搭建

文章插圖
這里有個坑 默認好像是安裝在系統盤C盤,如果你的C盤剩余可用空間如果低于100G的話,需要更改 WSL Docker Desktop 存儲路徑
我是將WSL Docker Desktop 存儲路徑轉存到了我的移動硬盤

envoy開發調試環境搭建

文章插圖
image

envoy開發調試環境搭建

文章插圖
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這個插件

envoy開發調試環境搭建

文章插圖
image
然后打開envoy工程
vscode會檢測到envoy工程的devcontainer配置文件 就會給個提示

envoy開發調試環境搭建

文章插圖
image
這一步是根據devcontainer配置文件進行構建開發容器,需要花點時間 , 請耐心等待
在開發容器內生成相應的依賴文件這一步成功完成后 , 代碼著色,代碼跳轉就沒問題
我們在vscode里面新開一個Terminal

envoy開發調試環境搭建

文章插圖
image
# 這個命令需要在容器內部執行sudo chown -R vscode /workspaces
envoy開發調試環境搭建

文章插圖
image
然后運行腳本
tools/vscode/refresh_compdb.sh
envoy開發調試環境搭建

文章插圖
image
執行成功如下
envoy開發調試環境搭建

文章插圖
會創建一個complie_commands.json文件
envoy開發調試環境搭建

文章插圖
檢查代碼提示和跳轉確認都正常

envoy開發調試環境搭建

文章插圖
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

推薦閱讀