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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 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

相关文章
|
1月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
337 3
|
1月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
654 10
|
5月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
665 0
|
5月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
166 0
|
2月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
2月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
357 2
|
2月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
300 13
|
2月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
112 0