首页 > 其他分享 >Gateway API 实践之(四)FSM Gateway 的重试功能

Gateway API 实践之(四)FSM Gateway 的重试功能

时间:2024-01-24 14:38:15浏览次数:26  
标签:fortio fsm server 重试 FSM 100 Gateway

Gateway API 实践之(四)FSM Gateway 的重试功能_Gateway

网关的重试功能是一种重要的网络通信机制,旨在提高系统服务调用的可靠性和容错性。这个功能允许网关在初次请求失败时自动重新发送请求,从而减少临时性问题(如网络波动、服务瞬时过载等)对最终用户体验的影响。

它的工作原理是,当网关向下游服务发送请求时,如果遇到特定类型的失败(如连接错误、超时、5xx 系列错误等),而不是立即将这个错误返回给客户端,网关会根据预设的策略尝试重新发送请求。

重试则是 FSM Gateway 实现的众多 Policy Attachment 之一:

故障注入

访问控制

限速

重试

这篇文章将带大家体验下 FSM Gateway 的重试功能。

前置条件

Kubernetes 集群

kubectl 工具

环境准备安装 FSM Gateway

FSM Gateway 的安装,可以参考 安装文档。这里选择 CLI 的方式安装。

下载 FSM CLI。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.0
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安装 FSM 时启用 FSM Gateway,默认情况是不启用的。

fsm install \
    --set=fsm.fsmGateway.enabled=true
部署示例应用

我们使用 fortio server 作为示例应用,其可以通过请求参数 status 来定义响应状态码,并可以设置出现的概率。

kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: fortio
  labels:
    app: fortio
    service: fortio
spec:
  ports:
  - port: 8080
    name: http-8080
  selector:
    app: fortio
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fortio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fortio
  template:
    metadata:
      labels:
        app: fortio
    spec:
      containers:
      - name: fortio
        image: fortio/fortio:latest_release
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: http
EOF
创建网关和路由
kubectl apply -n server -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: simple-fsm-gateway
spec:
  gatewayClassName: fsm-gateway-cls
  listeners:
  - protocol: HTTP
    port: 8000
    name: http
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: fortio-route
spec:
  parentRefs:
  - name: simple-fsm-gateway
    port: 8000
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: fortio
      port: 8080
EOF

检查应用是否可以正常访问。

export GATEWAY_IP=$(kubectl get svc -n server -l app=fsm-gateway -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

curl -i http://$GATEWAY_IP:8000/echo
HTTP/1.1 200 OK
date: Fri, 05 Jan 2024 07:02:17 GMT
content-length: 0
connection: keep-alive
重试策略测试

在设置重试策略之前,通过添加参数 status=503:10 让 fortio server 有 10% 的机会返回 503。使用 fortio load 生成负载,发送 100 个请求可以看到接近 10% 的是 503 响应。

fortio load -quiet -c 1 -n 100 http://$GATEWAY_IP:8000/echo\?status\=503:10

Code 200 : 89 (89.0 %)
Code 503 : 11 (11.0 %)
All done 100 calls (plus 0 warmup) 1.054 ms avg, 8.0 qps

接下来设置重试策略。

targetRef 指定策略作用的目标资源,在重试策略中目标资源只能是 K8s core 中的 Service 或者 flomesh.io 中的 ServiceImport(后者用于多集群)。此处我们指定 命名空间 server 下的 fortio。

ports 服务的端口列表,由于服务可能暴露多个端口,可以为不同的端口这是重试策略。

  • port 服务端口,设置为本示例中 fortio 服务的 8080
  • config 重试策略的核心配置。
  • retryOn 是可重试的响应代码列表,例如 5xx 匹配 500-599,或 500 只匹配 500。
  • numRetries 重试的次数。
  • backoffBaseInterval 是计算退避的基本间隔(以秒为单位),即在连续的重试请求之间等待的时间。主要是为了避免在出现问题的服务上造成额外压力。

详细的重试策略配置可以参考官方文档 RetryPolicy。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: RetryPolicy
metadata:
  name: retry-policy-sample
spec:
  targetRef:
    kind: Service
    name: fortio
    namespace: server
  ports:
  - port: 8080
    config:
      retryOn:
      - 5xx
      numRetries: 5
      backoffBaseInterval: 2
EOF

待策略生效后,同样发送 100 个请求,可以看到全部都是 200 的响应。需要留意的是,平均的响应时间有延长,因为重试增加了耗时。

fortio load -quiet -c 1 -n 100 http://$GATEWAY_IP:8000/echo\?status\=503:10

Code 200 : 100 (100.0 %)
All done 100 calls (plus 0 warmup) 160.820 ms avg, 5.8 qps

关于 Flomesh

Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。

Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持适用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、OpenWrt 等多种核心的操作系统。

Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。

标签:fortio,fsm,server,重试,FSM,100,Gateway
From: https://blog.51cto.com/u_16455808/9395230

相关文章

  • STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的FSMC实现以轮询或DMA的方式读写IS62WV51216(SRAM)芯片3、......
  • STM32CubeMX教程22 FSMC - 8080并行接口TFT-LCD驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板FSMC接口驱动8080并行接口TFT-LCD显示,具体为使用FSMCBank......
  • 比Nginx更好用的Gateway!
    比Nginx更好用的Gateway!Token新开源Gateway,使用yarp实现的一个反向代理,支持界面操作动态添加集群添加路由绑定,并且支持动态添加域名绑定https证书,超强yarp+FreeSql+MiniApis纯原生接口实现。功能亮点在线配置域名证书:实时生效,无需重启服务。集群和路由的在线配置:动态添加和修......
  • Oozie重试任务不生效问题解决
    1、oozie默认为不重试规则,想要重试需在action中配置重试规则,示例如下:retry-max="3"retry-interval="1"发现增加以上配置后,任务失败并未生效;2、在~/oozie/conf/oozie-site.xml中增加以下配置:<property><name>oozie.service.LiteWorkflowStoreService.user.retry.error.cod......
  • gateway笔记
    自定义断言新增一个Bean标记为@Component、继承AbstractRoutePredicateFactory类命名需要以RoutePredicateFactory结尾声明一个静态内部类来接受配置文件中的信息重写shortcutFieldOrder来映射配置文件中的参数重写apply方法下面是一个根据请求头和时间来决定......
  • 46重试装饰器retry
     fromretryingimportretryr'''安装:pipinstallretryingVersion:1.3.4作用:retrying库是Python中用于实现重试机制的库,它们的目的都是在遇到错误或异常时自动重试代码块,以增加代码的健壮性和可靠性.下面的案例抽几个常用参数说明retry装饰器,当然也可以自己编写代码......
  • Kepware OPC UA Gateway之技术深度剖析与分享
    KepwareOPCUAGateway之技术深度剖析与分享随着客户对Kepware产品功能需求的进一步深入,Kepware适时推出了全功能套件(Premium Connectivity Suite)。使用一个授权即可解锁KepwareServer的所有功能,包含所有标准/高级驱动,IoTGateway,Datalogger,AdvancedTags等高级插件以及OPCU......
  • 盘点Gateway-Worker启动的九种报错和解决方法
    Workerman是一款开源高性能异步PHPsocket即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mys......
  • Unity UnityWebRequest增加重试
    逻辑比较简单,直接上代码:IEnumeratorRequest(stringurl,stringmethod,Dictionary<string,string>headers,byte[]bodyRaw,intretryCount,System.Action<DownloadHandler>callback){for(inti=0;i<retryCount;i++)......
  • 07. HTTP接口请求重试怎么处理?
     目录1、前言2、实现方式2.1、循环重试2.2、递归重试2.3、SpringRetry2.4、Resilience4j2.5、http请求网络工具内置重试方式2.6、自定义重试工具2.7、并发框架异步重试2.8、消息队列3、小结1、前言HTTP接口请求重试是指在请求失败时,再次发起请求的机制。在实际应用中,由于网络波动......