一个小小的 Go 应用如何为我支付房租:给构建者的实用指南

这篇文章介绍了一个作者使用Go语言开发的、代码量不到300行的后端服务,该服务提供PDF发票生成API。作者详细阐述了该应用的构建方式、选择Go的原因、如何实现货币化以及安全和部署策略。它强调了小型、专注的软件也能带来可观收入的理念。

一个小小的 Go 应用如何支付我的房租:一份给开发者的实用指南

并非所有成功的软件都必须是一个庞大的平台或一个完整的软件即服务产品。事实上,一些最悄然盈利的工具是小巧、专注的,并且只构建了足够的功能来很好地解决一个特定问题。

在这篇文章中,我将带你了解一个使用 Go 构建的小型后端服务。它是在一个周末内创建的,代码行数不到 300 行,并且每月持续带来 1,500 到 2,000 美元的收入。这足以支付我的房租。我将解释这个应用程序是做什么的,它是如何构建的,为什么 Go 是正确的选择,以及你如何构建并实现类似产品的商业化。

应用程序实际做什么

最简单来说,这个应用程序是一个创建 PDF 发票的 API。就是这样。

它是为那些需要一种快速、轻量级方式从自己的系统中生成发票的人而构建的。这包括自由职业者、小型机构和内部业务团队。大多数现有选项要么功能臃肿不必要,要么需要设置完整的用户账户。我想要一个简洁易用的东西。

这个小应用程序之所以成功,原因如下:

  • 它解决了一个非常具体且常见的问题
  • 它极其轻量且易于维护
  • 它提供了一致的价值,人们愿意为此付费

为什么我选择 Go

应用程序的第一个版本是用 Node.js 编写的,但我最终切换到了 Go,事实证明这是一个正确的决定。

以下是 Go 适合这类项目的原因:

  • 它编译成一个单一的可执行文件,这使得部署极其简单
  • 它速度快且内存占用少
  • Go 拥有内置的并发模型,易于使用并避免了许多典型的运行时问题

切换到 Go 后,应用程序的内存使用量减少了约 70%,冷启动速度提高了近 90%。对于经历流量高峰的 API 来说,这种性能提升意义重大。

应用程序的结构

整个应用程序只包含几个文件:

invoice app
├── go.mod
├── main.go
├── handler.go
└── generator.go

让我们分解一下每个文件的作用。

1. go.mod

module pdfapi
go 1.21
require (
    github.com/jung kurt/gofpdf v1.16.0
)

这定义了 Go 模块并包含了 PDF 生成库。

2. main.go

package main

import (
    "log"
    "net/http"
)
func main() {
    http.HandleFunc("/invoice", invoiceHandler)
    log.Println("Listening on port 8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatalf("Server error: %v", err)
    }
}

这设置了一个基本的 HTTP 服务器来监听请求。

3. handler.go

package main

import (
    "net/http"
)
func invoiceHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
        http.Error(w, "Only POST allowed", http.StatusMethodNotAllowed)
        return
    }
    generatePDF(w, r)
}

这处理 API 请求并将其路由到 PDF 生成器。

4. generator.go

package main
import (
    "net/http"
    "github.com/jung kurt/gofpdf"
)
func generatePDF(w http.ResponseWriter, r *http.Request) {
    pdf := gofpdf.New("P", "mm", "A4", "")
    pdf.AddPage()
    pdf.SetFont("Arial", "B", 16)
    pdf.Cell(40, 10, "Invoice")
    w.Header().Set("Content Type", "application/pdf")
    pdf.Output(w)
}

这会创建一份简单的 PDF 格式发票并将其发送回客户端。

我如何从中赚钱

像这样的工具可以在不将其变成一个完整的商业产品的情况下实现商业化。以下是一些有效或可能有效的简单策略:

  • 根据用户生成发票的数量收费
  • 提供月度计划,增加使用限制和分析等额外功能
  • 允许其他企业以自己的品牌将 API 集成到其平台中

因为这个应用程序解决了一个特定问题并且做得很好,所以用户理解其价值并愿意为此付费。

保持安全

即使是小型工具也需要坚实的安全基础。以下是我关注的几点:

输入验证

始终验证用户输入,尤其是在生成文件时。

if err := r.ParseForm(); err != nil {
    http.Error(w, "Invalid input", http.StatusBadRequest)
    return
}

速率限制

基本的速率限制有助于防止滥用并保护你的服务器免受不必要的负载。

安全传输

所有流量都通过 HTTPS 提供服务。我使用像 NGINX 这样的反向代理,并使用 Let’s Encrypt 管理证书。

身份验证

如果有人付费使用 API,他们会获得一个限制访问的密钥,必要时可以撤销。

保持依赖项更新

我定期使用 govulncheck 等工具扫描第三方包,以识别任何已知的漏洞。

部署与维护

这个应用程序易于部署,并且无需太多关注即可顺利运行。我使用的工具是:

  • Docker,用于在开发和生产环境中保持环境一致
  • GitHub Actions,用于自动化测试和部署
  • 轻量级监控工具,用于跟踪正常运行时间和使用情况

一旦它运行起来,它基本上就能自己维护。

对创始人与开发者的重要经验教训

构建这个应用程序教会了我一些重要的经验教训,它们适用于任何类型的产品:

  • 专注于清晰完整地解决一个特定问题
  • 不要等待完美。尽早发布并迭代
  • 保持你的架构和工具尽可能简单

你不必构建庞大或复杂的东西来创造价值。如果小应用程序有目的且专注地构建,它们绝对可以产生可观的收入。

最终想法

这个小小的应用程序最初只是一个周末项目。现在它支付我的房租,并在后台默默运行。无需全职维护。没有庞大的代码库。只是一个简单、有用的工具,把一件事做好。

如果你是一位创始人或开发者,正在寻求创造额外收入或白手起家创业,这就是一个提醒:小而专注的软件可以带来巨大的不同。你不需要庞大的团队或资金。你只需要一个清晰的问题和一个能提供解决方案的方案。

如果你正在开发类似的东西,或者需要帮助构建安全可扩展的后端系统,我的 Ancilar 团队可以提供帮助。我们专注于将想法转化为可靠的生产级 API 和基础设施。

让我们帮助你将产品变为现实。

如果你认真考虑长期发展,我们随时准备提供帮助。

邮箱: hello@ancilar.com

网站: https://www.ancilar.com

  • 原文链接: medium.com/@ancilartech/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ancilartech
ancilartech
江湖只有他的大名,没有他的介绍。