当前位置: 首页 > news >正文

envoy开发调试环境搭建

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

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相关知识

关注公众号一起学习

相关文章:

  • 多线程轮流打印 ABC
  • SpringCloud整合spring security+ oauth2+Redis实现认证授权
  • 轻量级开源ROS 的机器人设备(一)
  • java基于微信小程序的校园报修系统 uniapp小程序
  • IDEA详细配置『JDK | Maven | Tomcat』
  • 视觉目标检测大模型套件detrex-调研
  • Docker搭建私有镜像仓库与WordPress
  • 嵌入式软件工程师面试题(七)
  • 力扣(412.516)补8.21
  • 数据集 | 基于计算机视觉的医学影像处理数据集
  • Apache RocketMQ 在阿里云大规模商业化实践之路
  • 《uni-app》一个非canvas的飞机对战小游戏实现-敌机模型实现
  • HTML生日快乐代码 html生日快乐网站制作 html烟花表白网站制作
  • 环境卫生学重点笔记
  • 改进搜索机制的单纯形法引导麻雀搜索算法-附代码
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Angular 响应式表单 基础例子
  • canvas 高仿 Apple Watch 表盘
  • Javascripit类型转换比较那点事儿,双等号(==)
  • leetcode-27. Remove Element
  • leetcode388. Longest Absolute File Path
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • nodejs实现webservice问题总结
  • react 代码优化(一) ——事件处理
  • React组件设计模式(一)
  • Vue.js源码(2):初探List Rendering
  • Web设计流程优化:网页效果图设计新思路
  • win10下安装mysql5.7
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 和 || 运算
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 排序(1):冒泡排序
  • 区块链共识机制优缺点对比都是什么
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 函数计算新功能-----支持C#函数
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $L^p$ 调和函数恒为零
  • ()、[]、{}、(())、[[]]命令替换
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)JPA - JQPL 实现增删改查
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)h264中avc和flv数据的解析
  • (转)创业家杂志:UCWEB天使第一步
  • (转)详解PHP处理密码的几种方式
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Remoting学习笔记(三)信道