腾讯亿级用户规模自研业务的上云实践解读,立即报名 了解详情
写点什么

在生产环境用了一个月 Go 语言,我有 4 点体会

  • 2020-11-30
  • 本文字数:1648 字

    阅读完需:约 5 分钟

在生产环境用了一个月Go语言,我有4点体会

最近,我获得了一份 DevOps 工作,工作内容主要涉及用 Go 完全从头开始编写一个新的后端系统。此前,我从未在生产环境使用过 Go,从个人项目中有过了解。


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


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


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


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

  • 日志——我想要某个方案,可以打印每个请求的信息,包含 body params、auth tokens 等等(用于调试目的)。

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

  • 其它常用的中间件——包含 JWT 验证和 CORS。


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


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



我还发现,用echo编写应用程序时有一些比较精简的样板(主要是解析 json body、编写 errors 以及手动设置 headers 等),让代码的可读性有所提高。



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



你需要一个好的代码结构


Go 的 Web 框架(或者一般的 go 项目)不强制任何特定的文件结构。如果你使用过 ASP.NET/ASP.NET Core 之类的东西,当我说一些框架是紧密结构的,而且很多事情都是通过约定而不是显式指定来完成的时,你就会知道我在说什么。


关于 Go 的问题是,你很容易跳过关于构建代码结构的学习,使得代码很难阅读和维护。如果你还不知道我在说什么,下面是我不久前写的一个(糟糕的)Go 端点例子:



你明白我的意思吗?在添加了所有的CreateUserCreateAgency方法后,“更好的”方法很可能会包含更多的行,但是...它以后会非常容易理解、重用、调试和修改,因为每个方法都有单独的用途。如果你还没有明白,我强烈建议你看一看下面关于良好代码结构的资源:



一般来说,这个理念很简单。你应该将与数据库通信的代码与实际的应用程序逻辑本身分开,而且应用逻辑也应该与传输/端点逻辑(在本例中是 HTTP 端点)分开。


明智地选择你的 SQL driver


当我第一次用 Go 开始编程时,我希望尽可能使用最新的库,因此我选择使用database/sql包(使用 Postgres)。虽然这个体验还可以,但在查询数据时,我遇到很多样本,特别是不得不使用 Scan 语法。这导致我有下面 2 个选项:


  • sqlx- 一个基于database/sql的轻量包装器,做了一些扩展,使得做查询更容易。

  • gorm- 一个针对 Go 的 ORM(Object-Relational Mapping,对象-关系映射)库,根据你的 Go models 生成 SQL models 和查询。


我不认为有一个明确的“更好的”库,最终取决于使用场景和个人偏好。


gorm可能会让你轻松一些,特别是如果你经常在修改数据库之后忘记在查询中增加字段的话(因为在 gorm 中,你根本不需要做这些)。


另一方面,sqlx更以 SQL 为中心,它更像是写 Go 代码来调用 SQL 接口,而不是 gorm 方案那样根据 Go 代码生成 SQL。如果你喜欢完全掌控 SQL 并且不必学习 GORM 的新语法,那么这是一个不错的方案。


Docker


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


我见过有人通过 JSON、YAML 甚至 git 忽略的.go 文件来配置应用程序变量。我个人发现 env 文件最好用,特别是配合 docker-compose 使用:




我通常将这些与以下实用的函数结合使用:



用 Go 构建 Docker 镜像也超级简单:



其它?


我还想到了其它一些东西,但我不认为它们值得单独用章节来讨论:



原文链接:


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


2020-11-30 11:524943
用户头像

发布了 162 篇内容, 共 60.6 次阅读, 收获喜欢 326 次。

关注

评论 1 条评论

发布
用户头像
如果专用postgresql的话, ORM建议使用go-pg, 设计的很好, 专用于postgresql.
2020-12-06 10:39
回复
没有更多了
发现更多内容

Pulsar 分级存储 -- S3 演示

Apache Pulsar

大数据 架构 云原生 分布式存储 Apache Pulsar

彻底搞懂访问者模式的静态、动态和伪动态分派

Tom弹架构

Java 架构 设计模式

工具 | 一条 SQL 实现 PostgreSQL 数据找回

RadonDB

数据库 postgresql RadonDB

帧彩视界之Pseudo HDR:为普通SDR设备用户提供HDR体验

微帧Visionular

视频编码 HDR

趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突

热爱java的分享家

Java 架构 编程语言 经验分享 哈希表

Alibaba最新神作!耗时182天肝出来1015页分布式全栈手册太香了

热爱java的分享家

Java 面试 分布式 编程语言 经验分享

又一次漏洞复现与分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

Go语言学习查缺补漏ing Day6

Regan Yue

Go 语言 11月日更

外卖跑腿系统专业开发外卖跑腿app源码开发

风行无疆

行业分析| 为什么uni-app在音视频领域这么火?

anyRTC开发者

uni-app 音视频 移动开发 语音通话 视频通话

元气部落盲盒软件原生开发芒趣盲盒app源码

风行无疆

会声会影编辑面板常用功能介绍

懒得勤快

优秀!阿里甩出GC面试小册,仅7天Github获赞96.9K

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

24 K8S之Service资源及其模型

穿过生命散发芬芳

k8s 11月日更

分区丢失导致文件丢失?巧用EasyreCovery找回!

淋雨

数据恢复

DAS易用性设计

赫杰辉

干货必收藏!墨天轮最受DBA欢迎的250份学习文档合集

墨天轮

MySQL 数据库 oracle postgresql

多商户入驻系统开发多商户入驻app源码开发

风行无疆

TypeScript 之 Typeof Type Operator

冴羽

JavaScript typescript html5 翻译 大前端

pringBoot + Mybatis Plus + ClickHouse增删改查入门教程

程序员万金游

MySQL 数据库 mybatis Clickhouse

秋招拿到offer之后,分享面试阿里、头条、腾讯的经过以及一些总结

Geek_1df311

Java 编程 程序员 架构 面试

为何每次用完ThreadLocal都要调用remove()?

热爱java的分享家

Java 程序人生 编程语言 经验分享

Micro Focus Fortify 最新能力发布,应用安全进入“一切皆代码”新时代

CSS布局(四)之文本布局

Augus

CSS 11月日更

你的web知识有所欠缺。

喀拉峻

Web 安全

【TcaplusDB知识库】什么是TcaplusDB数据库?

数据人er

数据库 腾讯云 TcaplusDB

在牛客逮到一个阿里10年老Java开发,聊过之后收益良多...

Geek_1df311

Java 编程 架构 面试 计算机

如何修复org/jacoco/agent/rt/internal_773e439/Offline异常?

Changing Lin

11月日更

掌握Java的内存模型,你就是解决并发问题最靓的仔

华为云开发者联盟

Java 内存模型 线程 并发 工作内存

艾媒报告:百度输入法AI功能领跑行业 用户满意度第一

百度开发者中心

百度 AI

在生产环境用了一个月Go语言,我有4点体会_语言 & 开发_Dominik Tarnowski_InfoQ精选文章