在netlify上部署golang web应用

article/2025/11/3 23:04:12

介绍

Netlify是一个专门托管静态文件的云。这使得它非常适合托管开发人员博客、宣传册网站,甚至只是一个个人简历。它甚至内置了对Hugo的支持。但是Netlify也有各种动态托管解决方案,他们的functions服务是托管Go Web应用程序的一种非常简单的方法,而且通常是免费的。

Netlify

GitHub:go-netlify-app

实现

假设我们有一个静态HTML网页,但我们希望在页面上有一个动态填充的信息流。例如,网页本身是静态的,但使用JavaScript从API中提取相关链接。这是在不牺牲包含其他内容的能力的情况下为页面保留较长缓存时间的好方法。理想情况下,我们可以自己部署网页,但无需部署一个定期将链接转储到数据库中的爬虫程序。

举个例子,让我们使用知乎热榜,它来自https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true
,让后端获取我们需要的信息,通过API提供给静态网页。

Go可以很容易地编写一个将JSON格式内容的URL转换为JSON的服务。

package mainimport ("flag""fmt""io/ioutil""log""net/http"
)var (port = flag.Int("port", -1, "specify a port")
)func main() {flag.Parse()http.HandleFunc("/api/feed", feed)log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
}func feed(w http.ResponseWriter, r *http.Request) {url := "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true"method := "GET"client := &http.Client{}req, err := http.NewRequest(method, url, nil)if err != nil {fmt.Println(err)return}res, err := client.Do(req)if err != nil {fmt.Println(err)return}defer res.Body.Close()body, err := ioutil.ReadAll(res.Body)if err != nil {fmt.Println(err)return}w.Header().Set("content-type", "application/json")w.Write(body)
}

如果我们从命令行使用go run myfile.go -port 8000运行它,Go标准包flag将为我们解析-port 8000,并提供一个在8000端口的API。

当我们查看Netlify的文档时,我们发现我们的第一个挑战是他们使用AWS Lambda,而不是普通的HTTP 服务,因此我们要么需要重写我们的服务以使用Lambda,要么找到一个适配器。最好避免将架构与特定的云提供商紧密耦合,因为这会导致难以从平台迁移,因此无需编写不必要的AWS特定代码。

AWS Lambda和Go标准http包之间的适配器已经存在。它们采用AWS Lambda函数使用和返回JSON对象,并将它们调整为正常的Gohttp.Handler调用。

Gateway使在本地开发中试用我们的代码变得容易,而无需启动某种AWS Lambda模拟器。

package mainimport ("flag""fmt""io/ioutil""log""net/http""github.com/apex/gateway"
)var (port = flag.Int("port", -1, "specify a port")
)func main() {flag.Parse()http.HandleFunc("/api/feed", feed)listener := gateway.ListenAndServeportStr := "n/a"if *port != -1 {portStr = fmt.Sprintf(":%d", *port)listener = http.ListenAndServehttp.Handle("/", http.FileServer(http.Dir("./public")))}log.Fatal(listener(portStr, nil))
}package mainimport ("flag""fmt""io/ioutil""log""net/http""github.com/apex/gateway"
)var (port = flag.Int("port", -1, "specify a port")
)func main() {flag.Parse()http.HandleFunc("/api/feed", feed)listener := gateway.ListenAndServeportStr := "n/a"if *port != -1 {portStr = fmt.Sprintf(":%d", *port)listener = http.ListenAndServehttp.Handle("/", http.FileServer(http.Dir("./public")))}log.Fatal(listener(portStr, nil))
}

使用这个版本的代码,如果我们运行go run main.go -port 8000,服务器将在http://localhost:8000
上启动,但如果我们省略一个端口,它将以AWS Lambda模式启动。它还以HTTP模式运行文件服务器,因此我们可以在开发时在浏览器中预览正在处理的静态文件。

接下来,让我们添加一个带有一些基本JavaScript的静态网页:

static/index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Go Web App in Netlify</title>
</head>
<body><h1>知乎热榜</h1><ul id="contents"></ul><script type="module">let options = {weekday: "short",year: "numeric",month: "short",day: "numeric",hour: "numeric",dayPeriod: "short"};const toDate = new Intl.DateTimeFormat("default", options);(async () => {let data = await fetch("/api/feed").then(rsp => rsp.json());let listEls = [];for (let item of data["data"]) {let row = document.createElement("li");let link = document.createElement("a");link.href = item["target"]["url"];link.innerText = item["target"]["title"];row.append(link);let d = new Date(item["target"]["created"]);row.innerHTML += " " + toDate.format(d);listEls.push(row);}let el = document.getElementById("contents");el.append(...listEls);})();</script>
</body>
</html>

至此,开发工作基本完成,现在需要操作Netlify。我们可以通过创建一个简单的构建命令和一个netlify.toml配置文件来告诉Netlify如何使用我们的静态文件和Go函数。

我们可以添加build.sh,告诉Go将我们的二进制文件编译到functions目录中。

set -euxo pipefailmkdir -p "$(pwd)/functions"
GOBIN=$(pwd)/functions go install ./...
chmod +x "$(pwd)"/functions/*
go env

接下来我们的netlify.toml文件指定Netlify应该使用该脚本来构建我们的函数并在functions目录中查看它们。

[build]command = "./build.sh"functions = "functions"publish = "static"[build.environment]GO_IMPORT_PATH = "github.com/surzia/go-netlify-app"GO111MODULE = "on"

由于我们在这个项目中使用Go模块进行依赖管理,我们还需要告诉Netlify将GO111MODULE设置为on,并为Netlify提供一个带有GO_IMPORT_PATH的导入路径,以作为构建Go文件的起点。我们可以在项目根目录中添加一个.go-version文件来指定我们想要的Go版本。

Netlify在/.netlify/functions/binary-name中提供其所有功能。我们可以重写我们的JavaScript以使用它们的URL。但如果可能的话,最好避免与供应商不必要的紧密耦合。

Netlify为我们提供了一个简单的解决方案,那就是他们的URL重写选项。我们可以将其添加到netlify.toml的末尾:

[[redirects]]from = "/api/*"to = "/.netlify/functions/gateway/:splat"status = 200

现在,对/api/*的任何请求都将发送到我们的二进制文件,称为gatewaystatus = 200意味着这应该作为服务器端重写来完成,因此不会有任何客户端重定向。

Netlify每月为我们提供125000次免费函数调用。这对于大约每三分钟一个请求来说已经足够了。作为最终的服务增强,最好通过缓存响应来确保我们不会使用比预期更多的函数调用。Netlify尊重标准的Cache-Control标头。通过添加w.Header().Set("Cache-Control", "public, max-age=300"),我们可以告诉Netlify的CDN每5分钟只向我们的函数发出一次请求,并且在我们网站的所有用户之间共享相同的响应。

结论

Netlify绝对不是托管Go服务的唯一方法,但它是最简单的方法之一。 通过其内置的Github和Gitlab集成,只需将Netlify指向一个存储库,它就会在推送到master时自动部署,并创建Pull Requests的部署预览。如果你只是想快速托管一些东西,而不需要花费几天的时间在环境变量秘密共享、内容交付网络缓存、持续交付等的初始设置上,那么Netlify就是不错的选择。

Netlify

GitHub:go-netlify-app


http://chatgpt.dhexx.cn/article/Y0ySvYLL.shtml

相关文章

利用Netlify/Vercel和Digitalpress搭建免费Ghost静态博客

第一步 先去https://www.digitalpress.blog/申请一个免费的Ghost博客。 当然你可以用自己的主机&#xff0c;或者digitalocean免费的学生包。只要是Ghost就可以。 第二步 注册Netlify或者Vercel(两个都可以&#xff0c;自己挑选,我自己测试Vercel链接更快) 自行测试&#…

NET Framework

NET Framework 是一个可以快速开发、部署网站服务及应用程序的开发平台&#xff0c;是 Windows 中的一个组件&#xff0c;包括公共语言运行时&#xff08;Common Language Runtime, CLR&#xff09;虚拟执行系统和 .NET Framework 类库。 .NET Framework 的特点如下。 提供标准…

使用Netlify部署博客

文章目录 github 项目部署自定义域名 原先博客是部署在 githubPages 上的&#xff0c;稍微设置一下就能实现自动化部署和启用 https&#xff0c;还是蛮方便的&#xff0c;但是使用国内网络访问 githubPages 上部署的网站速度太慢了&#xff0c;体验很差&#xff0c;因此&#x…

如何下载.NET Framework

下载网址&#xff1a; https://dotnet.microsoft.com/zh-cn/download/dotnet-framework 登录网址 选择适合的版本&#xff0c;如果你的版本太低可能要多尝试一个版本是否能够安装成功

【2022年】的网页转 App 教程

● 如何将网站转为 App&#xff1f; 使用 HopWeb 可以毫无技术成本的制作属于你的App。 HopWeb 官方网站&#xff1a;https://atreep.netlify.app/hopweb ● 网站转 App 适用于以下类型的网站&#xff1a;个人博客、工具类网站等 ● 本教程将以【百度】网站为例&#xff0c;引…

通过Netlify制作个人网站

个人主页的创建 本文主要介绍个人主页的创建过程&#xff0c;主要通过知乎回答的指导&#xff0c;参考本人制作的个人主页。 本人个人主页制作主要使用Netlify&#xff0c;参考该网站安装教程进行安装&#xff0c;直接在自己的github中创建一个仓库作为网站节点。在安装过程中…

【经验】静态博客部署 Hexo + Netlify-CMS + Vercel (在线构建)

目录 引入背景方案 步骤生成starter模板添加Netlify CMS在线管理添加Netlify身份验证组件启用git gateway身份验证换用Vercel作为CDN重新添加js添加身份验证器绑定oauth 定制404页面 模板已知问题 引入 背景 Hexo等静态博客相对于Wordpress等动态博客&#xff0c;可以白嫖很多…

.net framework 官方下载地址

.net framework 官方下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet-framework

使用Netlify部署静态网站

之前写了一篇文章是关于在树莓派上部署Hexo的博客&#xff0c;但树莓派难免会出故障&#xff0c;所以将网站放在另一个地方会更安全一点。 前一篇&#xff1a;https://fitswcblog.com/%E6%A0%91%E8%8E%93%E6%B4%BE%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/ 我在csdn上的所有…

123.HTML5+CSS3完结_使用Netlify收取表单

Netlify也可以做表单接受&#xff1a; 我们启动一下 修改下表单 ● 接着在我们的网站输入并提交表单 ● 之后会有一个提示&#xff0c;提示我们提交成功 然后就能在Netlify接受到用户的表单 ● 当然这个表单只能接受100个&#xff0c;但是作为实验也够用了 到此&a…

第七章:使用Netlify零成本部署组件文档

第七章&#xff1a;使用Netlify无成本发布组件文档 为什么使用Netlify&#xff1f; 一开始一共有三个方案&#xff1a; 1、Github Page 2、Netlify 3、Vercel Github Page只支持一个repo发布一个网站&#xff0c;而我们的项目是一个mononrepo项目&#xff0c;后续可能还有其他…

React项目全球新闻发布管理系统 - 新版问题解决方式整理及部署网站至 Netlify

整理了一下新版的变化以及遇到的坑的解决办法&#xff0c;最后也会分享将网站及接口部署的方式。 千锋前端-React全家桶_React项目全球新闻发布管理系统 https://www.bilibili.com/video/BV1fw411d7R5 文章目录 P4P5P6P11P15P17P18P22P29P30P34P38P41P43P45P50P67进阶: 多语系网…

Coolify系列01- 从0到1超详细手把手教你上手Heroku 和 Netlify 的开源替代方案

什么是Coolify 一款超强大的开源自托管 Heroku / Netlify 替代方案coolLabs是开源、自托管和以隐私为中心的应用程序和服务的统称 为什么使用Coolify 只需单击几下即可托管你的应用、数据库或其他开源服务&#xff0c;等。它是 Heroku 和 Netlify 的一个替代方案。通过 Cool…

.NET Framework 框架

20世纪90年代以来出现的3种典型的组件技术&#xff1a; 1&#xff09;OMC&#xff08;对象组件模型&#xff09;的CORBA 2&#xff09;Microsoft的COM/DCOM 3&#xff09;Sun公司的JavaBeans 在2002年&#xff0c;微软发布了.NET框架的第一个版本&#xff0c;声称其解决了旧问…

vercel和netlify部署代码并解决接口代理转发的问题(和Nginx功能一样)

前言 部署过程就不说了,部署完成后是这样子的 然后访问链接,无法访问 解决 依次点击 Settings–>Domains&#xff0c;在输入框中输入你的域名并点击 Add 按钮。 以此域名为例子demo.gshopfront.dreamlove.top为例,点击添加 我们前往域名管理系统,记录下绿色的值以腾讯云的…

部署Netlify站点博客

Netlify站点部署静态博客 今天尝试把站点部署在Netlify上&#xff0c;因为部署在GitHub Pages上&#xff0c;国内访问速度太慢了&#xff0c;所以就尝试一下别的站点&#xff0c;部署成功之后发现速度还是不太行&#xff0c;后边继续找找原因 Netlify 部署的地址在这里 下图…

使用Hexo+github+netlify快速搭建个人博客网站

1 写在开头 倒腾了好几天&#xff0c;算是做出了一个有点样子的个人博客网站。便学各位大佬也写一个搭建教程&#xff0c;总结一下个人踩坑经验&#xff0c;也希望能对他人略有作用。 博客演示&#xff08;欢迎来留言交流&#xff09; 为什么选择Hexo&#xff1f;答&#xff1…

使用 netlify 部署你的前端应用

我前几天写了一篇文章&#xff0c; 如果你想搭建一个博客 &#xff0c;其中提到了使用 netlify 做博客托管服务。 netlify 可以为你的静态资源做托管&#xff0c;就是说它可以托管你的前端应用&#xff0c;就像 github page 那样。不过&#xff0c;它不又只像 github page 那么…

netlify国内快吗

Netlify国内快吗? Netlify vs 21云盒子 Netlify 是一家提供 JamStack(静态网站)托管的平台&#xff0c;支持自动从Github等仓库拉取代码, 按自定义构建方式进行构建&#xff0c;最后把生成的静态网站进行发布; 在这基础上同时也支持自定义域名&#xff0c;自动申请SSL证书等…

Netlify前端自动化部署工具

一、使用github或者gitlab登陆netlify 首先&#xff0c;打开netlify网站(https://app.netlify.com/) 然后使用github或者gitlab账号登录。 二、根据github/gitlab仓库创建网站 点击New site from Git按钮&#xff1a; 根据你的仓库所在平台选择&#xff0c;以下三选一&#x…