纽约时报(NYT)开发团队已经发布了 Gizmo,这是一个基于 Go 语言的开源微服务工具包,这个工具包带有可配置功能策略和基础的交互端口,能给用户提供标准化的配置、日志、质量检查以及端点指标等功能来提高服务质量期望值。
根据 NYT 官方网上一篇开发团队写的关于代码和开发的介绍,开发团队在过去的三年里完全采用了 Go 编程语言,Go 语言在很多开发任务里起到了大作用,尤其是在构建 JSON API 过程中。专注于创建基于 API 的 Go 服务,而创建 Gizmo 微服务工具包是必不可少的中间环节,现在这一工具包已经开源出来供大家使用。
InfoQ 随后采访到了 NYT 首席软件工程师 JP Robinson,问了一些关于创建微服务工具包的动机,因为这一动机直接促使了基于 Go 语言的微服务框架的发展前景,以及未来的走向。
InfoQ:先简单介绍一下 Gizmo 吧,以及创建这一框架的初衷?
Robinson: Gizmo 是一个集合,集中了可整合的工具、功能以及交互页面来帮助开发者构建 Go 服务,具体来说就是将 API 和 pubsub daemons 集合在一起。这个工具包刚开始的时候是由一小群开发者发起的,目的是为 NYT 构建一个专属邮件平台。
InfoQ:相比较用起来更简单更标准的 Go 库,或其他新兴的 Go 微服务框架而言,Gizmo 做了哪些简化来完成编写微服务的?
Robinson: Gizmo 首先能够打动开发者,让开发者有开发感觉的就是它的标准库,但是增加附加功能只会降低微服务成功实施的可能性。举例来说,Gizmo 有一个缠绕着 http.Handlers 的中间件,这个中间件的终端就是 http.HandlerFuncs。这样的设计就可以帮助开发者来编写看起来像是标准库的代码,只是没想到他们意外获得了宝贝,Gizmo 能给自动收集关于代码状态和请求执行时间的度量值。
重新使用标准库也赋予了 Go 语言开发者快速浏览代码并判断运行状态如何。另一个优点就是打开 Gizmo 之后能够连接到各种依附于标准库接口的现有开源工具。一个很好的例子就是 Gizmo 在“github.com/NYTimes/gziphandler”里的使用。
InfoQ:您之前说过 Gizmo 是向 Peter Bourgon 开发的 Go Kit 最好的致意,能解释一下吗?对开发者了解这两个框架有什么好处?
Robinson:当我第一次看到 Peter Bourgon 介绍 Go Kit 的时候,我特别激动,立刻开始查看 README 里的相关项目,寻找是否有些东西可以在内部推广使用。NYT 有多种类型的服务,绝大多数服务都是基于 JSON 和 HTTP 服务端的,所以,表单里以 RPC(Remote Procedure Call)为中心的服务框架不可能再做到开箱即用。
同时我也感觉到一些可用的框架正在抽象出标准库,因此我们需要一些简单、高可用的东西。也正是从那个时候起,我决定采用 Go Kit :
- 重新执行功能可以用来包装现在的程序包。Gizmo 的 SimpleServer 真的只是一个由 Gorilla Toolkit 内部的 mux、context、 logrus 、 go-metrics 和标准库组成的服务器。RPCServer 同样是由这些东西组成的,只不过多了一个 gRPC。
- 支持消息传递模式不同于 RPC。Gizmo 的 PubSub 程序包提供了简单的 Publisher 和 Subscriber 接口,同时有两种实现方式。
- 对过程监控有不一样的见解。Gizmo 服务器暴露出一个可配置和可扩展的质量检查端点。我们期望服务能够发现系统并通过它们和 Gizmo 进行互动。
- 在配置传递上有优势。Gizmo 服务器和 PubSub 程序包和配置程序包严重耦合。同时我们还发现,让这个程序包灵活快速跨团队协调服务器完全不一样,但只要获得配置,我们的起点就更高。
从这里来看,他们的想法是在 Gizmo 的服务器程序包里构建一个 GoKitServer 或 GoKitService。我的想法是,希望这个服务器能够把 Go Kit 端点和 Gizmo 里现有的服务器和服务接口工具结合起来。
InfoQ:和 GOA 框架相比起来,Gizmo 似乎和 API 设计关系并不大。这背后的基本原理是什么?
Robinson:我发现既要保持工具包简单又要遵守 Go 语言对软件开发的灵活性,同时还得确保学习工具包的难易程度平缓。其实构建一个 Gizmo 应用程序并在现实工作环境中使用它,会遇到很多没有解决方法的问题。要想知道如何构建、测试、使用 Gizmo 应用程序的话,可以看这里的博客 open.blogs.nytimes.com。
InfoQ:如何让感兴趣的开发者成为 Gizmo 项目的贡献者?
Robinson: NYT 目前依然过于依赖 SimpleService 和 JSONServices。我们倒是愿意帮助一些人尝试着使用 GoKitServer,这是一个由 github.com/julienschmidt/httprouter 组成的 FastSimpleServer,也有可能是一个由 Hugo 模板工具组成的 WebServer。另外,Kafka pubsub 的实现仍然处于试验阶段,还需要更多的测试。
这些任务多的有点吓人,所以我们欣然接受能够提高测试水平的任何帮助,最近我们将 ContextService 和 ContextHandlers 添加到了工具包里。我也鼓励人们尝试使用这些工具包,如果发现 bug 的话最好能创建问题描述,当然也欢迎用户在别的论坛渠道上反馈对 Gizmo 的建议及改进方式。
查看英文原文: Introducing ‘Gizmo’, a Golang-based Microservices Toolkit from The New York Times Development Team
评论