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

一文学习 Spring 声明式事务源码全流程总结碌

在之前的文章中我们花了大量的篇幅从记录后端pod真实ip开始说起然后引入envoy再解决了各种各样的需求配置自动重载、流量劫持、sidecar自动注入到envoy的各种能力熔断、流控、分流、透明代理、可观测性等等已经可以支撑起一个完整的服务治理框架了而今天介绍的istio正是前面提到的这些所有功能的集大成者从本文开始我们将详细介绍istio并且与之前手搓的功能做一个详细的对比为大家以后选择服务治理的某个功能提供参考istio架构┌──────────────┐│ istiod │ ← 控制面│ (PilotCA) │└──────┬───────┘│ xDS (gRPC / TLS)│┌────────────┐ │ ┌────────────┐│ Envoy │?───┼───?│ Envoy │ ← 数据面│ (Sidecar) │ │ (Sidecar) │└─────▲──────┘ └─────▲──────┘│ iptables ││ │App Pod App Pod数据面就是之前一直在研究的envoy包括4/7代理、熔断、限流、可观测性等等envoy就是执行由控制面下发的配置控制面istiod主要的职责将配置下发到每一个envoy去。由于istio中配置以crd的形式成为了k8s的资源所以要不断的监听k8s apiserver将资源的变化翻译成envoy看得懂的配置并且下发到envoy去至于其余istio的资源我们后面详细介绍istio安装不说废话先把istio安装上去再说首先准备好k8s集群其次下载istio这一步有可能需要上网curl -L https://istio.io/downloadIstio | sh -cd istio-*sudo ln -s $PWD/istioctl /usr/local/bin/istioctl验证兼容性istioctl x precheck开始安装istioctl install --set profiledefault -y由于镜像仓库没法直接使用所以需要一些特殊的方法具体可以看这篇文章 快速拉取docker镜像需要的镜像有docker.io/istio/pilot:1.28.2docker.io/istio/proxyv2:1.28.2安装完成? kubectl -n istio-system get podNAME READY STATUS RESTARTS AGEistio-ingressgateway-865c448856-qs8s2 1/1 Running 0 8sistiod-86c75775bb-j7qbg 1/1 Running 0 12s安装完成要从哪儿开始呢istio的自动注入kubectl label namespace default istio-injectionenabled同之前envoy一样给namespace打上标签之后重启服务即可kubectl rollout restart deploy nginx-test重启之后sidecar已经注入进去了我们来观察一下istio注入到底做了什么事情先describe看看eventsEvents:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 8s default-scheduler Successfully assigned default/nginx-test-6f855b9bb9-9phsv to wilsonNormal Pulled 8s kubelet Container image docker.io/istio/proxyv2:1.28.2 already present on machineNormal Created 8s kubelet Created container: istio-initNormal Started 8s kubelet Started container istio-initNormal Pulled 8s kubelet Container image docker.io/istio/proxyv2:1.28.2 already present on machineNormal Created 8s kubelet Created container: istio-proxyNormal Started 8s kubelet Started container istio-proxyNormal Pulled 6s kubelet Container image registry.cn-beijing.aliyuncs.com/wilsonchai/nginx:latest already present on machineNormal Created 6s kubelet Created container: nginx-testNormal Started 5s kubelet Started container nginx-test1个initContainer1个业务container和1个sidecar其中initContainerInit Containers:istio-init:Container ID: containerd://2bf56cd37703d82a2a43e94e8c8d683ed66b0afe22bf7148a597d67b89a727a8Image: docker.io/istio/proxyv2:1.28.2Image ID: docker.m.daocloud.io/istio/proxyv2sha256:39065152d6bd3e7fbf6bb04be43c7a8bbd16b5c7181c84e3d78fa164a945ae7fPort:Host Port:Args:istio-iptables-p15001-z15006-u1337-mREDIRECT-i*-x-b*-d15090,15021,15020--log_output_leveldefault:info...和之前envoy中劫持流量的做法一样istio依然是使用iptables将端口流量导入到代理之中处理尝试访问一下? curl 10.22.12.178:30785/testi am backend in backend-6d76f54494-g6srz成功再次查看istio-proxy日志。空的为了调试方便将其打开并且输出至控制台kubectl -n istio-system edit cm istioapiVersion: v1data:mesh: |-accessLogFile: /dev/stdout...至此istio的第一个功能探索完毕自动注入sidecar container并且完成了流量劫持Upgrade Required 426 的问题当前的架构是左图现在要前进到右图watermarked-istio_1其实就是在backend注入istio-proxy直接重启就好? kubectl get pod -owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESbackend-5d4d7b598c-f7852 2/2 Running 0 13s 10.244.0.49 wilsonnginx-test-6f855b9bb9-9phsv 2/2 Running 0 58m 10.244.0.48 wilson注入完成测试一下? curl 10.22.12.178:30785/testUpgrade Required? kubectl logs -f -l appnginx-test -c istio-proxy[2026-01-26T07:54:42.977Z] GET /test HTTP/1.1 426 - upstream10.244.0.48:80 duration6ms routedefault[2026-01-26T07:54:42.978Z] - - - 0 - upstream10.105.148.194:10000 duration9ms route-在nginx注入istio-proxybackend没有注入的时候并没有报错。而一旦nginx与backend都注入的时候就会出现Upgrade Required (426)错误Nginx Sidecar 发现目标Backend是一个纯文本服务它会回退到“透明代理”模式简单地把 Nginx 发出的流量透传出去Nginx Sidecar 发现目标也有 Sidecar它会尝试建立一个高度优化的、基于 mTLS 的隧道关于mTLS后面会详细介绍。如果此时 Nginx 发出的请求头比如缺少 Host 字段或者使用了 HTTP/1.0不符合 Envoy 对这种隧道协议的预期Envoy 可能会向 Nginx 发送一个特殊的响应或者 Nginx 在尝试通过这种隧道通信时因为某些 Header 冲突如 Connection: close自发产生了 426 错误想要解决这个问题有两种方法改造nginx中加入标记location /test {proxy_http_version 1.1; # 必须添加这一行proxy_set_header Host $host; # 这一行也是必须的proxy_pass http://backend_ups;}Nginx 的 proxy_pass 默认使用 HTTP/1.0。在 Istio 环境中HTTP/1.0 不支持长连接Keep-Alive以及一些现代的协议协商这与 Istio SidecarEnvoy默认的 L7 代理行为冲突Istio 需要 HTTP/1.1 来支持复杂连接管理问题改造backend service如果nginx改造有难度那也可以尝试改造backend-serviceapiVersion: v1kind: Servicemetadata:name: backend-servicenamespace: defaultspec:ports:- name: tcp-80 # 原为 http-80 改为 tcp-80port: 10000protocol: TCPtargetPort: 10000selector:app: backendIstio 只有在识别到流量是 HTTP 时才会进行深度的协议检查和转换。如果你把这个服务声明为 TCPIstio 就会将其视为原始字节流进行透传不再关心它是 HTTP/1.0 还是 1.1。优点就是彻底解决 426 问题无需改 Nginx。缺点则是你会失去 Istio 针对该服务的 HTTP 监控指标如请求数、4xx/5xx 统计、分布式追踪以及基于路径的路由功能http 1.0 与 http 1.1这里再简单介绍一下两个协议版本的区别连接管理最显著的区别HTTP 1.0短连接 (Short-lived)默认情况下客户端每发起一个请求都要与服务器建立一次 TCP 三次握手。请求结束并收到响应后TCP 连接立即关闭。如果页面有 10 张图片浏览器就要建立 10 次 TCP 连接。这带来了极高的延迟和资源开销。HTTP 1.1持久连接 (Persistent Connection / Keep-Alive)。默认开启 Connection: keep-alive。一个 TCP 连接可以被多个请求复用。只有在明确声明 Connection: close 或连接超时后才会关闭。在 Istio 中 Envoy 极度依赖持久连接来维持高性能的 Sidecar 间隧道。HTTP 1.0 的频繁断开会让 Envoy 感到“压力山大”甚至认为这是一种非标准的协议行为。Host HeaderHTTP 1.0人们认为一个 IP 对应一个网站所以请求头里不需要带域名信息。HTTP 1.1随着虚拟主机一个 IP 跑多个网站的流行HTTP 1.1 规定请求头必须包含 Host 字段。在 K8s/Istio 中 Istio 的路由决策、Service 的匹配完全依赖 Host 头。这也是为什么 Nginx 使用 HTTP 1.0 转发时如果不手动补全 Host 头后端往往会返回 404 或协议错误。以上是istio必须要求HTTP 1.1最主要的两个因素当然还有其他非常重要的区别特性 HTTP 1.0 HTTP 1.1连接模型 默认短连接每次请求新开 TCP 默认持久连接 (Keep-Alive)复用 TCPHost 头部 可选 (导致无法支持虚拟主机) 必须 (支持一 IP 多域名)流水线 (Pipelining) 不支持 支持 (但在实际应用中受限)断点续传 不支持 支持 (通过 Range 头部)缓存控制 简单 (Expires) 复杂且强大 (Cache-Control, ETag)默认协议版本 许多旧软件(如 Nginx proxy)的默认值 现代 Web 应用的基石标准小结本章内容算是一个开胃小菜成功安装了istio并且解决了一个非常常见的426问题至于怎么把之前在envoy的那些最佳实践搬迁到istio那就是后面的内容了敬请期待后记如果整个namespace都已经有了注入标签istio-injectionenabled但是某个deployment不想让istio注入kubectl patch deployment nginx -p {spec:{template:{metadata:{annotations:{sidecar.istio.io/inject:false}}}}}呐厍车窝

相关文章:

一文学习 Spring 声明式事务源码全流程总结碌

在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明…...

算力 GPU 驱动实战总结:SVM Eviction Fence 设计思想与实现细节

1. 问题背景 1.1 STALE _mapcount 问题 在 VRAM 超量分配(overcommit)场景下,当 GPU VRAM 被占满时,TTM 内存管理器需要驱逐(evict)旧的 BO 来为新的分配腾出空间。 问题:对于 SVM(S…...

Qt程序在麒麟系统发布:除了.desktop文件,你还需要知道的3种打包方案(含AppImage实战)

Qt程序在麒麟系统发布:除了.desktop文件,你还需要知道的3种打包方案(含AppImage实战) 在国产操作系统生态快速发展的今天,银河麒麟(Kylin)系统作为主流国产OS之一,正吸引着越来越多…...

深入剖析 Android 系统属性:从 build.prop 到 Selinux 安全机制

1. Android系统属性基础入门 第一次接触Android系统属性时,我也被各种.prop文件和复杂的配置搞得一头雾水。经过多年实战,我发现理解属性系统其实有个简单的方法 - 把它想象成Windows的注册表。就像注册表存储着Windows的配置信息一样,Androi…...

Linux网络编程核心API速查手册喊

智能体时代的代码范式转移与 C# 的战略转型 传统的 C# 开发模式,即所谓的“工程导向型”开发,要求开发者创建一个复杂的项目结构,包括项目文件(.csproj)、解决方案文件(.sln)、属性设置以及依赖…...

【万字文档+源码】基于springboot与vue海鲜市场系统-计算机项目设计学习

基于springboot与vue海鲜市场系统1.项目简介 管理员的功能是对用户和商家的信息进行监管,使得管理员能够管理用户、商家、海鲜分类等,并可以对这些进行修改和删除等来保证系统的整体运行。 用户的功能有可以去浏览系统首页和商品的信息,查看…...

多租户下的ERP系统的仓储管理模块分析设计轿

springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类&#xff…...

详细解析Spring如何解决循环依赖问题地

AI训练存储选型的演进路线 第一阶段:单机直连时代 早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低,吞吐量极高,也就是“数据离…...

windows/linux安装NVIDIA驱动(cuda加速)

目录 1、windwos安装 2、linux安装NVIDIA驱动(cuda加速) (1)检测是否有NVIDIA显卡 (2)驱动安装 1、windwos安装 https://www.nvidia.cn/geforce/drivers/https://www.nvidia.cn/geforce/drivers/ 2、l…...

别再只用CardView做卡片了!解锁Android Material Design中CardView的5个隐藏用法与实战技巧

解锁Android CardView的5个高阶玩法:从交互动画到性能调优 在Material Design的世界里,CardView早已超越了简单的阴影和圆角容器角色。当大多数开发者还在用基础属性构建静态卡片时,真正的高手已经在探索这些隐藏能力:如何让卡片像…...

别再被mmcv和mmseg升级搞崩溃了!手把手教你从1.x平滑迁移到2.x(附完整API对照表)

从MMSegmentation 1.x到2.x的无痛迁移指南:架构变革与API重构全景解析 第一次尝试将项目从MMSegmentation 1.x升级到2.x时,我盯着满屏红色报错信息足足发呆了十分钟——这感觉就像走进一个熟悉的房间却发现所有家具都被重新摆放了。作为OpenMMLab生态的重…...

避坑指南:当Autoware遇上RS-LiDAR,点云格式转换与地面滤波的那些‘坑’(附源码修改)

Autoware与RS-LiDAR实战:点云格式转换与地面滤波的深度解决方案 当国产激光雷达遇上Autoware这套自动驾驶开发框架,技术团队往往会遇到一些意想不到的兼容性问题。特别是从Velodyne切换到RS-LiDAR这类国产雷达时,点云处理链路的异常往往会导…...

别再手动切换主从了!用Patroni+etcd给PostgreSQL 15上个自动故障转移的保险

告别手动切换时代:用Patronietcd构建PostgreSQL 15全自动高可用架构 凌晨三点,数据库告警短信惊醒梦中人——主库响应超时。你揉着惺忪睡眼打开终端,却发现从库早已自动接管业务流量,应用连接池平稳如常。这不是科幻场景&#xff…...

SEATA分布式事务——AT模式言

简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...

使用 Python 操作 Excel 文件中的工作表(添加和删除)

在处理复杂的 Excel 文档时,工作表的管理是一项基础而重要的技能。无论是需要为不同部门创建独立的数据表格,还是清理不再需要的旧数据,灵活地添加和删除工作表都能帮助我们更好地组织和管理数据。 本文将介绍如何使用 Python 和 Spire.XLS 库…...

HBuilderX真机调试报错找不到android_base.apk?别慌,3个方法帮你快速搞定(附详细路径)

HBuilderX真机调试报错找不到android_base.apk?3种实战解决方案详解 遇到HBuilderX真机调试时控制台突然报错"未查找到基座位置plugins\launcher\base\android_base.apk",这确实会让开发者措手不及。这个错误通常发生在首次尝试连接安卓设备进…...

告别暴力穷举!用ip33在线工具手工反算1~4字节CRC32校验码的原始数据

告别暴力穷举!手工反算1~4字节CRC32校验码的数学艺术 在数据校验的世界里,CRC32就像一位沉默的守门人,它用32位的校验码守护着数据的完整性。但鲜为人知的是,当面对1-4字节的短数据时,这位守门人的规则可以被优雅地逆…...

eMarker芯片如何保障100W+PD充电的安全

一、100W以上充电的独特安全挑战当充电功率跨过100W门槛,安全风险的复杂性和严重性都进入了全新量级。根据UL 62368-1标准,100W是PS2与PS3能量源等级的分界线——PS3能量源等级(100W及以上)意味着设备和线缆发生点火和火灾蔓延的风…...

Python怎么检查安装成功_版本号查询与Hello World测试

Python命令是否可用取决于PATH环境变量是否包含其安装路径;若python --version报错,应尝试python3 --version等变体,并通过import sys; print(sys.version)确认实际运行版本。python 命令是否可用:先看终端能不能认出它很多问题其…...

Chrom和PBV算法全解析:医疗级RPPG心率检测的5个关键陷阱

Chrom和PBV算法全解析:医疗级RPPG心率检测的5个关键陷阱 在ICU病房的昏暗灯光下,护士长李敏正盯着监护仪上剧烈波动的心率曲线皱眉——这位刚完成心脏手术的患者,因传统接触式电极导致皮肤过敏,而基于摄像头的非接触监测系统却频繁…...

GraalVM安全性最佳实践(FIPS 140-3合规版):从JNI绑定校验、证书硬编码剔除到Bouncy Castle静态裁剪全流程

第一章:GraalVM静态镜像安全性全景概览GraalVM 静态镜像(Native Image)通过提前编译(AOT)将 Java 应用构建成独立、无依赖的二进制可执行文件,显著减少了运行时攻击面——既消除了 JVM 解释器、JIT 编译器、…...

MTK Camera调试实战:搞定I2C报错、图像反向、颜色异常等常见问题

MTK Camera调试实战:从寄存器操作到硬件测量的全链路排错指南 当你在实验室盯着那块始终黑屏的Camera模组,或是产线上反复出现颜色失真的测试样机时,真正考验的不仅是技术手册的熟悉程度,更是系统化的调试思维。这份指南将带你穿越…...

【稀缺首发】Blazor Hybrid 2026生产就绪架构图(含MAUI 7.0集成深度):仅开放给前500名订阅者下载的微软Partner认证模板包

第一章:Blazor Hybrid 2026生产就绪架构全景概览Blazor Hybrid 2026代表了微软跨平台富客户端开发的最新演进形态,其核心目标是统一Web与原生体验,在保持Razor语法一致性的同时,深度集成平台能力、离线可靠性、安全沙箱及企业级可…...

别再死磕大卷积核了!用3x3小核+ShiftwiseConv,在ImageNet上跑出SOTA的保姆级解读

3x3小核ShiftwiseConv:在ImageNet上实现SOTA的实战指南 当整个计算机视觉社区沉迷于堆叠更大的卷积核时,CVPR 2025的一项研究却反其道而行——用精巧的3x3小核配合ShiftwiseConv模块,在ImageNet上实现了超越31x31大核模型的性能。这并非简单…...

不用死刷算法题!从零手搓伪随机数,吃透DP、状态机与缓存优化

不用死刷算法题!从零手搓伪随机数,吃透DP、状态机与缓存优化 文章目录不用死刷算法题!从零手搓伪随机数,吃透DP、状态机与缓存优化一、核心训练思路:从「简单迭代」到「多阶依赖」二、入门:从简单迭代开始&…...

Open Images:大规模多标签图像分类与目标检测数据集的技术实现

Open Images:大规模多标签图像分类与目标检测数据集的技术实现 【免费下载链接】dataset The Open Images dataset 项目地址: https://gitcode.com/gh_mirrors/dat/dataset Open Images是由Google构建的大规模视觉数据集,为计算机视觉研究提供了包…...

stock-sdk-mcp 的实践整理倨

一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...

IDM永久使用开源解决方案:安全验证与实战指南

IDM永久使用开源解决方案:安全验证与实战指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 问题诊断:破解工具背后的隐藏风险 痛点呈现…...

ArcGIS空间连接实战:如何高效挂接地图斑属性到mdb数据库

ArcGIS空间连接实战:高效挂接地图斑属性到mdb数据库的完整指南 在空间数据处理工作中,将属性数据与空间图形精准关联是GIS分析的基础环节。许多技术人员在使用ArcGIS进行地图斑属性挂接时,常遇到数据不匹配、连接失败或效率低下的问题。本文将…...

外卖霸王餐API接口架构设计思路分析

外卖霸王餐API接口架构设计思路分析 对于开发者而言,构建一套高并发、高可用的外卖霸王餐API接口架构,是实现流量主与外卖平台(美团、饿了么)数据互通的关键。本文将基于俱美开放平台(http://www.baodanbao.com.cn)的技术实践&am…...