2024年的Go微服务框架

哪个框架是最适合你的呢?

Go 作为一种流行的编程语言不断增长,现在已经成为2024年构建云原生微服务应用程序的常见选择。Go 甚至进入了 TIOBE 编程语言排行榜的前十名

尽管 Go 在历史上并没有强烈使用框架的文化,但已经有一些框架得到了确立,如今开发人员应该考虑它们以提高生产力。

然而,做出正确的选择可能具有挑战性,因此在本文中我们将介绍主要框架并比较功能、关键用例和潜在缺点。

Go 微服务框架:概述

这里是本文中包含的不同框架的高级概述,这些框架根据对各种用例和功能的内置支持水平进行比较。

Encore GoMicro Go Kit Gin
描述 微服务框架和基础设施 SDK 微服务框架 Go库集合 Web框架
使用案例 事件驱动、分布式系统 事件驱动、分布式系统 分布式系统 高性能的HTTP API
支持协议 HTTP HTTP,gRPC HTTP,gRPC HTTP
低模板 ✅︎ ✅︎ ✅︎ ✅︎
认证 ✅︎ ✅︎ ✅︎ ✅︎
服务发现 ✅︎ ✅︎ ✅︎
异步消息 ✅︎ ✅︎
内置API文档 ✅︎ ✅︎
自动本地开发基础设施 ✅︎
内置跟踪 ✅︎
内置架构图 ✅︎
内置的秘密管理 ✅︎
内置预览环境 ✅︎
内置云基础设施自动化 ✅︎
内置云成本分析 ✅︎

Encore

Encore是构建Go微服务的现代替代方案,旨在使构建面向事件驱动和分布式系统变得更简单。Encore解决了本地开发体验,并通过使用来自AWS和GCP的强大可扩展服务协助部署。它通过提供微服务框架和基础设施SDK来工作,让您将基础设施语义声明为应用程序代码的一部分。官方文档:https://encore.dev/。

代码示例

定义一个服务

使用Encore,您通过在常规Go包中定义API来定义服务。 Encore将此视为服务,并使用包名称作为服务名称。部署时,Encore将自动为每个服务提供所需的基础设施。

在磁盘上的展示如下:

1
2
3
4
5
6
7
8
9
/my-app
├── encore.app // ... and other top-level project files

├── hello // hello service (a Go package)
│   ├── hello.go // hello service code
│   └── hello_test.go // tests for hello service

└── world // world service (a Go package)
└── world.go // world service code

这意味着构建微服务架构就像在应用程序中创建多个 Go 包一样简单。有关更多详细信息,请参阅应用程序结构文档。

定义一个API

要定义一个 API,只需在任何普通的 Go 函数上添加 //encore:api 注解。这会告诉 Encore 该函数是一个 API 端点。Encore 将自动在编译时生成必要的样板代码。

在下面的示例中,我们定义了 API 端点 Ping,在 hello 服务中,它会暴露为 hello.Ping

1
2
3
4
5
6
7
package hello // service name

//encore:api public
func Ping(ctx context.Context, params *PingParams) (*PingResponse, error) {
msg := fmt.Sprintf("Hello, %s!", params.Name)
return &PingResponse{Message: msg}, nil
}

定义一个 Pub/Sub topic

如果您想要一个发布/订阅主题,可以直接在应用程序代码中声明它,就像这样。

1
2
3
4
5
6
7
8
9
10
import "encore.dev/pubsub"

type User struct { /* fields... */ }

var Signup = pubsub.NewTopic[*User]("signup", pubsub.TopicConfig{
DeliveryGuarantee: pubsub.AtLeastOnce,
})

// Publish messages by calling a method
Signup.Publish(ctx, &User{...})

要运行您的应用程序,只需使用encore run命令。Encore将自动设置本地基础设施并生成必要的样板代码。您还可以获得一个带有分布式跟踪功能的本地开发仪表板,以帮助您轻松理解和调试应用程序行为。

当您想要部署到云端时,您的代码不会发生变化。Encore将在所有环境中生成必要的样板并配置必要的基础设施:

  • NSQ 用于本地开发
  • GCP Pub/Sub 适用于 GCP 上的环境。
  • AWS 上的环境中的 SNS/SQS

关键特性

  • 无样板文件:使用任何函数上的注释声明API,从Go包创建服务。
  • 内置分布式跟踪:轻松追踪请求的路径和性能。
  • 自动化API文档和架构图:自动保持文档和图表最新。
  • 内置机密管理:安全处理敏感数据。
  • 云基础设施自动化:在本地、预览以及GCP和AWS中自动配置基础设施。

优势

  • 可扩展性:Encore旨在设计大规模应用程序,是使用可伸缩云服务构建大型分布式系统的高效方式。
  • 简单和快速:Encore将许多基础设施管理复杂性抽象化,使开发人员能够专注于编码。
  • 标准化:提供了一种统一的构建微服务和API以及配置基础设施的方式,遵循最佳实践。
  • 内置工具:Encore提供内置的分布式跟踪、自动化API文档、预览环境等功能。
  • 云无关性:Encore应用可以部署到任何云提供商,提供灵活性并防止厂商锁定。

限制

  • 为了从Encore中获得最大价值,您应该同时使用API框架和基础设施SDK,这取决于您当前的情况可能需要对当前基础设施管理流程进行更改。

适用于

  • 这里注册,体验一下 Encore。
  • 查看此指南,了解如何根据您的情况和优先事项最好地评估 Encore。

GoMicro (Orb)

GoMicro(将更名为Orb)是一个微服务框架,旨在简化构建可扩展和易维护应用程序的挑战。GoMicro提供了一种可插拔的架构,允许开发人员选择并调整框架以满足其需求,并与各种服务发现系统集成。

注意:自2023年4月以来,GoMicro尚未发布新版本,因此可能需要谨慎对待。

关键特性

  • 可插拔架构:根据您项目的需求调整和扩展 GoMicro。

  • 服务发现与负载均衡:原生集成确保高效且平稳运行。

    更多特性,可以查看官网:https://github.com/go-micro/go-micro

    优势

  • 可扩展性:GoMicro旨在设计大规模应用程序,可以轻松处理增加的负载。

  • 灵活性:可插拔的特性意味着它可以根据各种项目需求进行定制。

限制

  • 复杂性:功能的广泛范围和可插拔性可能会让新手感到畏惧。
  • 云原生依赖:可能不适合那些没有专注于云原生部署的项目。

适用于

对于专注于云原生应用程序的团队,尤其是那些受益于事件驱动方法的团队。

什么时候考虑GoMicro?

  • 在开发可扩展、云原生和事件驱动的应用程序时。
  • 当框架的灵活性和定制化是您的首要任务,并且愿意花费大量时间进行手动基础设施设置和维护时。

Go kit

Go kit 是一组 Go 包(库),用于在 Go 中构建微服务。它专注于提供常见挑战的解决方案,同时保持相对中立。

关键特性

  • 服务发现:与各种服务发现系统无缝集成。
  • 可插拔传输:提供一系列传输机制,如HTTP和gRPC。

优势

  • 标准化:提供了一种统一的构建服务的方式,符合最佳实践。
  • 灵活性:尽管有自己的观点,但它提供了插入不同组件的方法。

限制

  • 陡峭的学习曲线:它特有的做事方式可能需要一定时间的初始投资才能掌握。
  • 潜在开销:对于更简单的项目,Go kit 可能显得过度复杂。

适用于

对于重视标准化但又保持灵活性的团队。

什么使用考虑使用Go kit?

  • 当您需要一个平衡标准化方法和灵活性的工具包时。
  • 当您不介意投入时间和精力手动设置和维护云基础设施和可观测工具时。

Gin

Gin 是一个专注于性能的 Go Web 框架。Gin 的特点是极简主义,适用于构建小型、专注的应用程序。

关键特性

  • 快速入门:其极简的特性意味着您可以快速启动和运行。
  • 多功能性:作为一款极简产品,Gin提供了很大的灵活性,但牺牲了内置工具。

优势

  • 快速入门:其极简的特性意味着您可以快速启动和运行。
  • 多功能性:作为一款极简产品,Gin提供了很大的灵活性,但牺牲了内置工具。

限制

  • 面向Web:主要针对Web应用程序,可能不适合非Web微服务。
  • 功能不够丰富:对于更复杂的需求,您可能需要依赖第三方工具和扩展。

适用于

  • 对于注重性能并希望创建简单轻量级网络应用的开发人员和小团队

什么时候考虑使用Gin?

  • 当您的项目需要性能并且整体范围较小时。
  • 当您正在构建少量和简单的服务时,因此在设置基础设施方面的总时间投资较小。

原文链接: https://encore.dev/resources/go-frameworks