【无标题】Gateway API 实践之(五)FSM Gateway 的会话保持功能

网关的会话保持功能是一种网络技术,旨在确保用户的连续请求在一段时间内被定向到同一台后端服务器。这种功能在需要保持用户状态或进行连续交互的场景中特别重要,例如在维护在线购物车、保持用户登录状态或处理多步骤事务时。

会话保持通过提供一致的用户体验和维护事务完整性,对提高网站性能和用户满意度起着关键作用。它通常通过使用诸如 Cookies 等客户端识别信息或服务器端的 IP 绑定技术来实现,从而保证请求的连续性和服务器的有效负载均衡。

前置条件

  • Kubernetes 集群
  • kubectl 工具

环境准备

安装 FSM Gateway

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

下载 FSM CLI。

shell 复制代码
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,默认情况是不启用的。

shell 复制代码
fsm install \
    --set=fsm.fsmGateway.enabled=true

部署示例应用

为了验证会话保持功能,我们创建了 Service pipy,并为其创建了两个返回不同响应的端点。这两个端点使用可编程代理 Pipy 来模拟的。

shell 复制代码
kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: pipy
spec:
  selector:
    app: pipy
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

---
apiVersion: v1
kind: Pod
metadata:
  name: pipy-1
  labels:
    app: pipy
spec:
  containers:
  - name: pipy
    image: flomesh/pipy:0.99.0-2
    command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},'Hello, world'))"]

---
apiVersion: v1
kind: Pod
metadata:
  name: pipy-2
  labels:
    app: pipy
spec:
  containers:
  - name: pipy
    image: flomesh/pipy:0.99.0-2
    command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 503},'Service unavailable'))"]
EOF

创建网关和路由

接下来创建网关并为 Service pipy 创建路由。

shell 复制代码
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: pipy
      port: 8080
EOF

检查应用是否可以正常访问。通过结果可以看到,网关将请求负载均衡到了两个端点上。

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

curl http://$GATEWAY_IP:8000/
Service unavailable

curl http://$GATEWAY_IP:8000/
Hello, world

会话保持策略测试

接下来配置会话保持策略。

  • targetRef 指定策略作用的目标资源,在会话保持策略中目标资源只能是 K8s core 中的 Service 。此处我们指定 命名空间 server 下的 pipy
  • ports` 服务的端口列表,由于服务可能暴露多个端口,可以为不同的端口这是重试策略。
    • port 服务端口,设置为本示例中 pipy 服务的 8080
    • config 策略的核心配置。
      • cookieName 使用 cookie 保持会话的负载均衡时的 cookie 名称。这个字段是非必须的,但当启用基于 cookie 的会话保持时,它定义了存储后端服务器信息的 cookie 的名称,例如 _srv_id。这意味着当用户首次访问应用时,一个名为 _srv_id 的 cookie 会被设置,其值通常对应于某个后端服务器。当该用户再次访问时,此 cookie 会确保他们的请求被路由到与之前相同的服务器。
      • expires 使用 cookie 保持会话时,cookie 的有效期。这定义了 cookie 的存活时间,即多长时间内用户的连续请求会被定向到同一台后端服务器。

详细的会话保持策略配置可以参考官方文档 SessionStickyPolicy

shell 复制代码
kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: SessionStickyPolicy
metadata:
  name: session-sticky-policy-sample
spec:
  targetRef:
    group: ""
    kind: Service
    name: pipy
    namespace: server
  ports:
  - port: 8080
    config:
      cookieName: _srv_id
      expires: 600
EOF

创建策略后,再次发送请求。通过添加选项 -i 可以看到响应头部添加了 cookie 的信息。

shell 复制代码
curl -i http://$GATEWAY_IP:8000/
HTTP/1.1 200 OK
set-cookie: _srv_id=7252425551334343; path=/; expires=Fri,  5 Jan 2024 19:15:23 GMT; max-age=600
content-length: 12
connection: keep-alive

Hello, world

接下来发送 3 个请求,通过参数 -b 添加上面响应中的 cookie 信息,可以看到 3 个请求都收到了同样的响应。这说明会话保持功能生效了。

shell 复制代码
curl -b _srv_id=7252425551334343 http://$GATEWAY_IP:8000/
Hello, world

 curl -b _srv_id=7252425551334343 http://$GATEWAY_IP:8000/
Hello, world

curl -b _srv_id=7252425551334343 http://$GATEWAY_IP:8000/
Hello, world

关于 Flomesh

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

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

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

相关推荐
小坏讲微服务9 小时前
Spring Cloud Alibaba Gateway 集成 Redis 限流的完整配置
数据库·redis·分布式·后端·spring cloud·架构·gateway
半旧夜夏3 天前
【Gateway】服务调用和网关配置攻略
java·spring boot·spring cloud·gateway
小坏讲微服务3 天前
Nginx集群与SpringCloud Gateway集成Nacos的配置指南
spring boot·nginx·spring cloud·gateway
小坏讲微服务4 天前
使用 Spring Cloud Gateway 实现集群
java·spring boot·分布式·后端·spring cloud·中间件·gateway
没有bug.的程序员4 天前
Spring Cloud Gateway 路由与过滤器机制
java·开发语言·spring boot·spring·gateway
serendipity_hky5 天前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
三口吃掉你9 天前
微服务之网关(Spring Cloud Gateway)
java·网关·微服务·gateway
余衫马9 天前
微服务SpringCloud报错合集
spring boot·gateway
Zz_waiting.9 天前
统一服务入口-Gateway
java·开发语言·gateway
菲兹园长11 天前
微服务组件(E、L、N、O、G)
linux·服务器·gateway