- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章选择 Go API 框架时要考虑的四件事由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家好,我是程序员幽鬼.
用 Go 编写 API 服务,许多语言新手问的第一件事是:“我应该使用哪个框架?”.
那些来自 Ruby 或 Python 等语言的人可能熟悉大多数开发人员(例如 Rails、Django 或 Flask)使用的单一 Web 框架。Go 有点不同,因为实际上没有一个框架是社区中最受欢迎的。虽然有几个可用的框架,其中许多框架我将在这篇文章中讨论,但 Go 社区似乎并没有就构建 API 服务时的“首选”框架(如果有的话)达成一致.
虽然我不会在这篇文章中比较或推荐任何特定的框架,但我将尝试通过介绍为 Go 中的下一个 API 项目选择框架时应该考虑的四个关键事项给你参考.
在尝试确定在 Go 中构建 API 后端服务时应该使用哪个框架时,你应该问自己的第一件事是,你是否需要一个框架?
Go 标准库非常棒,它提供了许多开箱即用的世界级 API 所需的组件!我在 Go 中架构和构建了一项服务,该服务仅使用 Go 标准库 + router/mux 即可每天处理数百万个请求.
两个最流行的 routers 是:
这两个库都提供基于 URL 主机、路径、headers、HTTP 方法和查询值等内容的快速请求路由,同时允许你定义自己的“自定义”匹配器.
这些 routers 比内置的 http.ServeMux[3] 提供更好的体验,因为它们允许将你的请求路由到不同的处理程序,而无需复杂的if 或 switch语句块,例如:
Eli Bendersky 有一个很棒的系列[4],在 Go 中构建 REST API,首先从标准库开始,然后引入路由器(例如 gorilla[5] 或 chi[6]),最后切换到使用完整的 Web 框架。本系列展示了完全坚持使用标准库的一些缺点,以及额外的库(例如上面的两个路由器包)如何非常有用.
虽然这两个 routers 都带有中间件,用于处理基本身份验证、CORS 协商、请求日志记录等内容,同时还允许你轻松集成自己的路由器,但它们仍然不是框架.
如果你的 API 足够简单,或者特别是如果你或你的团队刚刚开始使用 Go,我建议从仅使用标准库 + 路由器/多路复用器开始,在使用完整框架之前,看看能使用多久。这种方法将使你能够学习基础知识,而不会被更复杂框架的细微差别所困扰.
如果你决定仍希望为新服务使用 Web 框架,有几个较流行的选择,包括:
这些项目可以被描述为完整的 Web 框架,因为它们处理的不仅仅是路由和中间件。它们为服务的其他方面提供内置和预配置的功能,例如:
如果你只想开始编写应用程序的业务逻辑而不担心其中的一些实现细节,这将非常有用,但它确实有代价:你极大可能被框架的选择所困扰。不喜欢 echo[10] 格式化日志的方式?想要使用与 buffalo[11] 选择的路由器不同的路由器?
我并不是说在使用这些框架时交换依赖项是不可能的,但是这可能会很困难,因为框架的全部意义几乎就是为你做出这些选择。如果你或你的团队对框架选择的依赖项感到满意,那么它可能非常适合你的场景,事实上,它可以提高生产力。但是,如果你是喜欢选择依赖项并不时调整或更换它们的个人或团队类型,你可能很快就会发现框架不是你的最佳选择。也就是说,你喜欢 DIY~ 。
GitHub 上项目的未解决 issue 数量以及项目维护人员对这些 issue 和 PR 的响应程度也是需要牢记的重要“软”指标。虽然有大量未解决的 issue 并不一定意味着项目不好,但这可能意味着某些功能或内部工作不清楚并且没有尽可能地记录.
**注意:**情况并非总是如此,因为这也可能意味着该项目正在获得动力,人们对贡献新功能感到兴奋。打开 issue 和 PR 以了解项目发生的情况.
但是,如果项目维护者似乎与社区没有建立良好的关系,或者他们不经常对问题或讨论做出回应,这可能意味着你可能会发现自己正在等待答案或错误修复被合并你选择那个特定的框架。GitHub 有点被忽视的 pulse 视图[12]可以帮助显示项目的活跃程度以及 issue 打开和关闭的频率.
大多数流行的框架也会有一个专用的 Gitter、Discord 或 Slack,因此也可能值得一试,看看社区对新手有多大帮助.
最后,将你选择的框架的流行度与其他框架进行比较可能是值得的,因为流行度下降可能意味着随着社区转向另一个解决方案,该项目可能会被放弃或停滞不前。虽然 GitHub 上的星星数量是项目受欢迎程度的一个不错的指标,但这并不能告诉你趋势如何像谷歌趋势搜索那样变化。这是一个谷歌趋势搜索的例子,比较了过去一年美国对 golang echo 和 golang buffalo[13] 的兴趣.
Golang Echo vs Golang Buffalo search trends 。
在 r/golang[14] 上搜索你选择的框架也可能会给你与社区中其他人对项目的有用性和潜在未来的一些不同意见.
虽然这不是完全证明,也没有人知道未来,但是如果框架开始消亡或仍然强大,这种策略以及如上所述观察项目的脉冲应该会给你一个相对好的想法。如果你代表你的团队为工作项目选择框架,这一点尤其重要,因为我们中的许多人都处于不幸的境地,不得不维护构建在不再收到任何错误修正或安全性的框架之上的应用程序更新.
还值得查看框架的文档,看看它是否是最新的,以及是否有任何最近发布的使用相同框架和主要版本的教程。如果没有人在网上写它,这可能表明它不像以前那样好.
这是选择标准库而不是第三方框架的优势所在,因为标准库永远不会消失,也不会发生太大变化.
总结一下,我认为框架作者过度[15] 推崇的[16]一个“功能”是性能。虽然性能很重要,但我不认为选择一个 web 框架主要是因为它是“性能”最好的,尤其是在 Go 中。Go 已经非常快了,你的框架代码很可能不会成为应用程序的瓶颈。在你需要开始分析和优化你的框架之前,数据库、网络或仅仅是自己的应用程序代码通常会成为你的服务性能问题的根源.
虽然知道你选择的框架比另一个框架更快,这可能会让人感觉很好,但快 10ms,你的用户可能永远不会注意.
简而言之,选择适合你或你团队的框架(或不选择),因为没有适合所有人的“正确”答案。如果你决定确实要使用一个框架,我建议你至少选择两个并在两者中实现相同的简单 CRUD API,以查看你更喜欢哪个.
你同意还是不同意这篇文章中的观点?你和你的团队尝试过哪些框架?你最喜欢哪一个,为什么?
原文链接:https://dev.to/markphelps/4-things-to-consider-when-choosing-a-go-api-framework-4bei 。
参考资料 。
[1]gorilla/mux: https://github.com/gorilla/mux 。
[2]chi: https://github.com/go-chi/chi 。
[3]http.ServeMux: https://pkg.go.dev/net/http#ServeMux 。
[4]很棒的系列: https://eli.thegreenplace.net/2021/rest-servers-in-go-part-1-standard-library/ 。
[5]gorilla: https://github.com/gorilla/mux 。
[6]chi: https://github.com/go-chi/chi 。
[7]echo: https://github.com/labstack/echo 。
[8]gin: https://github.com/gin-gonic 。
[9]buffalo: https://github.com/gobuffalo/buffalo 。
[10]echo: https://github.com/labstack/echo 。
[11]buffalo: https://github.com/gobuffalo/buffalo 。
[12]pulse 视图: https://github.com/gin-gonic/gin/pulse/monthly 。
[13]golang echo 和 golang buffalo: https://trends.google.com/trends/explore?geo=US&q=golang%20echo,golang%20buffalo 。
[14]r/golang: https://www.reddit.com/r/golang 。
[15]过度: https://github.com/gin-gonic/gin#benchmarks 。
[16]推崇的: https://github.com/labstack/echo#benchmarks 。
原文链接:https://mp.weixin.qq.com/s/bgK6P9TgCX-osZncxsrK9Q 。
最后此篇关于选择 Go API 框架时要考虑的四件事的文章就讲到这里了,如果你想了解更多关于选择 Go API 框架时要考虑的四件事的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我一直认为使用“if”比捕获异常要好得多(就性能而言)。例如,这样做: User u = Users.getUser("Michael Jordan"); if(u!=null) System.
我正在尝试使用下一个格式将字符转换为日期。我有下一个数据框 i (我在最后添加了 dput() 版本的数据框): Date 1 Dec_28_2012_9:
考虑到 PHP 中的日期戳,我如何计算持续时间?我在日期之间使用的日期格式是“Y-m-d H:i:s”, 我的工作代码只能计算时间之间的持续时间而不考虑日期。 下面是我的代码: $assigned_t
我正在尝试解释 GLMM 中的自相关。我的响应变量是 bool 值,它表示一组 hive 的生命周期中是否存在 en 事件。我试图用一组描述每个巢状态的数值变量来预测此类事件的概率。因此,我在广义模型
我对如何解释 undefined variable 感到有点困惑(我不确定你现在是否可以)。我正在尝试使用以下代码底部附近的 if else 语句(已注释掉的行)。 这个想法是,如果请求歌曲的人不是与
Bjarne Stroustrup 的 The C++ Programming Language Fourth Edition 中的以下内容是什么意思? "Consider . (dot) suspe
我想要一个主元素,边 block 漂浮在它的右侧。我不知道边 block 的数量,也不知道它们的最终总高度。但是我的主要元素应该具有相同的高度(请参阅以下示例以更好地理解),而无需使用列。 (虚线部分
我在每个 TextView 上都有以下警告(来自 Lint),在我的 XML 中有一个 ID。 Consider making the text value selectable by specify
目前,我有 6 条曲线,以 6 种不同的颜色显示,如下所示。 这 6 条曲线实际上是由 一个相同实验 的 6 次试验生成的。这意味着,理想情况下它们应该是相同的曲线,但由于噪声和不同的试验参与者,它们
winner of a recent Wikipedia vandalism detection competition建议可以通过“检测考虑到 QWERTY 的随机键盘点击来改进检测键盘布局”。 示
多年来,我一直在编写 C 语言,主要是在嵌入式环境中,并且对指针有一个非常好的心智模型——我不必明确地考虑如何使用它们,我对指针算法 100% 感到满意,指针数组,指针指针等。 我写的 C++ 很少,
我正在使用 Boost.Date_time 来获取两个日期之间的时差。我希望代码在这些天也考虑夏令时的变化,并给我正确的时间间隔。 考虑这个例子。 2015 年 11 月 1 日,美国的 DST 将发
我有一个(人类)名字的向量,全部用大写字母表示: names <- c("FRIEDRICH SCHILLER", "FRANK O'HARA", "HANS-CHRISTIAN ANDERSEN")
我想呈现一个表单小部件。这是我要生成的原始 HTML: 使用这个: {{ form_row(form.email, { 'type' : 'email', 'attr' : { 'class' :
我正在开发一个 python 项目,它使用 pythonnet 和几个 C# dll 作为依赖项。 由于我不想将 dll 推送到 git 存储库,因此我调整了 .gitignore 文件。但是,现在
考虑到上午/下午,我想将字符串转换为 php 数据时间。 我想将 '03/06/2015 12:17 am' 转换为 php datatime。 我试过了, $myDateTime = DateTim
我想排除那些具有相同标题和同一年份的实例。 title votes ranking year 0 Wonderland 19 7.9 1931 1
例如对于一个 EditText,通常指定 android:inputType="numberDecimal"用于文本字段应该包含十进制数。但这假设“。”用作小数点分隔符,在某些国家/地区使用“,”代替
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
作为练习,我决定学习 Java 中的 lambda 表达式。我想重写我发现笨拙且冗长的旧代码。它检查命令行参数是否是(1)文件路径或(2)目录路径。在(1)场景中,它将命令行参数传递给方法。在 (2)
我是一名优秀的程序员,十分优秀!