【知识】掌控微服务架构的 20 个 Go 语言

当你需要构建微服务的时候,Go 语言拥有你需要的一切内容。

当 Google 的编码团队在 2007 年浏览计算机语言时,他们看到了数百种用于编写软件的非常好的工具,但是没有一种工具能为谷歌提供合适的功能,一种能够支持在谷歌庞大的服务器集合中构建谷歌软件包所有需求的语言。

有些语言太专注于堆栈的底层。有些又太复杂了,充斥着许多只会碍事的功能。而谷歌开发人员想要一种简单的语言,可以在几个小时内学会,但又足够复杂,能够处理现代互联网上的信息流。

其解决方案就是 Go,一种在 C、Java 或 JavaScript 环境下长大的程序员都会熟悉的语言——换句话说,几乎每个程序员都熟悉这种语言。Go 拥有足够的功能来编写一些循环和编码块,但是又很少有需要你花大量时间才能掌握的高级特性。内置的经过优化的程序可以方便的从互联网上获取数据。而除此以外的一切,无论看起来有多么巧妙,都被忽略了。

Go 对于基于微服务架构构建应用程序的团队来说是一个很好的选择,因为这些服务的体量对于谷歌今天所运行的服务来说不值一提。你的项目可能不会向全世界来提供电子邮件、地图、搜索和无数其他的云服务,但最终它仍可能会向用户提供数十种不同的小型信息服务。每一个微服务项目相比来说都只是谷歌服务的一个微版本或者纳米版本。

谷歌决定开源 Go 是一个明智之举。这种语言培育了成千上万的项目,而最终这些项目为你的 Web 项目提供了基础。这种丰富的传统使得并行工作的团队能够更容易的创建自己的服务群。

以下是 20 个最有趣的开源项目,可用于帮助你构建自己的 Go 微服务网络。从专注于消息传递、路由、错误处理或 API 的小工具包,到构建 MVC Web 应用程序的完整框架,你会发现许多的基于 Go 语言开发的微服务工具包。

1.Beego

Beego框架包括了许多拥有额外标准的附加功能,例如全功能路由器和具有 CRUD 操作的对象到数据库映射器,几乎可以开箱即用。 许多 Beego 粉丝最喜欢的工具就是 Bee tool了,这是一个快速而强大的命令行工具,用于构建,更新,打包和部署应用程序。 Bee tool 能够从模板生成源代码并时刻保持最新的数据库。

2.Buffalo

许多微服务框架所提供的功能都只是浅尝辄止而已。 但Buffalo团队需要的是一个能够组装 Web 应用程序的所有部分的东西,包括应用程序本身的一些设计。他们喜欢称之为“生态系统”,因为许多部件可以安装在一起。如果你想要路由功能 (很少有人不愿意),你就可以将Gorilla/Mux项目组装进来。如果你需要模板,Buffalo 会更喜欢Plush而不是内置的 Go 机制。一个名为Pop的泛数据库连接模块将帮助你将数据库信息转换为 Go 对象。你还可以找到连接数据库,处理 Cookie 以及完成几乎所有其他你能够想象到的标准方法。

3.Cobra

有时候,你只想为你的代码提供一个命令行界面。Cobra已准备好处理 CLI 的所有标准功能了,因此你无需再浪费时间实现代码来查找 -h 或 -help 标志。如果你的微服务将响应具有大量标志和其他功能的命令行调用,那么你将需要集成 Cobra。

4.Docker

你可以在任何机器上运行你的微服务代码,包括你办公室中那个被遗忘已久的服务器机房中的老机器,但是越来越多的人开始选择将他们的代码打包在 Doker 容器中,并将这些容器发送到云端。这些小软件包使得处理大量不同的代码块变得更加容易——当你对微服务体系结构的愿景要求你创建许多独立的小代码块时,这是一项很有价值的服务。

值得一提的是 Doker 是用 Go 编写的,尽管在部署 Doker 容器时,你可能永远不需要去关心这个。Doker 社区版是开源的,所以如果你需要的话,你可以继续使用它,但是很可能你只需要用 Doker 作为工具来部署你自己的微服务项目。Go 粉丝想要记住 Doker 是用 Go 写的,真正的原因是 Doker 的无处不在是对该语言的有力支持。

5.Echo

Echo是一个极简主义的框架,但它有许多最重要的组件来传递比特信息。其路由器将解析 URL 并将部分数据转换成参数,这样你就不需要解析它们了。然后,你就可以混合使用身份验证、表单解析、压缩以及其他合理的限制。这让你可以集中精力于从函数中返回正确的信息。

6.Errors

有时,API 的用户会传递需要标记的错误参数。你可以自己处理这个问题,也可以将它传递给Errors,这是一个库,它将自动执行大部分跟踪以帮助调试。当错误发生时,Errors 会用注释来包装它,详细说明出了什么问题,以及哪里出了问题。

7.Gin

可能这个名称听起来不太显眼,但Gin项目其实是受欢迎的Martini框架的下一代。你可能会说 Gin 只是扔掉了些多余的东西,并专注于那些最有魅力的部分而已。但那些花了大量时间来构建 Node.js 微服务应用程序的开发人员则会感到宾至如归。通过实例化对象,然后附加一个函数来处理特定调用,你就可以在 Gin 中创建一个微服务。Gin 负责处理路由,而你的函数则负责提供业务逻辑。如果你忽略掉一些标点符号,它甚至看起来就像是 Node.js 的代码。

8.Ginkgo

测试可能是微服务开发中最具挑战性的领域了。Ginkgo通过行为驱动的测试扩展了标准 Go 发行版的内置测试机制。其测试语言提供了一种高级机制,用于拼写出特定功能或服务应该生成的内容。结果通常是使用 Ginkgo 自己的Gomega匹配器来进行评估的,但如果你愿意,也可以使用不同的匹配器库。

Ginkgo 是一个复杂的框架,具有各种选项,用于设置测试数据,运行测试以及在事后切断测试数据。这个结构鼓励你对结果进行描述,然后让 Ginkgo 来处理其他的所有事情。

9.Goa

如果你是一名过去使用 Ruby 和 Praxis 框架的开发人员,或者你只是一个想要欣赏设计语言的力量和准则的人,那么你会在Goa中找到许多喜欢的东西。你本身不需要写 Go 代码。你可以在 Goa DSL 中为 API 编写一个设计规范,然后 Goa 就会将其转换为执行该工作的 Go 代码。DSL 针对微服务 API 进行了优化,并会强制你的设计符合标准架构。

10.Gorilla

Gorilla项目是另一个旨在帮助你快速交付大部分你所需要模块的大集合。Gorilla 的Mux路由模块被许多其他框架所使用,因为它的确非常好用。许多用户指出websocket代码是他们采用 Gorilla 的主要原因。

11.Gotify

同步一组微服务的挑战之一是建立有效的消息传递节点。 Gotify是一个简单的服务器,用于发送和接收消息,将你的微服务集合与持续存储的消息组合在一起。最有用的部分可能是其中用来帮助调试的 Web 界面,这是一项非常困难的任务。

12.Hugo

使用像Hugo这样的静态站点生成器可以构建的微服务不多,但是当重复查询的答案数量有限时,这就是一个值得考虑的选项了。Hugo 会一次又一次地吐出答案,然后他们又会一次又一次地被送达。当你的答案已经以 HTML 格式提供时,这个项目就非常有用。

13.Kite

如果你希望建立一个更加严格控制的服务群体,并且不希望服务之间的交互超过通常的数量,请了解一下Kite。Kite 是为了让使微服务通信的协调更加简单而生的。来自非 Kites 的 API 调用通过 websocket 进入,然后就会使用更快,更低级别的套接字连接来 ( 基于dnode) 传递新消息。一个名为 Kontal 的服务注册和认证服务则位于中间。如果你需要频繁的交换信息,协调许多操作,在不同服务器之间添加这一层互连可以使一切变得更快。

14.Logrus

跟踪流入和流出 API 的数据及其可能产生的错误通常意味着需要编写日志文件。这个过程可以像将一行数据写入一个打开的文件一样简单,但是包含一个完整的日志框架以及所有额外的特性和结构通常是有意义的。Logrus提供了一个格式化程序来标准化你的输出,并使以后任何日志文件分析的自动化变得更加容易。请不要编写自己的快速而肮脏的日志记录代码。使用像 Logros 这样的库吧。

15.Nano

建立一个微服务并不需要太多东西。简单的Nano项目是一个很好的例子。实际代码不超过 200 行,如果算上评论,也只有 400 多行。然而,你可以用你自己的几行代码来建立一个微服务——一个将封装处理请求所需的业务逻辑的微服务。这个框架还有一些其他的优点,比如一个语言无关的 API 结构,因此你的 Go 代码可以很好地与其他语言编写的任何其他服务一起使用。然后你还需要有一个很好的测试过程来嵌入你自己的本地测试程序。没有更多的, 但这就是重点。

16.Negroni

有些人不满意 Martini 的复杂,决定采取一个更简单的方向发展。他们去掉了路由功能和其他几个部分来创建了Negroni,这是一个非常小的工具,除了提供一些标准文件、处理你的定制请求、从基本问题中恢复并保存日志之外,它不会做更多的工作了。如果你想要额外的东西,你可以自己混合它们。 Negroni 团队提供了一系列与他们合作的小型项目。

17.Renderer

当你准备输出时,你需要获取数据并将其插入到模板中。 Renderer 是一个提供各种输出格式 (JSON,JSONP,XML,YAML,HTML) 和一个漂亮,快速和标准的模板引擎的项目。

18.Revel

Revel借用了 Node.js 的 Webpack 世界中的一个简洁的特性,能够让 Revel 像 IDE 一样工作,或者至少是部分的 IDE,每当你对代码进行更改时,它都会不断地重建你的项目。一旦你按下 save,框架就会感知到变化,编译代码,如果没有编译错误,就会启动应用程序。因此,Revel 服务器将自动部署对其代码的更改——这非常适合在桌面上开发,对于生产中的代码来说可能有点太诱人了。

该框架本身功能齐全,具有功能最丰富的所有主要和次要机制。这意味着模板、缓存、验证和过滤器会在数据流经请求管道时对其进行操作。如果你正在构建许多微服务,那么也有一个模块系统允许你在项目之间共享一些 MVC 组件。

19.Testify

使用经典断言测试的最简单的方法之一是使用Testify,这是一个 Go 项目,它也提供了模拟工具来快速测试大量微服务的各个部分。只需几行就可以编写一些基本测试,然后自动检查代码是否返回了正确的响应。

20.Tollbooth

当你第一次发布 API 时,你希望世界上的每个人都调用它。但是,当你的服务器崩溃——或者你看着你的云托管弹性服务账单急速膨胀时——你就会改变主意的。Tollbooth是一个轻量级的系统,用于将传入请求限制为每秒一定数量。切断入口的需求减少了管道下游对微服务或数据库的需求,让你能够让一切保持顺利运行。

21.None

“None”,我的意思是有时候你根本不需要使用任何框架。你只需从头开始编写 Go 代码,而无需导入任何内容或实例化某个控制对象。在 Go 中创建微服务很容易,因为 Go 已经内置了许多基本代码。这就是为什么可以用几百行代码构建像 Nano 这样的框架的原因。

所有在套接字上侦听、解包 HTTP 请求的工作,都是在标准发行版中的一个标准库中完成的。当然,一些框架可以添加一些规则或特性,但是很多时候,如果你只是编写一个非常基本的微服务,你就不需要它了。因为所有的“附加功能”都可能会妨碍这一过程,并导致 [一些 Go 开发人员] 最终觉得代码变得更加复杂了。如果你只是在线上进行监听,并根据收到的信息做出一些基本决定,那么你可能什么都不需要做。