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

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

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

前置条件

  • 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

部署示例应用

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

kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: pipy
spec:selector:app: pipyports:- protocol: TCPport: 8080targetPort: 8080---
apiVersion: v1
kind: Pod
metadata:name: pipy-1labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},'Hello, world'))"]---
apiVersion: v1
kind: Pod
metadata:name: pipy-2labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 503},'Service unavailable'))"]
EOF

创建网关和路由

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

kubectl apply -n server -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:name: simple-fsm-gateway
spec:gatewayClassName: fsm-gateway-clslisteners:- protocol: HTTPport: 8000name: httpallowedRoutes:namespaces:from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:name: fortio-route
spec:parentRefs:- name: simple-fsm-gatewayport: 8000rules:- matches:- path:type: PathPrefixvalue: /backendRefs:- name: pipyport: 8080
EOF

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

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 unavailablecurl 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。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: SessionStickyPolicy
metadata:name: session-sticky-policy-sample
spec:targetRef:group: ""kind: Servicename: pipynamespace: serverports:- port: 8080config:cookieName: _srv_idexpires: 600
EOF

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

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-aliveHello, world

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

curl -b _srv_id=7252425551334343 http://$GATEWAY_IP:8000/
Hello, worldcurl -b _srv_id=7252425551334343 http://$GATEWAY_IP:8000/
Hello, worldcurl -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 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断素数的程序

判断一个数是否为素数的常见算法是试除法。素数&#xff08;质数&#xff09;是指只能被1和自身整除的正整数&#xff0c;因此可以通过逐个尝试除以小于该数的所有正整数来判断一个数是否为素数。 以下是用于判断素数的简单算法的示例代码&#xff1a; #include <stdio.h&…

中科大--高级数据库期末试卷

2023 秋一、单项选择题(10 分)二、判断题。正确的打√,错误的打(20 分)三、(10 分)四、(20 分)五、(20 分)六、(20 分)2021 秋2023 秋 中 国 科 学 技 术 大 学 2023—2024 学年第一学期考试试卷 考议形式:闭卷考试,允许使用计算器 考试科目:高级数据库系统…

【计算机网络】-换种方式思考万维网的发展

万维网WWW&#xff08;world wild web&#xff09;并非是某种特殊的计算机网络。万维网是一个大规模的、联机式的信息储藏所。 从应用的反方向去思考WEB在发展中遇到的问题 &#xff08;1&#xff09;如何标志发布在整个因特网上的文档&#xff1f; &#xff08;2&#xff0…

java判空工具类 java判断对象属性是否全部为空

java判空工具类 java判断参数是否为空工具类 java判断对象属性是否全部为空 。 可以判断字符串数组&#xff0c;字符串类型&#xff0c;List对象集合&#xff0c;Map集合map<String,object>&#xff0c;map和多个String参数&#xff0c;对象类型&#xff0c;是否为空。…

QT案例 Qt调用WIMGAPI库,读取/修改/装载WIM、ESD格式的镜像文件

WIMGAPI库是 Windows 操作系统中的一个应用程序编程接口&#xff08;API&#xff09;可用于创建&#xff0c;编辑&#xff0c;提取浏览和部署 WIM、ESD格式的镜像文件。 这里只简单演示在Qt Creator&#xff0c; Mscv2017 Debug&#xff0c;WINDOWS 开发环境下的调用完整实例。…

数据结构C++队列(数组模拟)

队列也是比较简单的数据结构了&#xff0c;队列的特点是先进先出 下面代码中hh是队头&#xff0c;tt是队尾。 默认是从队尾插入数据&#xff0c;队头弹出数据。 代码中的数据结构可以使用这图片来解释&#xff0c;整个区间是数组q。hh和tt分别控制队头和队尾。 例题&#x…

前端-打卡每日面试题-数据类型(2024.1.26)

一、分类 在JavaScript中&#xff0c;数据类型可以分为两大类&#xff1a;原始数据类型&#xff08;Primitive Types&#xff09;和引用数据类型&#xff08;Reference Types&#xff09;。 1. 原始数据类型&#xff08;Primitive Types&#xff09;: Number&#xff08;数字…

AI作画工具 stable-diffusion-webui 一键安装工具(A1111-Web-UI-Installer)

安装 下载最新版本确保你的 NVIDIA 显卡驱动程序是最新的&#xff08;起码不能太老&#xff09;启动安装程序在欢迎屏幕上单击下一步在屏幕上&#xff0c;选择要安装的内容如果你已经安装了 Python 3.10 和 Git&#xff0c;那么可以取消选中如果你不知道这些是什么&#xff0c…

C++(5) 构造函数、析构函数和封装案例

文章目录 构造函数、析构函数和封装案例1. 构造函数和析构函数1.1 概述1.2 案例1.3 编译器自行提供构造函数1.4 拷贝构造函数和特殊用法1.5 构造函数总结和要求 2. 封装案例2.1 封装的终极奥义2.2 封装一个 Cube 立方体 构造函数、析构函数和封装案例 1. 构造函数和析构函数 …

[01 LinuxShell ] 清华大学电子系科协软件部2023暑期培训

清华大学电子系科协软件部2023暑期培训_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11N4y187ZE/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&vd_source3ef6540f8473c7367625a53b7b77fd66 本视频为清华大学电子系科协软件部2023…

简单介绍----微服务和Spring Cloud

微服务和SpringCloud 1.什么是微服务&#xff1f; 微服务是将一个大型的、单一的应用程序拆分成多个小型服务&#xff0c;每个服务负责实现特定的业务功能&#xff0c;并且可以通过网络通信与其他服务通信。微服务的优点是开发更灵活&#xff08;不同的微服务可以使用不同的开…

nginx使用stream模块代理端口

今天原本准备将本地金仓的54321端口进行代理的&#xff0c;但是发现代理后总是无法访问。后来突然发现之前使用nginx代理的是一个地址而不是端口。因此做以下笔记用来做记录。 一、stream安装与配置 假设nginx在usr/local/nginx中 1. 测试当前nginx是否有stream模块 ./usr/…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧&#xff0c;使用 JPEG 标准对其进行压缩&#xff0c;然后通过UDP以太网将其传输到另一个设备&#xff08;例如计算机&#xff09;&#xff0c;所有…

代码随想录算法刷题训练营day17

代码随想录算法刷题训练营day17&#xff1a;LeetCode(110)平衡二叉树 LeetCode(110)平衡二叉树 题目 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(…

计算机二级C语言的注意事项及相应真题-6-程序填空

目录 51.将参数num按升序插入到数组xx中52.在数组中找出两科成绩之和最高的学生并返回其在数组中的下标53.删除所有串长超过k的字符串&#xff0c;输出剩下的字符串54.根据所给的一组学生的成绩&#xff0c;计算出平均成绩&#xff0c;并计算低于平均成绩的学生的平均成绩55.将…

python连接activemq

安装使用到的库 输入如下命令安装stomp pip install stomp.py 发送请求 # -*-coding:utf-8-*-import stomp import time# 队列名(接收方可以根据管道名来选择接受那个队列数据) location_queue "123456" # 服务器ip,端口固定用这个 conn stomp.Connection([(127…

AlexNet,ZFNet详解

1 AlexNet 网络结构 对于AlexNet网络来说&#xff0c;因为当时资源环境受限&#xff0c;他从第一步卷积开始就把一个图像分到两个GPU上训练&#xff0c;然后中间进行组合最后进行融合成全连接成1000个置信度 1 得到一张3x224x224的图像&#xff0c;然后进行11x11的卷积&…

山海鲸智慧医疗解决方案:让医疗数据说话

在医疗领域&#xff0c;数据可视化对于提高诊疗效率、辅助医学研究和提升患者就医体验具有重要意义。作为山海鲸可视化软件的开发者&#xff0c;我们致力于利用先进的数据可视化技术&#xff0c;为医疗行业提供高效、智能的解决方案&#xff0c;本篇文章就带大家一起了解一下这…

03 创建图像窗口的几种方式

read_image(Image, printer_chip/printer_chip_01) * 打开图像窗口 *用来打开一个新的图形窗口&#xff0c;可以用来显示图标对象&#xff0c;如图像、区域和线条&#xff0c;也可以执行文本输出。 *该窗口自动变为活动状态&#xff0c;所有所有输出(dev_display和自动显示操作…

pdf 转html 在线预览和查询

方案一&#xff1a;pdf2htmlex package com.realize.controller;import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSONObject; import com.realize.util.MsgUtil; import com.realize.util.OssUtil; import com.realize.util.PdfConvertUtil; import com.reali…