摘要
我最近在墨尔本 Golang 聚会上就如何开发微服务和框架做了一次演讲。在本文中,我将与您分享我的想法(此外,它对我来说是一个很好的复习)。
在这里,我要介绍以下框架:
框架简介
Go Micro
这是我认为最受欢迎的框架之一。有很多博客文章和简单的例子可供使用参考。您可以从 在 Medium 或 获得 Go Micro 的最新更新。
那么,什么是 Go Micro ?
它是一个可拔插的 RPC 框架,用于在 Go 中编写微服务。开箱即用,您将看到:
- 服务发现 - 自动向服务发现系统注册的应用程序。
- 负载均衡 - 客户端负载均衡,用于平衡服务实例之间请求的负载。
- 同步通信 - 提供请求/响应传输层。
- 异步通信 - 内置发布/订阅功能。
- 消息编码 - 基于消息的 Content-Type 请求头的编码/解码。
- RPC 客户端/服务器打包 - 利用上述特性并公开接口来构建微服务。
Go Micro 架构可以描述为三层堆栈。
顶层包括 Server-Client 模型和服务抽象。该服务器是用于编写服务的基础。而客户端提供了一个接口,用于向服务端发起请求。
底层包含以下类型的插件:
- Broker - 提供一个消息代理接口,用于异步发布/订阅通信。
- Codec - 用于编码/解码消息。支持的格式包括 json,bson,protobuf,msgpack 等。
- Registry - 提供服务发现机制(默认为 Consul )。
- Selector - 基于注册表构建的负载均衡抽象。 它允许使用诸如 random,roundrobin,leastconn 等算法“选择”服务。
- Transport - 服务之间同步请求/响应通信的接口。
Go Micro 还提供 Sidecar 等功能。这允许您使用Go以外的语言编写的服务。 Sidecar 提供服务注册,gRPC 编码/解码和HTTP处理程序。它有多种语言版本。
Go Kit
Go Kit 是一个用于在Go中构建微服务的编程工具包。与 Go Micro 不同,它是一个旨在导入二进制包的库。
Go Kit 遵循简单的规则,例如:
- 没有全局状态
- 声明性构造
- 显式依赖
- 接口作为契约
- 领域驱动设计
在 Go Kit 中,您可以找到以下包:
- 身份验证 - basic和JWT。
- 传输 - HTTP,Nats,gRPC 等。
- 日志记录 - 服务中结构化日志记录的通用接口。
- 软件度量 - CloudWatch,Statsd,Graphite等。
- 追踪 - Zipkin 和 Opentracing。
- 服务发现 - Consul,Etcd,Eureka等。
- 熔断器 - Hystrix 的 Go 语言实现。
您可以在Peter Bourgon的文章和演示幻灯片中找到 Go Kit 的最佳描述之一:
此外,在“Go + microservices”幻灯片中,您将找到使用 Go Kit 构建的服务架构的示例。 有关快速参考,请参阅服务架构图。
Gizmo
Gizmo 是纽约时报的微服务工具包。它提供了将服务器和 pubsub 守护进程组合在一起的软件包。它公开了以下包:
Pubsub包提供了使用以下队列的接口:
因此,在我看来,Gizmo 介于 Go Micro 和 Go Kit 之间。它不像 Go Micro 那样完全的“黑盒”。与此同时,它并不像 Go Kit 那么粗糙。它提供更高级别的构建组件,例如config和pubsub包。
Kite
Kite 是一个在 Go 中开发微服务的框架。它公开了 RPC 客户端和服务端的包。 创建的服务会自动注册到服务发现系统 Kontrol 。Kontrol 是用 Kite 写的,它本身就是 Kite 服务。 这意味着 Kite 微服务在自己的环境中运行良好。如果您需要将 Kite 微服务连接到另一个服务发现系统, 则需要进行自定义。这是我从名单中删除 Kite 的主要原因,并决定不讨论这个框架。
比较框架
我将使用四个类别比较框架:
- 客观比较 - GitHub 统计
- 文档和示例
- 用户和社区
- 代码质量。
GitHub统计
文档和示例
简单来说,没有一个框架提供可靠的文档。通常,唯一的正式文档是 repo 首页上的 Readme 文件。
对于 Go Micro,可以在 , 和社交媒体 上获得大量信息和公告。
如果是 Go Kit,您可以在 的博客中找到最好的文档。我发现的一个最好的例子是在 博客中。
使用 Gizmo,源代码提供了最好的文档和示例。
总而言之,如果你来自 NodeJS 世界,并希望看到类似 ExpressJS 的教程,你会感到失望。 另一方面,这是创建自己的教程的绝佳机会。
用户和社区
Go Kit 是最受欢迎的微服务框架,基于 GitHub 统计数据 - 在本出版物发布时超过10k星。它拥有大量的贡献者(122)和超过1000个分叉。 最后,Go Kit 由 提供支持。
Go Micro 第二,拥有超过 3600 颗 stars ,27 个贡献者和 385 个 forks 。Six Micro 的最大赞助商之一是 。 Gizmo 第三,超过 2200 颗 star, 31 个贡献者和 137 个 forks 。由纽约时报支持和创建。
代码质量
微服务代码实践
好吧,已有足够的理论。下边,为了更好地理解框架,我创建了三个简单的微服务。
这些是实现一个业务功能的服务——"Greeting"。 当用户将 "name" 参数传递给服务器时,该服务会发送 Greeting 响应。此外,所有服务均符合以下要求:
- 服务应自行注册服务发现系统。
- 服务应具有健康检查接口。
- 服务应至少支持 HTTP 和 gRPC 传输。
对于那些喜欢阅读源代码的人。 您可以在此处阅读 repo 中的.
Go Micro greeter
使用 Go Micro 创建服务需要做的第一件事是定义 protobuf 描述。 方便后期,所有三项服务都采用了相同的 protobuf 定义。我创建了以下服务描述:
接口包含一种方法—— "Greeting"。 请求中有一个参数—— 'name',响应中有一个参数 - 'greeting'。
然后我使用修改后的 通过 protobuf 文件生成服务接口。 该生成器由 Go Micro fork 并进行了修改,以支持该框架的一些功能。 我在 “greeting” 服务中将这些连接在一起。此时,该服务正在启动并注册服务发现系统。 它只支持 gRPC 传输协议:
为了支持HTTP传输,我不得不添加其他模块。它将HTTP请求映射到 protobuf 定义的请求。并称为 gRPC 服务。 然后,它将服务响应映射到 HTTP 响应并将其回复给用户。
非常简单明了。 Go Micro 在幕后处理了许多事情——例如在服务发现系统中注册。 另一方面,创建纯 HTTP 服务很困难。
Go Kit greeter
完成 Go Micro 后,我转到了 Go Kit 服务实现。 我花了很多时间阅读 Go Kit 存储库中提供的代码示例。 理解端点的概念花了我很多时间。下一个耗时的难题是服务发现注册商的代码。直到在找到一个 后我才实现它。
最后,我创建了四个包:
- 服务逻辑实现。
- 与传输无关的服务端点。
- 传输特定端点 (gRPC,HTTP)
- 服务发现注册商。
如您所见,代码没有任何依赖关系。它只是实现逻辑。下一个代码段展示了端点定义:
在定义了服务和端点之后,我开始通过不同的传输协议公开端点。我从 HTTP 传输开始:
在我开始 gRPC 端点实现之前,我不需要重新定义需要 protobuf. 我复制了 Go Micro 服务 protobuf 文件。但就 Go Kit 而言,我使用默认服务生成器来创建服务接口。
protobuf 定义的服务接口生成器
Go Kit 服务 gRPC 端点
最后,我实现了服务发现注册器:
在准备好所有构建块之后,我将它们连接在服务启动器中:
Go Kit 服务启动器
您可能已经注意到,我在几个地方使用了日志逻辑中间件。它允许我将记录逻辑与主服务/端点工作流分离。
服务级别日志记录中间件
端点级别记录中间件
Gizmo greeter
我以与 Go Kit 类似的方式创建了Gizmo服务。我为服务,端点,传输和服务发现注册商定义了四个包。
服务实现和服务发现系统注册器与 Go Kit 服务共享相同的代码。但是端点定义和传输实现必须根据Gizmo功能完成。
Gizmo Greeting 端点
如您所见,代码段与 Go Kit 类似。主要区别在于应该返回的接口类型:
GizmoGreeting HTTP终端
GIzmo Greeting gRPC
Go Kit 和 Gizmo 之间的显着差异在于传输实现。 Gizmo 提供了几种可以使用的服务类型。 我所要做的就是将HTTP路径映射到端点定义。低级HTTP请求/响应处理由 Gizmo 处理。
结论
Go Micro 是推出微服务系统的最快方式。框架提供了许多功能。所以你不需要重新发明轮子。 但这种舒适和速度伴随着牺牲 - 灵活性。它不像 Go Kit 那样容易改变或更新系统的各个部分。并且它强制 gRPC 作为首选的通信类型。
您可能需要一段时间才能熟悉 Go Kit。它需要熟悉 Golang 特性和软件架构方面的经验。 另一方面,没有框架限制。所有部件都可以独立更改和更新。 Gizmo 位于 Go Micro 和 Go Kit 之间。它提供了一些更高级别的抽象,例如 Service 包。 但缺乏文档和示例意味着我必须阅读源代码以了解不同的服务类型是如何工作的。使用 Gizmo 比使用 Go Kit 更容易。但它并不像 Go Micro 那么顺利。
这就是今天的一切。谢谢阅读。请查看微服务代码库以获取更多信息。如果您对Go和微服务框架有任何经验,请在下面的评论中分享。
本文由 原创编译, 荣誉推出