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

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Service Mesh 简介Service Mesh早已不是一个新兴的概念,目前已经有许多关于Service Mesh的探索以及实践。2016 年可以说是 Service Mesh的元年,Buoyant公司CEO William Morgan率先发布Linkerd ,成为业界首个Service M...

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

在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

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

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

Proxyless Service-Mesh

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

image

gRPC Proxyless 架构

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

image

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

详见gRPC Proxyless Mesh

浅谈 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

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

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

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

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

image

前提条件

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

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

我们需要部署Spring Cloud应用与多语言Go应用Demo应用的例子其中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 协议的功能

类型

变量名称

变量/变量引用

说明

自定义

profile.micro.service.envoy.xds.enable

true

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

image

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

欢迎加入OpenSergo交流群:34826335

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
8天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
62 1
|
19天前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
10天前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
Springcloud Alibaba + jdk17+nacos 项目实践
|
4天前
|
人工智能 开发框架 Java
总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛
Spring AI Alibaba 应用框架挑战赛邀请广大开发者参与开源项目的共建,助力项目快速发展,掌握 AI 应用开发模式。大赛分为《支持 Spring AI Alibaba 应用可视化调试与追踪本地工具》和《基于 Flow 的 AI 编排机制设计与实现》两个赛道,总计 30 万奖金。
|
5天前
|
Java 调度 开发者
spring的@Scheduled()有几种定时模式?
【10月更文挑战第12天】spring的@Scheduled()有几种定时模式?
13 1
|
5天前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
9天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
18 3
|
10天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
13 2
|
14天前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
|
1月前
|
设计模式 Java Spring
spring源码设计模式分析(五)-策略模式
spring源码设计模式分析(五)-策略模式