Service Weaver 简介:谷歌编写分布式应用程序的框架


服务编织器简介:用于编写后端应用程序的新开源框架。 最重要的是,Service Weaver允许您将应用程序编写为一个模块化的整体,并使用自定义部署程序将其部署为一组微服务。

更具体地说,Service Weaver 由两个核心部分组成:

  1. 一组编程库,可让您将应用程序编写为单个模块化二进制文件,仅使用本机数据结构和方法调用,以及
  2. 一组部署器,可让您配置应用程序的运行时拓扑并将其部署为一组微服务,可以在本地或在您选择的云上部署。

通过将应用程序编写过程与运行时考虑因素(例如应用程序如何拆分为微服务、使用何种数据序列化格式以及如何发现服务)分离,Service Weaver 旨在提高分布式应用程序开发速度和性能。

构建Weaver服务的动机
在编写基于微服务的应用程序时,我们发现维护多个不同的微服务二进制文件的开销--它们有自己的配置文件、网络端点和可序列化的数据格式--极大地减缓了我们的开发速度。

更重要的是,微服务严重影响了我们进行跨二进制修改的能力。它使我们不得不在每个二进制文件中做一些事情,比如在每个二进制文件中标记新功能,小心翼翼地发展我们的数据格式,并对我们的推出过程保持密切的了解。最后,拥有预定数量的特定微服务有效地冻结了我们的API;它们变得如此难以改变,以至于我们更容易将所有的变化挤进现有的API,而不是发展它们。

因此,我们希望我们有一个单一的单体二进制文件来工作。单一二进制文件很容易编写:它们只使用语言本身的类型和方法调用。它们也很容易更新:只需编辑源代码并重新部署。它们很容易在本地或虚拟机中运行:只需执行二进制文件。

Service Weaver是一个集两者之大成的框架:具有单片机的开发速度,以及微服务的可扩展性、安全性和容错性。

介绍
Service Weaver的核心思想是其模块化的单体模型。你写一个单一的二进制文件,只使用语言本身的数据结构和方法调用。你把你的二进制文件组织成一组模块,称为组件,它们是编程语言中的本地类型。例如,这里有一个使用Service Weaver用Go编写的简单应用程序。它由一个main()函数和一个单一的Adder组件组成。

type Adder interface { 
    Add(context.Context, int, int) (int, error)

type adder struct{ 
    weaver.Implements[Adder]
}
func (adder) Add(_ context.Context, x, y int) (int, error) {
  return x + y, nil
}

func main() {
  ctx := context.Background()
  root := weaver.Init(ctx)
  adder, err := weaver.Get[Adder](root)
  sum, err := adder.Add(ctx, 1, 2)
}

在运行上述应用程序时,你可以做一个微不足道的配置选择,即是将Adder组件与main()函数放在一起,还是将其分开。当Adder组件分开时,Service Weaver框架会自动将Add调用翻译成跨机RPC;否则,Add调用仍然是一个本地方法调用。

要对上述应用程序进行修改,例如为Add方法添加不受限制的参数,你所要做的就是改变Add的签名,改变其调用站点,然后重新部署你的应用程序。Service Weaver确保新版本的main()只与新版本的Adder进行通信,无论它们是否在同一地点。这种行为,再加上使用语言原生的数据结构和方法调用,使你可以完全专注于编写你的应用逻辑,而不必担心部署拓扑结构和服务间的通信(例如,代码中没有protos、stubs或RPC通道)。

当需要运行你的应用程序时,Service Weaver允许你在任何地方运行它--在你的本地桌面环境中,或者在你的本地机器机架上,或者在云端,而不需要对你的应用程序代码做任何修改。这种水平的可移植性是通过Service Weaver框架中内置的明确的关注点分离实现的。在一端,我们有编程框架,用于应用开发。在另一端,我们有各种部署器实现,每个部署环境一个。

这种关注点的分离允许你通过go run .在本地的一个进程中运行你的应用程序;或者通过weaver gke deploy在谷歌云上运行它;或者在其他平台上启用和运行它。在所有这些情况下,你都能得到相同的应用行为,而不需要修改或重新编译你的应用。

Service Weaver 的 v0.1 版本包括:

  • 用于编写应用程序的 核心Go 库。
  • 许多用于在本地GKE 上运行您的应用程序的部署程序。
  • 组 API,允许您为任何其他平台编写自己的部署程序。

所有库都是在 Apache 2.0 许可下发布的。请注意,在发布 v1.0 版之前, 我们可能会引入重大更改。