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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
9天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
179 0
|
15天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
77 3
|
1月前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
56 14
|
27天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
62 8
|
2月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
238 12
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
35 6
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
109 5
|
29天前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
66 2
|
1月前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
55 5
|
1月前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
40 5