20个有用的Go语言微服务开发框架(30)

发布于2019-04-21 20:33:48

2007年,谷歌的一个团队在调研计算机编程语言时,发现有数百种可用于开发软件的语言,但没有一种能提供谷歌真正需要的特性。有些语言太过底层,有些又太过复杂,有些特性对他们来说反而会碍手碍脚。谷歌的开发人员想要的语言要简单到可以在几个小时内学会,但又要复杂到足以应付现代互联网的信息流。

他们的解决方案就是Go语言,这门语言对于C语言、Java或JavaScript程序员来说——换句话说,就是所有的程序员——都很容易掌握。Go语言提供了足够的特性来编写循环和代码块,但没有一个特性是需要很长的时间才能掌握的。内置的例程经过优化,可以从互联网获取数据和发送数据。其他的东西——即使是非常聪明的想法——都被排除在外。

Go语言是微服务开发团队的一个很好的选择。即使你的项目可能不需要像谷歌那样向全世界提供电子邮件、地图、搜索和其他云服务,但仍然可能需要向用户提供数十种不同的小型信息服务。

谷歌决定开源Go语言是一个明智之举。这门语言培育了数千个开源项目,这些项目为你的Web项目提供了开箱即用的构建块。这里列出了20个最有趣的开源项目,用于构建基于Go语言的微服务系统。从专注于消息传递、路由、错误处理或API的小工具包,到用于构建MVC Web应用程序的更全面的框架,你将发现,使用Go语言开发微服务有着非常丰富的选择。

Beego

https://beego.me/

Beego框架提供了很多标准附加功能,例如全功能路由器和可用于执行CRUD操作的对象到数据库映射工具。Bee是Beego爱好者的最爱,它是一个快速而强大的命令行工具,用于构建、更新、打包和部署应用程序。Bee可以从模板生成源代码,并保持数据库的最新状态。

Buffalo

https://gobuffalo.io/en

Buffalo团队需要能够将Web应用程序的所有部分组装在一起的东西,包括应用程序本身的一些设计。他们把能够安装在一起的很多部件叫作“生态系统”。如果你想要路由——很少有人不需要——Buffalo就包含了Gorilla/Mux。如果你需要模板,Buffalo倾向于使用Plush,而不是使用内置的Go语言模板机制。数据库连接模块集合Pop可以帮你将数据库信息转换为Go对象。你还可以找到连接数据库、处理cookie以及完成其他任务的标准方法。

Cobra

https://github.com/spf13/cobra

有时候,你只需要一个命令行界面。Cobra提供了CLI的所有标准功能,因此你不必浪费时间实现代码来查找-h或-help标志。如果你的微服务需要对具有大量标志和其他功能的命令行调用做出响应,那么可以考虑集成Cobra。

Docker

你当然可以在办公室服务器小黑屋里的裸机上运行微服务,但越来越多的人将他们的代码捆绑在Docker容器中,并将容器发到云端。小型的包更容易处理大量不同的代码块,当你对微服务架构的愿景要求你创建很多小的独立代码块时,这将是一项有价值的服务。

值得一提的是,Docker是用Go语言开发的,尽管在部署Docker容器时你可能永远不会想到这一点。Docker社区版是开源的,所以如果有必要,你可以参与其中,但很可能你只是将Docker作为部署微服务的工具。Go语言爱好者之所以想要记住Docker是用Go语言开发的这一事实,是因为无处不在的Docker有力地证明了他们对这门语言的支持。

Echo

https://echo.labstack.com/

Echo是一个极简框架,但它提供了很多最重要的组件。路由器可以将URL拆解,然后将拆解的各个部份转换为参数,因此你无需自行解析它们。然后,你可以混合使用身份验证、表单解析、压缩和合理性限制。你可以专注于从函数中返回正确的信息。

Errors

https://github.com/juju/errors

有时候,API的用户会传递错误的参数。你可以自己处理这些参数,也可以把它们创给Errors,这是一个可以自动执行大部分跟踪的库,方便进行调试。当发生错误时,Errors会使用注释来详细说明出错的地方和位置。

Gin

https://github.com/gin-gonic/gin

Gin是Martini(https://github.com/go-martini/martini)的下一代框架。可以说,Gin抛弃了那些额外的东西,专注于提供最有用的部分。花费大量时间构建Node.js微服务的开发人员会感到宾至如归。你可以实例化一个对象,然后附加函数来处理特定的调用,这样就可以创建一个微服务。Gin负责处理路由,而你的函数处理业务逻辑。如果不去考虑标点符号,它的代码甚至看起来有点像Node.js代码。

Ginkgo

https://onsi.github.io/ginkgo/

测试可能是微服务开发当中最具挑战性的事情。Ginkgo通过行为驱动测试扩展了标准Go发行版的内置测试机制。Ginkgo提供了一种高级机制,用于指定函数或服务应该产生哪些结果。结果通常使用Ginkgo提供的Gomega匹配器(http://onsi.github.io/gomega/)进行评估,但如果你愿意,也可以使用不同的匹配器库。

Ginkgo是一个全面的框架,提供了各种选项,用于设置测试数据、运行测试以及在事后释放测试数据。你只需要描述结果,然后让Ginkgo处理其他的事情。

Goa

https://github.com/goadesign/goa

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

Gorilla

http://www.gorillatoolkit.org/

Gorilla项目提供了一系列你需要的模块。Gorilla的Mux(http://www.gorillatoolkit.org/pkg/mux)路由器被很多其他框架使用,因为它太好用了。很多用户之所以使用Gorilla,是因为websocket(http://www.gorillatoolkit.org/pkg/websocket)。

Gotify

https://github.com/gotify/server

同步一组微服务所面临的一个挑战是建立有效的消息传递节点。Gotify是一个简单的服务器,用于发送和接收消息,将你的微服务集合与持续存储的消息组合在一起。最有用的部分可能是它的Web接口,可帮助开发者应对最令人头疼的调试问题。

Hugo

https://github.com/gohugoio/hugo

Hugo是一种静态站点生成器,可以用这个框架构建的微服务并不多,但如果网站只有有限的重复查询答案时,这是一个值得考虑的选项。Hugo一次生成答案,然后可以重复使用。如果你已经已HTML格式提供答案,那么Hugo会非常有用。

Kite

https://github.com/koding/kite

如果你希望建立一个更加可控的服务群体,而不是通常的服务之间的互动,那么可以考虑一下Kite。Kite的目标是让微服务之间的通信协调变得更简单一些。来自Kite以外的API调用通过websocket进入,然后Kite使用更快、更低级别的套接字连接(基于dnode)传递新消息。中间有一个叫作Kontrol的服务注册表和身份验证服务。如果你需要经常交换消息和协调很多的操作,那么在不同服务器之间添加这一层会让一切变得更快。

Logrus

https://github.com/sirupsen/logrus

要跟踪API的流入和流出数据和可能产生的错误,通常需要将日志写入文件中。这个过程可以很简单,比如在一个打开的文件中写入一行行的数据,但通常使用完整的日志框架会更好。Logrus提供了格式化程序来标准化你的日志输出,并让后续的自动化日志文件分析变得更容易。不要尝试自己开发日志代码,使用像Logrus这样的库会事半功倍。

Nano

https://github.com/pasztorpisti/nano

构建一个微服务并不需要太多东西,Nano就是一个极简主义的例子。它的实际代码不会超过200行,如果算上注释也只有400多行。你只需要几行代码就可以构建一个微服务——只包含处理请求所需的业务逻辑。这个框架还有一些其他不错的特性,例如与语言无关的API结构,这样你的Go代码就可以与使用其他语言开发的服务发生交互。它还提供了一个测试过程来,可以嵌入你的本地测试例程。简简单单,但却恰到好处。

Negroni

https://github.com/urfave/negroni

有些人看完Martini后,决定走一条更简单的道路。他们剥离了路由器和其他一些东西,创建了Negroni,这是一个非常小型的工具,除了处理标准文件、自定义请求、从基本错误中恢复以及保留日志之外,它不会做更多的工作。如果你想要额外的东西,可以自己加入。Negroni团队也提供了一系列与可以与Negroni一起使用的小型项目。

Renderer

https://github.com/thedevsaddam/renderer

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

Revel

https://revel.github.io/

Revel借鉴了Webpack的一个简洁的特性,这让Revel看起来就像一个IDE一样,或者至少是IDE的一部分,每当你对代码做出更改,它会持续地重新构建你的项目。当你保存修改后,Revel会检测到更改,然后就编译代码,如果没有编译错误,就启动应用程序。因此,Revel服务器会自动部署修改的码——在桌面上进行开发时这项功能非常好用,或许对于生产环境代码部署来说也是有点诱人的。

这个框架本身功能齐全,它提供了模板、缓存、验证和过滤器。如果你正在构建很多微服务,它还提供了一个模块系统,让你可以在项目之间共享一些MVC组件。

Testify

https://github.com/stretchr/testify

使用断言的最简单方法之一是使用Testify,它是一个Go语言项目,还提供了模拟工具,用于快速测试大型微服务的各个部分。只需要几行代码就编写一些基本测试用例。

Tollbooth

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