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

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入

  • 故障注入前世今生
  • Envoy
  • 设置故障注入-延迟类型
  • 设置故障注入-延迟类型并带有自定义状态码
  • 总结

故障注入前世今生

故障注入是一种系统测试方法,通过引入故障来找到系统的bug,验证系统的稳健性。istio支持延迟故障注入和异常故障注入。

在服务网格和API网关等基础设施中,故障注入通常可以通过配置来实现,在Istio和Envoy中,可以使用EnvoyFilter或VirtualService资源来配置故障注入规则。通过这种方式,可以在不修改应用代码的情况下实现故障注入,便于测试和验证系统的健壮性。

Envoy

Envoy作为数据面代理,连接和流量处理的核心是网络过滤器(Network Filter),该过滤器一旦融合进过滤器链(Filter Chain),就可以实现访问控制、数据或协议转换、数据增强、审计等高级功能。通过添加新的过滤器,可以用来扩展Envoy的已有功能集。
在istio中,可以直接设置故障注入配置信息:

kubectl get vs xxx-svr -o yaml -n ns
spec:
  host:
  - xxx-svr
  http:
  - fault:
    abort:
      httpstatus: 500
      percent: 50
    delay:
      fixedDelay: 1s
      percent: 100

envoy官方对于故障注入的建议:https://cloudnative.to/envoy/configuration/http/http_filters/fault_filter.html
腾讯云官对于sidecar过滤器的描述和使用建议:https://cloud.tencent.com/document/product/649/43495

设置故障注入-延迟类型

鉴于envoy的特点,我们可以用它来实现故障注入,新建一个sidecar过滤器,填写以下内容:
过滤器名称:任意合法名称
作用位置:作为服务端
脚本内容:

function envoy_on_request(request_handle)
    --自定义部分,定义延迟概率和延迟时间的请求头
    local delay_percent = tonumber(request_handle:headers():get("x-delay-percent"))
    local delay_duration = tonumber(request_handle:headers():get("x-delay-duration"))

    if delay_percent and delay_duration then
        local random_value = math.random(100)
        if random_value < delay_percent then
            request_handle:logInfo("Injecting delay for " .. delay_duration .. " ms")
            os.execute("sleep " .. tostring(delay_duration / 1000))
        end
    end
end
function envoy_on_response(response_handle)
    --自定义部分
end

随后,登录到其他mesh应用(user)所在的节点上,执行命令:

持续请求,该脚本从HTTP请求头中读取x-delay-percent和x-delay-duration字段,然后根据这些字段的值决定是否注入延迟。如果随机数小于x-delay-percent,则注入延迟(单位:毫秒)
while true;do curl shop:80/api/v6/shop/items -H "x-delay-percent: 50" -H "x-delay-duration: 1000";sleep 1;done

然后我们就可以观察到,请求成功,进入调用链页面可以观察到,大概有50%的请求,被延迟了1000ms

在这里插入图片描述
查看envoy日志,可以查看到"Injecting delay for 1000ms "字样
在这里插入图片描述

设置故障注入-延迟类型并带有自定义状态码

当延迟类型的异常发生时,返回自定义状态码567:

function envoy_on_request(request_handle)
    --自定义部分
end
function envoy_on_response(response_handle)
    local delay_percent = 50 --50% 异常
    local delay_duration = 1000 --延迟1000ms

    local random_value = math.random(100)
    if random_value < delay_percent then
        response_handle:logInfo("Injecting delay for " .. delay_duration .. " ms")
        os.execute("sleep " .. tostring(delay_duration / 1000))
        response_handle:headers():replace(":status", "567")
    end
end

在这里插入图片描述

总结

和阿里给的一模一样嘛!excited!
在这里插入图片描述


http://www.kler.cn/news/133785.html

相关文章:

  • 二维码智慧门牌管理系统升级解决方案:查询功能大提升,让地址查找变得轻松便捷!
  • 比较两个数组内容是否相同
  • 【机器学习6】概率图模型
  • 滑动窗口练习(一)— 固定窗口最大值问题
  • LinkWeChat V4.9.8 版本发布
  • HCIA-综合实验(三)
  • linux 邮箱配置
  • 十、Linux运行级别
  • 创芯科技USB_CAN【库文件】
  • Network(四)NAT实现方式与VRRP概述
  • SQL编写规范【干货】
  • YOLOv8改进 | 如何在网络结构中添加注意力机制、C2f、卷积、Neck、检测头
  • MySQL进阶_9.事务基础知识
  • Redis哨兵模式(Docker)
  • 抽象工厂模式-C++实现
  • 当小白遇到电脑程序不完全退出怎么办?
  • kubernetes--Pod控制器详解
  • 【Java并发编程六】多线程越界问题
  • nginx 如何根据IP做限流,以及 nginx 直接返回 json 格式数据
  • 深信服AC密码认证(外部认证:LDAP认证)
  • C#中委托和事件的使用总结
  • JDK1.5 新特性【反射】
  • 大数据基础设施搭建 - ZooKeeper
  • 漏洞利用工具的编写
  • kafka 磁盘扩容与数据均衡实在操作讲解
  • K-Means算法进行分类
  • 2342. 数位和相等数对的最大和 --力扣 --JAVA
  • MySQL数据库下的Explain命令深度解析
  • 自动驾驶学习笔记(九)——车辆控制
  • .NET 8 正式 GA 遥遥领先