作者:十眠

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

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

在 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 的方法被事务运用引入,负责服务之间的通讯、管理。

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

gRPC Proxyless 架构

现在 gRPC 项目对 xDS API 协议供给了必定的支撑,也就是说咱们能够经过 istio 办理 gRPC 服务,而且不需求布置 Envoy sidecar。

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

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

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

另一方面,关于 Java 运用来说比较于 Envoy,JavaAgent 还能够供给更多的管理才能,比方,服务契约、接口信息、数据库流量的管理、JVM 监控与管理等等。

Spring Cloud运用无侵入晋级至 Proxyless Mesh 架构* *

下面咱们经过一个简略的实践比如来体验 Spring Cloud 运用是怎么无侵入晋级至 Proxyless Mesh架构的。

Demo:怎么完成 Spring Cloud 运用与 Service Mesh 架构的多言语微服务的互通?

Spring Cloud 应用 Proxyless 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 应用 Proxyless Mesh 模式探索与实践

第三步:成果验证

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 与管理功能的完成,再到各个微服务生态的整合与落地,都还有很多的演进工作,欢迎社区一同参加规范完善与代码奉献。

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

OpenSergo 开源奉献小组正在火热招募奉献者。如果您有时间,有热情,有意愿,欢迎联系社区参加开源奉献小组,一同一同完善 OpenSergo 和 Sentinel,一同主导微服务管理技能与规范演进。Now let’s start hacking!

欢迎参加 OpenSergo 交流群:34826335

相关链接:

[1]www.envoyproxy.io/docs/envoy/…

[2]istio.io/latest/blog…

[3]help.aliyun.com/document_de…