Skip to content

微服务框架选型

近几年,随着微服务架构的火热,也诞生了很多微服务框架,如 Java 语言的 Spring Cloud、Go 语言的 Go Kit 和 Go Micro 以及 Node.js 的 Seneca。
几乎每一种语言都有其对应的微服务框架,这充分说明了微服务架构的火热态势。

虽然微服务架构的实践落地独立于编程语言,但是 Go 语言在微服务架构的落地中仍有其独特的优势。
因此,Go 语言的微服务框架也相继涌现,各方面都较为优秀的有 Go Kit 和 Go Micro 等。

Go 语言的独特优势

Go 语言十分轻量,运行效率极高,原生支持并发编程,相较其他语言主要有以下优势:

  • 语法简单,上手快。Go 提供的语法十分简洁,关键字只有 25 个,几乎支持大多数现代编程语言常见的特性。
  • 原生支持并发,协程模型是非常优秀的服务端模型,可以充分利用多核。
  • 丰富的标准库。Go 目前内置了大量的库,开箱即用,非常方便。
  • 部署方便,编译包小,可直接编译成机器码,不依赖其他库。

简言之,用 Go 语言实现微服务,在性能、易用性和生态等方面都拥有优势。

Go Kit框架

https://github.com/go-kit/kit

Go Kit 是 Go 语言工具包的集合,可帮助工程师构建强大、可靠和可维护的微服务。
它提供了用于实现系统监控和弹性模式组件的库,例如日志记录、跟踪、限流和熔断等,这些库可以协助工程师提高微服务架构的性能和稳定性。
Go Kit 框架分层如下图所示:

GoKit框架分层

基于 Go Kit 的应用程序架构由三个主要部分组成:传输层、接口层和服务层。

  • 传输层用于网络通信,服务通常使用 HTTP 或 gRPC 等网络传输方式,或使用 NATS 等发布订阅系统相互通信。除此之外,Go Kit 还支持使用 AMQP 和 Thrift 等多种网络通信模式。
  • 接口层是服务器和客户端的基本构建块。在 Go Kit 中,服务中的每个对外提供的接口方法都会被定义为一个端点,以便在服务器和客户端之间进行网络通信。每个端点通过使用 HTTP 或 gRPC 等具体通信模式对外提供服务。
  • 服务层是具体的业务逻辑实现,包括核心业务逻辑。它不会也不应该进行 HTTP 或 gRPC 等具体网络传输,或者请求和响应消息类型的编码和解码。

Go Kit 在性能和扩展性等各方面表现优异

Go Micro 框架

https://github.com/asim/go-micro

Go Micro 是基于 Go 语言实现的插件化 RPC 微服务框架。它提供了服务发现、负载均衡、同步传输、异步通信以及事件驱动等机制,并尝试去简化分布式系统间的通信,让开发者可以专注于自身业务逻辑的开发。

Go Micro 框架的结构可以描述为三层堆栈,如下图所示:

GoMicro三层堆栈 Go Micro 三层堆栈

可以看到,Go Micro 框架模型的上层由 Service 和 Client-Server 模型抽象组成。
Server 服务器是用于编写服务的构建块;Client 客户端提供了向服务请求的接口;底层由代理、编解码器和注册表等类型的插件组成。
Go Micro 是组件化的框架,每一个基础功能都有对应的接口抽象,方便扩展。

另外,Go Micro 具有可插拔的特点,其提供的组件可帮助我们快速构建应用系统,并且可以定制所需要的插件功能。(相关插件可在仓库 github.com/micro/go-plugins 中找到。)

go zero

https://github.com/zeromicro/go-zero

https://go-zero.dev/cn/

https://go-zero.dev/en/

Go Kit 与 Go Micro 的对比

Go Kit 是一个微服务的标准库。它可以提供独立的包,通过这些包,开发者可以用来组建自己的应用程序。
微服务架构意味着构建分布式系统,这带来了许多挑战,Go Kit 可以为多数业务场景下实施微服务软件架构提供指导和解决方案。

Go Micro 是一个面向微服务的可插拔 RPC 框架,可以快速启动微服务的开发。
Go Micro 框架提供了许多功能,无须重新“造轮子”,所以开发者可以花更多的时间在需要关注的业务逻辑上。
但是 Go Micro 在快速启动微服务开发的同时,也牺牲了灵活性,并且将 gRPC 强制为默认通信类型,更换组件不如 Go Kit 简便。