2007 年,谷歌的一个团队在调研计算机编程语言时,发现有数百种可用于开发软件的语言,但没有一种能提供谷歌真正需要的特性。有些语言太过底层,有些又太过复杂,有些特性对他们来说反而会碍手碍脚。谷歌的开发人员想要的语言要简单到可以在几个小时内学会,但又要复杂到足以应付现代互联网的信息流。
他们的解决方案就是 Go 语言,这门语言对于 C 语言、Java 或 JavaScript 程序员来说——换句话说,就是所有的程序员——都很容易掌握。Go 语言提供了足够的特性来编写循环和代码块,但没有一个特性是需要很长的时间才能掌握的。内置的例程经过优化,可以从互联网获取数据和发送数据。其他的东西——即使是非常聪明的想法——都被排除在外。
Go 语言是微服务开发团队的一个很好的选择。即使你的项目可能不需要像谷歌那样向全世界提供电子邮件、地图、搜索和其他云服务,但仍然可能需要向用户提供数十种不同的小型信息服务。
谷歌决定开源 Go 语言是一个明智之举。这门语言培育了数千个开源项目,这些项目为你的 Web 项目提供了开箱即用的构建块。这里列出了 20 个最有趣的开源项目,用于构建基于 Go 语言的微服务系统。从专注于消息传递、路由、错误处理或 API 的小工具包,到用于构建 MVC Web 应用程序的更全面的框架,你将发现,使用 Go 语言开发微服务有着非常丰富的选择。
https://beego.me/
Beego 框架提供了很多标准附加功能,例如全功能路由器和可用于执行 CRUD 操作的对象到数据库映射工具。Bee 是 Beego 爱好者的最爱,它是一个快速而强大的命令行工具,用于构建、更新、打包和部署应用程序。Bee 可以从模板生成源代码,并保持数据库的最新状态。
https://gobuffalo.io/en
Buffalo 团队需要能够将 Web 应用程序的所有部分组装在一起的东西,包括应用程序本身的一些设计。他们把能够安装在一起的很多部件叫作“生态系统”。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 倾向于使用 Plush,而不是使用内置的 Go 语言模板机制。数据库连接模块集合 Pop 可以帮你将数据库信息转换为 Go 对象。你还可以找到连接数据库、处理 cookie 以及完成其他任务的标准方法。
https://github.com/spf13/cobra
有时候,你只需要一个命令行界面。Cobra 提供了 CLI 的所有标准功能,因此你不必浪费时间实现代码来查找 -h 或 -help 标志。如果你的微服务需要对具有大量标志和其他功能的命令行调用做出响应,那么可以考虑集成 Cobra。
你当然可以在办公室服务器小黑屋里的裸机上运行微服务,但越来越多的人将他们的代码捆绑在 Docker 容器中,并将容器发到云端。小型的包更容易处理大量不同的代码块,当你对微服务架构的愿景要求你创建很多小的独立代码块时,这将是一项有价值的服务。
值得一提的是,Docker 是用 Go 语言开发的,尽管在部署 Docker 容器时你可能永远不会想到这一点。Docker 社区版是开源的,所以如果有必要,你可以参与其中,但很可能你只是将 Docker 作为部署微服务的工具。Go 语言爱好者之所以想要记住 Docker 是用 Go 语言开发的这一事实,是因为无处不在的 Docker 有力地证明了他们对这门语言的支持。
https://echo.labstack.com/
Echo 是一个极简框架,但它提供了很多最重要的组件。路由器可以将 URL 拆解,然后将拆解的各个部份转换为参数,因此你无需自行解析它们。然后,你可以混合使用身份验证、表单解析、压缩和合理性限制。你可以专注于从函数中返回正确的信息。
https://github.com/juju/errors
有时候,API 的用户会传递错误的参数。你可以自己处理这些参数,也可以把它们创给 Errors,这是一个可以自动执行大部分跟踪的库,方便进行调试。当发生错误时,Errors 会使用注释来详细说明出错的地方和位置。
https://github.com/gin-gonic/gin
Gin 是 Martini(https://github.com/go-martini/martini)的下一代框架。可以说,Gin 抛弃了那些额外的东西,专注于提供最有用的部分。花费大量时间构建 Node.js 微服务的开发人员会感到宾至如归。你可以实例化一个对象,然后附加函数来处理特定的调用,这样就可以创建一个微服务。Gin 负责处理路由,而你的函数处理业务逻辑。如果不去考虑标点符号,它的代码甚至看起来有点像 Node.js 代码。
https://onsi.github.io/ginkgo/
测试可能是微服务开发当中最具挑战性的事情。Ginkgo 通过行为驱动测试扩展了标准 Go 发行版的内置测试机制。Ginkgo 提供了一种高级机制,用于指定函数或服务应该产生哪些结果。结果通常使用 Ginkgo 提供的 Gomega 匹配器(http://onsi.github.io/gomega/)进行评估,但如果你愿意,也可以使用不同的匹配器库。
Ginkgo 是一个全面的框架,提供了各种选项,用于设置测试数据、运行测试以及在事后释放测试数据。你只需要描述结果,然后让 Ginkgo 处理其他的事情。
https://github.com/goadesign/goa
如果你是一个曾经使用 Ruby 和 Praxis 框架的开发人员,或者是一个欣赏设计语言的强大力量人,那么你会在 Goa 中找到很多你喜欢的东西。你本身不需要编写 Go 代码。你使用 Goa DSL 为 API 编写设计规范,然后 Goa 将其转换为可执行的 Go 代码。DSL 针对微服务 API 进行了优化,并强制你的设计遵循标准的架构。
http://www.gorillatoolkit.org/
Gorilla 项目提供了一系列你需要的模块。Gorilla 的 Mux(http://www.gorillatoolkit.org/pkg/mux)路由器被很多其他框架使用,因为它太好用了。很多用户之所以使用 Gorilla,是因为 websocket(http://www.gorillatoolkit.org/pkg/websocket)。
https://github.com/gotify/server
同步一组微服务所面临的一个挑战是建立有效的消息传递节点。Gotify 是一个简单的服务器,用于发送和接收消息,将你的微服务集合与持续存储的消息组合在一起。最有用的部分可能是它的 Web 接口,可帮助开发者应对最令人头疼的调试问题。
https://github.com/gohugoio/hugo
Hugo 是一种静态站点生成器,可以用这个框架构建的微服务并不多,但如果网站只有有限的重复查询答案时,这是一个值得考虑的选项。Hugo 一次生成答案,然后可以重复使用。如果你已经已 HTML 格式提供答案,那么 Hugo 会非常有用。
https://github.com/koding/kite
如果你希望建立一个更加可控的服务群体,而不是通常的服务之间的互动,那么可以考虑一下 Kite。Kite 的目标是让微服务之间的通信协调变得更简单一些。来自 Kite 以外的 API 调用通过 websocket 进入,然后 Kite 使用更快、更低级别的套接字连接(基于 dnode)传递新消息。中间有一个叫作 Kontrol 的服务注册表和身份验证服务。如果你需要经常交换消息和协调很多的操作,那么在不同服务器之间添加这一层会让一切变得更快。
https://github.com/sirupsen/logrus
要跟踪 API 的流入和流出数据和可能产生的错误,通常需要将日志写入文件中。这个过程可以很简单,比如在一个打开的文件中写入一行行的数据,但通常使用完整的日志框架会更好。Logrus 提供了格式化程序来标准化你的日志输出,并让后续的自动化日志文件分析变得更容易。不要尝试自己开发日志代码,使用像 Logrus 这样的库会事半功倍。
https://github.com/pasztorpisti/nano
构建一个微服务并不需要太多东西,Nano 就是一个极简主义的例子。它的实际代码不会超过 200 行,如果算上注释也只有 400 多行。你只需要几行代码就可以构建一个微服务——只包含处理请求所需的业务逻辑。这个框架还有一些其他不错的特性,例如与语言无关的 API 结构,这样你的 Go 代码就可以与使用其他语言开发的服务发生交互。它还提供了一个测试过程来,可以嵌入你的本地测试例程。简简单单,但却恰到好处。
https://github.com/urfave/negroni
有些人看完 Martini 后,决定走一条更简单的道路。他们剥离了路由器和其他一些东西,创建了 Negroni,这是一个非常小型的工具,除了处理标准文件、自定义请求、从基本错误中恢复以及保留日志之外,它不会做更多的工作。如果你想要额外的东西,可以自己加入。Negroni 团队也提供了一系列与可以与 Negroni 一起使用的小型项目。
https://github.com/thedevsaddam/renderer
在准备输出响应时,你需要获取数据并将其插入到模板中。Renderer 提供了各种输出格式(JSON、JSONP、XML、YAML、HTML、文件)和一个漂亮、快速和标准的模板引擎。
https://revel.github.io/
Revel 借鉴了 Webpack 的一个简洁的特性,这让 Revel 看起来就像一个 IDE 一样,或者至少是 IDE 的一部分,每当你对代码做出更改,它会持续地重新构建你的项目。当你保存修改后,Revel 会检测到更改,然后就编译代码,如果没有编译错误,就启动应用程序。因此,Revel 服务器会自动部署修改的码——在桌面上进行开发时这项功能非常好用,或许对于生产环境代码部署来说也是有点诱人的。
这个框架本身功能齐全,它提供了模板、缓存、验证和过滤器。如果你正在构建很多微服务,它还提供了一个模块系统,让你可以在项目之间共享一些 MVC 组件。
https://github.com/stretchr/testify
使用断言的最简单方法之一是使用 Testify,它是一个 Go 语言项目,还提供了模拟工具,用于快速测试大型微服务的各个部分。只需要几行代码就编写一些基本测试用例。
https://github.com/didip/tollbooth
在你发布 API 之后,当然希望来自世界各个角落的人都可以调用它。但当你的服务器发生熔断,或者你看一看为了获得弹性而为云托管账户支付的费用时,你可能会改变主意。Tollbooth 是一个用于限制传入请求的轻量级系统。限制前门的流量就等于减少了对管道中微服务或数据库的需求,让一切保持运行顺畅。
你只需从头开始编写 Go 代码,不需要导入任何依赖项或者实例化任何控制对象。使用 Go 语言创建微服务其实很容易,因为它已经内置了很多基本代码。这就是为什么只用几百行代码就可以构建出像 Nano 这样的框架。
监听套接字、解压缩 HTTP 请求等工作都是通过标准库完成的。虽然框架提供了一些额外的功能,但很多时候如果你需要一个非常基本的微服务,就不需要用到框架。太多的“附加功能”可能反而会妨碍你,而且 Go 开发人员可能会说,太多的依赖反而让 Go 语言变得更复杂。
https://www.infoworld.com/article/3326530/google-go/20-go-projects-for-mastering-microservices.html
关于微服务的好文章不计其数。但对于那些一直没有亲历微服务或初次听到这个概念的人来说,一份顶级的开源工具清单可能会让他们学习微服务的过程更加事半功倍。你可以在 InfoQ 公众号对话框回复关键词:微服务,获取我们推荐的 30 个用于微服务的顶级工具。
注:请在公众号对话框回复关键词,留言区回复收不到链接哦~
有疑问加站长微信联系(非本文作者)