Skip to content

24未来展望:中间件Meh化的可行性

在前面的章节中,我们讲解了 Service Mesh 如何进一步在生产中落地,以及它的最佳实践。这一讲我们继续来看 Service Mesh 的未来发展趋势。

从整个开源社区的角度来看,随着云原生和 Kubernetes 的发展,Service Mesh 逐步成为微服务架构的基础组件。

结合前面讲解过的内容,我们已经知道 Service Mesh 主要接管服务间的流量,包括边缘网关的南北向流量和内部通信的东西向流量。在微服务架构中,除了服务间的流量,服务和中间件通信的流量也非常重要,这块流量的代理也是未来整个微服务 Mesh 化中重要的一环。

另外随着微服务架构的进一步发展,FaaS(Function as a Service)也是未来微服务架构重要的演进方向之一,在 FaaS 架构中,Service Mesh 同样可以作为底层基础设施接管服务间的流量

接下来,我们就来看看 Service Mesh 对于数据中间件的支持。

中间件 Mesh 化

著名的数据面已经支持了诸多数据库和队列中间件,例如 MySQL、MongoDB、PostgreSQL、Redis、Kafka 等。下面就让我们以 Redis 为例子,看看 Envoy 对于数据中间件的支持。

Redis 代理

Envoy 可以作为 Redis 的代理,部署在每个服务的节点上,这样就无须传统的 Redis 中间件负责 Redis 集群的代理工作,也不需要传统 Redis 官方提供的 Smart Client。Envoy 可以替代这部分功能,控制 Redis 集群,路由到正确的 hash 分片节点上。

使用 Envoy 做 Redis 代理,既避免了传统的 Smart Client 的升级维护问题,也避免了传统的 Redis 中间件中心化的问题。通过 Mesh 的架构、Metrics 注入等方式,可以看到到底是哪个服务调用的 Redis,再配合服务间的链路调用图,这样整个内网间所有流量的链路调用图就可以绘制出来了。

目前 Envoy 的 Redis 代理支持以下功能:

  • Redis 协议的编解码;

  • 基于哈希的分片;

  • Ketama 一致性哈希算法;

  • 详细的数据统计信息;

  • 对于 Redis 节点的主动和被动健康检查;

  • 上游代理和下游代理分别进行身份认证。

通过上述功能,我们可以看到 Envoy 对于 Redis 的支持相对比较简单,当然未来社区也在规划支持更多的功能,包括熔断、链路追踪、重试等。

数据库中间件产品(比如 Redis 集群中间件、MySQL 集群中间件)的功能主要是对数据做分片处理,以解决单个 Redis 或者 MySQL 节点无法处理的负载。这些功能最早也在 SDK 中,因为维护升级不方便,所以演进成了数据库中间件。随着 Mesh 化架构的流行,在服务本地部署一个 Sidecar,就可以解决数据库中间件产品中心化的问题。

数据库中间件的 Mesh 化和传统的服务 Mesh 化,关注的点略有不同:数据库的中间件产品更关注的是对于数据的分片处理,比如 MySQL 的分库分表等算法、Redis 集群的分片算法等。但也有很多功能是通用的,比如限流熔断等治理功能、链路追踪、Metrics 监控,甚至服务发现等功能。

现在,我们已经了解了数据库中间件产品 Mesh 化的发展方向,接下来我们继续学习在 FaaS 中 Service Mesh 架构到底能发挥什么样的作用。

FaaS

FaaS(Function as a Service)是一种在无状态容器中运行的事件驱动模型。简单来说,Function 是比 Service 更小的程序单元,如果要进行标准化的 FaaS 化改造,就需要进一步拆分,将微服务中的每个方法都拆成一个单独的服务

虽然到目前为止,FaaS 依然是一种非常理想化的架构,比如在服务 0 节点的情况下要消耗大量的时间等待服务启动,但 FaaS 中的一些核心思想,依然是微服务架构的发展趋势,或者说它们可以直接落地,比如强大的自动扩缩容能力、基于异步的事件驱动模型等。

FaaS 的开源方案有 Knative、OpenFaaS、Fission、Kubeless 等,下面我们简单介绍一下这几种常见的开源方案。

  • Knative

Knative 是谷歌牵头发起的 Serverless 项目,是基于 Kubernetes 和 Istio 的 Serverless 解决方案。

  • OpenFaaS

OpenFaaS 是一个使用 Docker 构建无服务器(Serverless)功能的框架,可以部署在 Kubernetes 或者 Swarm 平台。通过 Watchdog 启动进程的方式进行函数式调用。

  • Fission

Fission 是一款基于 Kubernetes 的 FaaS 框架,通过 Fission 可以轻而易举地将函数发布成 HTTP 服务。它的主要特点是 Fission 维护一个容器池,可以做到函数 100ms 冷启动。

  • Kubeless

Kubeless 是基于 Kubernetes 的 Serverless 框架,借助 Kubernetes 提供自动扩缩容、API 路由、监控的功能。

这里我们针对 Knative 做具体分析,它借助了 Istio 的强大能力,是未来 FaaS 架构发展的趋势。

Knative

Knative 包含三个核心组件,分别是负责服务处理的 Serving、事件处理的 Eventing,以及负责云原生 CI/CD 构建的 Tekton。

  • Serving

Knative Serving 组件依托于 Kubernetes 平台和 Istio,提供服务自动扩缩容、服务路由、流量代理、容器部署等功能。

  • Eventing

Eventing 主要由事件源(EventSource)、事件处理(Flow)以及事件消费者(EventConsumer)三部分构成,定义了 CloudEvent 的通用事件标准。

  • Tekton

Tekton 是一个功能强大且灵活的 Kubernetes 云原生 CI/CD 开源框架。

接下来,我们结合一张 Knative 架构图,进一步讲解 FaaS 的核心原理。

下图中的 Route 可以理解为 Istio Gateway 的角色。实际上,大多数 FaaS 架构,都有一个类似 API Gateway 的角色,主要用来处理流量的转发,在 Pod 数量为 0 时,也会做一些特殊处理,比如此时要 hold 住流量,等待 Pod 启动。

Knative 架构图

从上图可以看到,流量经过 Gateway(Route)后,会有两个分支,一个是服务的 Pod 存在的时候,流量会直接路由到 Pod 上面;另外一个在 Pod 缩容到 0 的情况下,会转发到一个 Activator 的组件中,这个组件的主要功能是对容器资源的调度。

当有流量被转发到 Activator 组件时,它会主动通知 Autoscaler 组件进行扩容操作,这时 Autoscaler 会创建新的 Pod,提供服务。此时 Activator 对启动的 Pod 进行健康检查,检查通过后,将流量转发到相应的 Pod 上面。

后面的流程就清晰了, Activator 组件处理完流量后,会将结果返回给 Gateway。至此,整个流程就结束了。

在流量被转发到 Activator 组件这个分支的过程中,如果 Pod 数量为 0,本次流量处理的时间在很大程度上就取决于 Pod 启动的时间,而这个时间大概率是秒级别的。但在实际生产中,一般的请求需要毫秒级别返回结果 ,秒级别的响应速度很难接受,这也是 FaaS 架构目前在落地中面临的最大问题,大部分对响应速度要求比较高的场景,Pod 缩容为 0 都是难以接受的

所以 Knative 也提供了 Pod 是否缩容到 0 的选项,这样更有利于 FaaS 架构的落地。尽管没有做到完全的 Serverless,但能够拥有强大的扩缩容能力已经非常有诱惑力了。

至此,Knative 的核心架构就讲完了。下面我们再来看看在 OpenFaaS 中,一个相较于其他 FaaS 架构的改进部分,这部分改进让 FaaS 相较于传统的队列系统更具优势。

OpenFaaS

同步

下图是一个传统的 FaaS 调用,或者你也可以理解为传统的微服务调用。在这张图片中,我们的需求是从数据库中读取数据,并根据获取的数据生成一个 PDF 文件上传到 S3 服务器中。但是这个场景消耗的时间会比较长,大概是 2 分钟左右,而且下图的同步架构,会阻塞程序进程,前端的响应也会等待很长时间。

在传统的微服务架构中,一般我们也不会采用下图的同步系统,而是采用异步队列系统解决:将生成 PDF 作为事件存入队列中,通过队列消费生成 PDF 并上传到 S3 服务器,这样就可以大大提高微服务的同步响应速度了。

同步 OpenFaaS 调用图

那么,在 FaaS 中有没有更好的解决方案呢?我们来看 OpenFaaS 中的异步方案。

异步

在 OpenFaaS 中, OpenFaaS 将请求作为事件直接放入 NATS 这个队列系统中,对于使用者来说,他并不需要关心这是否是一个异步调用。这个调用的编程方式,依然是 HTTP 的方式,只是 OpenFaaS Gateway 自动将此次 HTTP 调用放入了 NATS 队列中,通过 queue-worker这个进程进行队列消费,再通过 HTTP 请求 Generate Statement 服务的方式触发此次服务调用,用看起来同步的方式完成了整个异步调用

OpenFaaS 异步调用图

通过下图我们可以更直观地了解整个运行过程。

在这个架构中,使用者无须关心甚至无须感知 NATS 队列系统,对于使用者来说,这看起来就是一次普通的 HTTP 服务调用。而 PDF 生成服务的编写者,也不需要处理复杂的队列消费,对于他来说,也和其他同步服务一样,提供一个简单的 HTTP 服务接口就可以了。FaaS 架构让队列系统和业务解耦,可以让队列系统完全交给基础架构团队维护,甚至未来可以随意更换其他的开源队列系统。

至此,Service Mesh 在 FaaS 场景中的应用我们就讲完了。下面我们来做一个简单的总结。

总结

这一讲我介绍了 Service Mesh 在未来的展望,包括中间件 Mesh 化和 FaaS 中 Service Mesh 的作用。在云原生的大趋势下, Service Mesh 已经成为云原生的基础组件,未来云原生架构中的很多场景都会看到 Service Mesh 的应用。

本讲内容总结如下:

通过这一讲,相信你已经了解了 Envoy 在数据库中间件 Mesh 化中做出的一些尝试,也清楚了 FaaS 的开源架构之一------Knative 就是通过集成 Istio 来为 FaaS 产品提供强大的路由转发能力。

结合今天的内容,你能谈一谈自己对 Service Mesh 未来的发展方向和演进趋势吗?欢迎在留言区和我分享你的观点。

今天内容到这里就结束了,下一讲我们将迎来专栏的结束语 :Service Mesh 会是微服务演进的终极方向吗?作为结束语,我除了讲解相关知识,也想和你分享一下自己的心路历程。我们下一讲再见。