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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,182元/月
简介: 本文通过一个 Demo 演示了 SpringCloud 应用通过接入MSE服务治理之后,无需修改任意代码就能具备 Proxyless Mesh的能力,当前 MSE 服务治理支持还有些限制,在持续补充完善中。当前 MSE 服务治理 Proxyless 模式支持基础的服务发现能力以及 DestinationRule 的 Subset 能力,我们可以配合 MSE 流量治理实现 Mesh 架构下的全链路灰度、标签路由等治理能力。

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 是最流行的开源服务网格,它由控制平面和数据平面两部分构成。


image.png


在 Istio Mesh 架构中,其控制平面是一个名为 Istiod 的进程,网络代理是 envoyEnvoy 。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 的形式被业务应用引入,负责服务之间的通信、治理。


image.png


gRPC Proxyless 架构

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


image.png


如上图所示 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 体系的服务发现。


image.png


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


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

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


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


image.png


前提条件

开启 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 协议的功能

image.png


第三步:结果验证

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 与治理功能的实现,再到各个微服务生态的整合与落地,都还有大量的演进工作,欢迎社区一起参与标准完善与代码贡献。


image.png


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

相关文章
|
1月前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
866 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
人工智能 Java Serverless
【MCP教程系列】搭建基于 Spring AI 的 SSE 模式 MCP 服务并自定义部署至阿里云百炼
本文详细介绍了如何基于Spring AI搭建支持SSE模式的MCP服务,并成功集成至阿里云百炼大模型平台。通过四个步骤实现从零到Agent的构建,包括项目创建、工具开发、服务测试与部署。文章还提供了具体代码示例和操作截图,帮助读者快速上手。最终,将自定义SSE MCP服务集成到百炼平台,完成智能体应用的创建与测试。适合希望了解SSE实时交互及大模型集成的开发者参考。
12053 60
|
3月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
362 0
|
1月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
3月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
336 2
|
2月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
250 0
|
7月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
943 0
|
7月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
237 0
|
4月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
173 0

热门文章

最新文章