当前位置:江苏数码科技 >> 科技 >> 文章正文

在制作环境下使用Go语言一个月 有四次经验

发布于:2020-12-02 被浏览:2824次

作者|张秀坤塔诺夫斯基

翻译|张建新

策划|万佳

最近找了一份DevOps的工作,主要是用Go从头开始写一个新的后端系统。之前在生产环境中没用过Go,从个人项目中学习过。

一个

你应该(可能)使用一个网络框架

一开始我们决定只用Go的http库和一个简单的路由库——mux。

然而,我很快就遇到了现实生活中的生产问题:

恢复中间件——用于日志打印和静默处理程序代码中的死机。

日志——我想要一个可以打印每个请求的信息的方案,包括主体参数、授权令牌等等(为了调试的目的)。

更好的错误处理——我希望错误仍然是JSON响应,带有错误信息和代码。

其他常用的中间件——包括JWT认证和CORS。

我有两个选择:自己解决上面的问题,或者针对每个问题使用不同的第三方库,或者选择一个Web框架,这些事情基本上大部分(如果不是全部)都做了。

我最终决定用Echo作为Web框架。据悉,它在GitHub这个非常活跃的社区和优秀的文档上拥有近2万个赞。我认为这是完成这项工作的一个很好的工具。

我也发现用echo写应用的时候有一些简洁的模板(主要是解析json body,写错误,手动设置头等等。),提高了代码的可读性。

然而,当您有一些复杂的端点时,您会注意到生产率的真正差异。您经常需要验证一些JSON字段,并且您需要有意义的错误信息来描述错误。如果您想在不使用任何库的情况下做到这一点,您的代码很快就会变得难以阅读:

2

你需要一个好的代码结构

围棋的网络框架(或一般围棋项目)不强制任何特定的文件结构。如果你使用过像ASP.NET/ASP.NET核心这样的东西,你就会知道我在说什么,当我说一些框架是紧密结构化的,许多事情是通过约定而不是显式赋值来完成的。

Go的问题在于,您可以轻松跳过构建代码结构的学习,这使得代码难以阅读和维护。如果你不知道我在说什么,这里有一个我不久前写的(不好的)围棋端点例子:

你明白我的意思吗?在添加了所有的创建用户和创建代理方法之后,“更好的”方法可能会包含更多的行,但是.将来理解、重用、调试和修改会非常容易,因为每个方法都有自己的目的。如果您不理解,我强烈建议您查看以下关于良好代码结构的资源:

https://github.com/ribice/gorsk-'s基本休息应用编程接口的好例子

https://github.com/bxcodec/go-clean-arch-也是REST应用编程接口的一个例子,但它严格遵循“清洁建筑”的概念

总的来说,思路很简单。您应该将与数据库通信的代码与实际的应用程序逻辑本身分开,应用程序逻辑也应该与传输/端点逻辑(在这种情况下是HTTP端点)分开。

明智地选择您的SQL驱动程序

第一次开始用Go编程的时候,我想尽可能使用最新的库,所以选择了使用database/sql包(使用Postgres)。虽然这种体验还可以,但是查询数据的时候遇到很多例子,尤其是不得不使用Scan语法。这使我有以下两个选择:

Sqlx-,一个基于数据库/sql的轻量级包装器,已经做了一些扩展,使它更容易查询。

Gorm——一个面向围棋的orm(对象关系映射)库,它根据你的围棋模型生成SQL模型和查询。

我觉得没有明确的“更好”的库,最终还是要看使用场景和个人喜好。

Gorm可能会让您更容易,尤其是如果您在修改数据库后经常忘记向查询中添加字段(因为在gorm中,您根本不需要这样做)。

另一方面,sqlx更以SQL为中心,更像是写Go代码调用SQL接口,而不是像gorm方案那样根据Go代码生成SQL。如果你喜欢对SQL有完全的控制权,不用学习GORM的新语法,那么这是一个很好的解决方案。

码头工人

我的一个挑战是配置这个项目的生产环境。开发环境和生产环境之间总是有一些差异,例如应用程序运行在哪个端口上,数据库的主机和凭据,等等。

我见过人们通过JSON、YAML甚至。go文件被git忽略。就我个人而言,我发现env文件是最适合使用的,尤其是对于docker-compose:

我通常将这些与以下实用功能一起使用:

使用Go构建Docker映像也非常简单:

其他?

我还想到了其他一些事情,但我认为它们不值得在单独的章节中讨论:

围棋中的命名返回

有效围棋

围棋模块

https://tdom.dev/go-in-production

今天的推荐

标签: 代码 你的 如果你