Spring Cloud 应用 Proxyless Mesh 模式探索与实践

news2025/2/5 17:55:37

作者:十眠

Service Mesh 简介

Service Mesh 早已不是一个新兴的概念,目前已经有许多关于 Service Mesh 的探索以及实践。

  • 2016 年可以说是 Service Mesh 的元年,Buoyant 公司 CEO William Morgan 率先发布 Linkerd ,成为业界首个 Service Mesh 项目,同年 Lyft 发布 Envoy ,成为第二个 Service Mesh 项目。
  • 2017年,Google、IBM、Lyft 联手发布了 Istio,它与 Linkerd / Envoy 等项目相比,它首次给大家增加了控制平面的概念,提供了强大的流量控制能力。经过多年的发展 Istio,已经逐步成为控制平面的事实标准。
  • 1.0 版本的问世标志着 Istio 进入了可以生产可用的时代,越来越多的企业将服务网格应用于生产中。
  • 1.5 版本开始将原有的多个组件整合为一个单体结构 istiod;同时废弃了被诟病已久的 Mixer 组件,统一为 Istiod 服务,方便部署和运维。

在目前看来 Istio 是最流行的开源服务网格,它由控制平面和数据平面两部分构成。

在这里插入图片描述

在 Istio Mesh 架构中,其控制平面是一个名为 Istiod 的进程,网络代理是 Envoy 。Istiod 作为控制面的统一组件,负责对接服务注册发现、路由规则管理、证书管理等能力,Envoy 则是作为数据面通过 Sidecar 方式代理业务流量,Istio 和 Envoy 之间通过 XDS 协议接口完成服务发现、路由规则等数据的传递。Istiod 通过监听 K8S 资源例如 Service、Endpoint 等,获取服务信息,并将这些资源统一通过 xDS 协议下发给位于数据平面的网络代理。Envoy 则是独立于应用之外的一个进程,以 Sidecar 的方式(一般是以 Container 方式)伴随业务应用 Pod 运行,他与应用进程共用同一个主机网络,通过修改路由表的方式劫持业务应用的网络流量。

xDS 协议接口详见 xDS REST and gRPC protocol 文档 [ 1]

随着集群规模的扩大与业务复杂度的增长,基于原生 k8s 的容器编排方案将会难以应付,开发人员不得不面对巨大的服务治理挑战。Service Mesh 可以很好地解决了这一问题,它将服务治理能力封装在了控制平面与代理中,业务开发人员只需要关注于业务逻辑本身。在应用部署之后,只需要运维人员通过修改配置,即可实现诸多服务治理能力,例如故障恢复、负载均衡、灰度发布等,这极大地提高了研发和迭代效率。

Istio 的 Sidecar 通过容器注入的形式伴随业务应用进程的整个生命周期,对于业务应用是毫无侵入的,这解决了业务应用可迁移、多语言、基础架构耦合等问题。但这也带来了高资源消耗、请求时延增长的问题。考虑到 Sidecar 的弊端,我们可以考虑使用 SDK 的形式,来替代 Sidecar 支撑起数据平面,那么就引出了 Proxyless Mesh 的架构。

Proxyless Service-Mesh

什么是 Proxyless Service-Mesh (无代理服务网格)?这是近几年提出的一个新的概念,isito、gRPC、brpc 等开源社区都在这一方向进行了探索和实践。无代理服务网格框架以 SDK 的形式被业务应用引入,负责服务之间的通信、治理。

在这里插入图片描述

gRPC Proxyless 架构

目前 gRPC 项目对 xDS API 协议提供了一定的支持,也就是说我们可以通过 istio 管理 gRPC 服务,并且不需要部署 Envoy sidecar。

在这里插入图片描述

如上图所示 gRPC Proxyless 模式需要 Istio Agent 来进行初始化以及与控制面的通信。首先,Istio Agent 在启动时生成一个引导文件,这和为 Envoy 生成引导文件的方式相同。它用来告诉 gRPC 库如何连接到 istiod,在哪里可以找到数据面通信的证书,以及向控制面发送什么元数据。接下来,Istio Agent 作为一个 xDS proxy,代表应用程序与 istiod 进行连接和认证。最后,Istio Agent 获取并轮换数据平面通信中使用的证书。

详见 gRPC Proxyless Mesh 文档 [2 ]

浅谈 Proxyless 架构的优缺点

简单整理了一下 Proxyless Mesh 架构的一些优缺点

Proxyless Mesh的优点:

  • 性能:无代理模式的网络调用为点对点的直接通信,网络时延会比代理模式小很多。
  • 稳定性:Proxyless 的模式是单进程,拓扑简单,便于调试,稳定性高。
  • 成本:没有 sidecar,资源消耗低。
  • 框架集成:市面上已有众多 SDK 模式的服务框架,切换至 Mesh 后依旧可以复用框架原有的能力

Proxyless Mesh的缺点:

  • 框架、语言绑定:需要开发多种语言、框架的 SDK 支持 Proxyless Mesh 能力,目前市面上不少框架还未支持 Proxyless Mesh的能力。
  • 可迁移性低:无法通过切换 Sidecar 的形式来无侵入地升级基础设施,需要修改代码进行升级与维护。

Proxyless 架构的优点显而易见,特别是对于较大规模的业务场景,可以节省下不少的机器资源与额外的维护成本。但是缺点也非常明显,一旦需要升级 Proxyless SDK 的能力,我们就需要升级SDK,需要修改代码、升级框架版本。

MSE 如何解决客户需要面对 Proxyless Mesh 的缺点

我们采取了一个策略,通过 JavaAgent 实现 xDS 协议。如此一来,Spring Cloud 就可以通过接入JavaAgent 来接入 Mesh 生态并且支持 istio 配置的路由规则,JavaAgent 通过 xDS 协议从 istiod 拉取其他服务的地址列表并转换成 Spring Cloud 负载均衡 Ribbon 的 ServerList 进行一次地址列表的集合合并操作。如此一来,原生 Spring Cloud 应用无需修改一行代码,就可以支持 Proxyless Mesh 模式,同时还兼容原先的 Nacos 体系的服务发现。

在这里插入图片描述

另一方面,对于 Java 应用来说相比于 Envoy,JavaAgent 还可以提供更多的治理能力,比如,服务契约、接口信息、数据库流量的治理、JVM 监控与治理等等。

Spring Cloud 应用无侵入升级至 Proxyless Mesh 架构* *

下面我们通过一个简单的实践例子来体验 Spring Cloud 应用是如何无侵入升级至 Proxyless Mesh架构的。

Demo:如何实现 Spring Cloud 应用与 Service Mesh 架构的多语言微服务的互通?

在这里插入图片描述

前提条件

开启 MSE 服务治理能力,并且需要为当前 K8s 集群创建阿里云 ASM Istio 实例。

第一步:部署Spring Cloud服务和多语言服务。

我们需要部署 Spring Cloud 应用与多语言 Go 应用

Demo 应用的例子可以从以下文档中获取 [3 ]

其中 Spring Cloud 应用调用多语言服务的方式跟调用其他 Spring Cloud 应用之间互相调用的方式一致,例如,通过restTemplate工具请求调用Spring Cloud服务(应用名称为go-sc-a)的A接口如下:

restTemplate.getForObject("http://go-sc-a/A", String.class)

您也可以使用其他方式调用,不需要对应服务的端口号,即可直接访问。

第二步:通过配置环境变量方式开启 MSE Agent 支持 xDS 协议能力

我们需要增加如下环境变量,开启MSE Agent 的支持 xDS 协议的功能

在这里插入图片描述

第三步:结果验证

Spring Cloud 服务与服务网格的多语言服务可以实现互通,且Spring Cloud服务调用多语言服务的方式不需要修改任何代码。

  • Spring Cloud服务访问多语言服务:
~ curl localhost:20003/go
[Java Spring Cloud ] -> [Service Mesh APP10.191.XX.XX ]
  • 多语言服务调用Spring Cloud服务
~ curl localhost:8085/java
[ Service Mesh APP ] -> [Java Spring Cloud10.191.XX.XX]

总结

本文通过一个 Demo 演示了 SpringCloud 应用通过接入MSE服务治理之后,无需修改任意代码就能具备 Proxyless Mesh的能力,当前 MSE 服务治理支持还有些限制,在持续补充完善中。当前 MSE 服务治理 Proxyless 模式支持基础的服务发现能力以及 DestinationRule 的 Subset 能力,我们可以配合 MSE 流量治理实现 Mesh 架构下的全链路灰度、标签路由等治理能力。

另外值得一提的是,我们正在与 CloudWeGo、Kratos、Spring Cloud Alibaba、Dubbo、ShardingSphere、Database Mesh 等社区共同建设 OpenSergo 微服务治理标准,我们希望可以将企业与社区中微服务治理的场景与最佳实践共同提取成标准规范。

我们欢迎更多社区与企业一起参与 OpenSergo 微服务治理标准的共建,OpenSergo 社区现在处于高速发展阶段,从微服务治理标准定义,到 Control Plane 的实现,再到 Java/Go/C++/Rust 等多语言 SDK 与治理功能的实现,再到各个微服务生态的整合与落地,都还有大量的演进工作,欢迎社区一起参与标准完善与代码贡献。

在这里插入图片描述

OpenSergo 开源贡献小组正在火热招募贡献者。如果您有时间,有热情,有意愿,欢迎联系社区加入开源贡献小组,一起共同完善 OpenSergo 和 Sentinel,一起主导微服务治理技术与标准演进。Now let’s start hacking!

欢迎加入 OpenSergo 交流群:34826335

相关链接:

[1] https://www.envoyproxy.io/docs/envoy/latest/api-docs/xds_protocol

[2] https://istio.io/latest/blog/2021/proxyless-grpc/

[3] https://help.aliyun.com/document_detail/281759.html

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

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

相关文章

Java中的多线程(上)

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 多线程 什么是线程 为什么需要多线程 进程和线程的区别(面试重点) Java实现多线程 多线程带来的好处 认识Thread类 T…

前端基础_贝塞尔和二次方曲线

贝塞尔和二次方曲线 贝塞尔曲线可以是二次和三次方的形式,常用于绘制复杂而有规律的形状。 绘制贝塞尔曲线主要使用bezierCurveTo方法。该方法可以说是lineTo的曲线版,将从当前坐标点到指定坐标点中间的贝塞尔曲线追加到路径中。该方法的定义如下。 b…

艾美捷耗氧率检测试剂盒说明书及相关研究

细胞内稳态通过ATP的产生来维持。ATP的生成可以通过单独的糖酵解(无氧呼吸)或通过糖酵解与氧化磷酸化的耦合来完成。氧化磷酸化是氧(O2)依赖性的,发生在线粒体中,是哺乳动物细胞合成ATP的最有效和优选的方法…

电力系统可视化——比PowerWorld还精彩(Matlab实现)

目录 1 概述 2 PowerWorld 3 案例及Matlab代码实现 3.1 案例 3. 2 结果展现 3.3 Matlab代码实现 1 概述 信息可视化的应用为电力行业带来了巨大的希望,但其潜力尚未被可视化社区充分挖掘。先前关于电力系统可视化的工作仅限于在地理布局之上描绘原始或处理过的…

【数据结构】单链表OJ

目录 一、反转单链表 描述 二、返回链表的中间节点 三、返回倒数第K个节点 描述 示例1 四、合并两个已排序的链表 描述 五、分隔链表 六、判断一个链表是否为回文结构 描述 示例1 示例2 示例3 七、两个链表的第一个公共结点 描述 输入描述: 返回值描…

LICEcap:GIF屏幕录制工具

写博客的时候,我经常会用到需要自制gif的场景,我之前一直使用视频转gif工具处理https://tool.lu/video2gif/,大致就是利用qq录屏成视频,然后通过工具转成gif。 今天无意间看到其他博主用了 LICEcap 工具 LICEcap 是一款简洁易用的…

“隐形贫困者”自学Python做副业,教你如何月入10000+

现在的年轻人总是觉得攒不下钱,虽然表面风光,每天出入高级CBD,可是几乎每个人都是月光族,这一类人被定义为“隐形贫困者”,原因是什么呢?根据小编的分析,现在人们对生活质量要求普遍提高了&…

毕业设计 单片机智能避障超声波跟随小车 - 物联网 嵌入式

文章目录0 前言1 项目背景2 实现效果3 设计原理HC-SR04超声波模块5 部分代码6 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告…

玩转云端 | 数据管理深似海,运维如何变“路人”?

数字技术正在改变人们生产、生活的方方面面。作为数字经济时代的重要生产要素,数据正以指数级别爆发式增长,企业对于数据存储及处理的方式和要求已是“今时不同往日”。最早古人存储数据的方法是“以物记物”或“借物记物”,即用更易于携带的…

如何视频裁剪?建议收藏这几种裁剪视频的方法

现在的网络很是方便,我们可以轻轻松松的在网上找到各种网课视频来进行学习。不过有些网课里面的重点内容不仅比较少,还很分散,让我们很难做到高效的学习。但其实我们可以通过视频裁剪,将有重点内容的视频裁剪下来,这样…

SpringBoot SSMP案例整合二 运维篇

目录 一、程序打包 二、项目打包后 若启动失败 三、虚拟机启动SpringBoot项目(Linux) 四、临时属性 五、配置文件4级分类 六、自定义配置文件 七、多环境开发(yml版本) 八、多环境开发多文件版(yml版&#xf…

C++ Primer 第四章 表达式

C Primer 第四章 表达式4.1. Fundamentals4.1.1. Lvalues and Rvalues4.1.2. Precedence and Associativity4.2. Arithmetic Operators4.4. Assignment Operators4.5. Increment and Decrement Operators4.9. The sizeof Operator4.10. Comma Operator4.11. Type Conversions4.…

中国风?古典系?AI中文绘图创作尝鲜!⛵

💡 作者:韩信子ShowMeAI 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.showmeai.tech/article-detail/413 📢 声明:版权所有,转…

Java——B-树

概念 当我们使用avl树或者红黑树进行数据检索时,虽然树是平衡的,可以保证搜索的效率大概是logN。但是当我们的数据量比较大时,只能在内存中存储数据在硬盘中的指针,这时如果我们要检索数据,最少也需要比较树的高度次。…

【算法】单词接龙,合并区间, 二叉搜索树的最近公共祖先,旋转排序数组中的最小值看看有你会的吗?

算法学习有些时候是枯燥的,每天学习一点点 算法题目一. 单词接龙 II 题目描述java 解答参考二. 合并区间 题目描述java 解答参考三. 二叉搜索树的最近公共祖先 题目要求java实现方案四 寻找旋转排序数组中的最小值一. 单词接龙 II 题目描述 按字典 wordList 完成从…

Azure RTOS 嵌入式无线网络框架简化物联网应用开发

一、Azure RTOS概述 Azure RTOS 是一个实时操作系统 (RTOS),适用于由微控制器 (MCU) 提供支持的物联网 (IoT) 和边缘设备, Azure RTOS 旨在支持高度受限设备(电池供电,并且闪存容量不到 64 KB)。简而言之,…

某HR分享:2n和n+3的基数不一样,n+3比2n拿得多!仲裁期间不能入职新公司,千万别轻易仲裁,得不偿失!...

被裁员时,要2n还是要n3?是否选择仲裁?一位hr说,跟走过仲裁的同学和律师朋友打听了下,原来2n和n3完全不一样。n3的n取的是“非私营单位从业人员平均工资”的三倍,杭州市是3.2万。2n的n取的是“全社会就业人员…

Android设计模式详解之单例模式

前言 定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 使用场景:确保某个类有且仅有一个对象的场景,避免产生多个对象消耗过多的资源。比如要访问IO和数据库资源,应该考虑使用单例模式。 …

JAVA开发(数据库表设计)

对于大型系统数据库设计,需要进行一定的规划和规范,才能方便系统扩展和维护。一般系统的数据库设计要求,有数据库表系统规划,数据库表系统命名规范和设计规范。 一、数据库表系统规划 1、按系统规划或者按微服务规划 2、按业务…

Matlab论文插图绘制模板第71期—三维饼图(Pie3)

在之前的文章中,分享了Matlab饼图的绘制模板: 进一步,再来分享一下三维饼图的绘制模板。 先来看一下成品效果: 特别提示:Matlab论文插图绘制模板系列,旨在降低大家使用Matlab进行科研绘图的门槛&#xff0…