Custom Container 运行环境下的 Gin 自动部署

简介: 借助 Serverless Custom Container 的容器运行时优势,比 s 更便捷的方式把存量业务搬上 Serverless.

又是没找到工作的一天,所以又开始尝试一些新东西,这篇文章讲在阿里云 Serverless 架构的 FC 产品,Custom Container 环境下如何跑起 Gin 应用。

Serverless 架构一开始是在腾讯云的 SCF 先接触的,我的博客涉及到 Serverless 的文章应该说是非常多的,近年来也越来越多的人开始进行更多的接触,把更多的业务放上来。一开始我们更多是依赖厂商对特定语言预制好了的环境,比如 Node 、 PHP 这些热门的,但这些版本是固定的,而且你要是想增加一些底层依赖库其实是很麻烦的。

然后又出现了 Custom Runtime 来更好解决这个问题,但是阿里云提供的 Funcraft 工具,我是没跑通官方迁移文档中的 Laravel 、 ThinkPHP 迁移流程,后面排查是 FC 语言提供的默认环境和用 Funcraft 的不一样,少了很多底层依赖库,要自己加进去也麻烦,所以我就放弃了,哈哈哈。阿里云现在又抛弃了这个 Funcraft 工具,开始推 Serverless Devs,然后这个工具的压测功能我也是没跑起来,继续使用 wrk,哈哈哈。

Custom Runtime 其实可以让我们更好去做一些业务,比如我最近做的 反代 ,部署在香港地域,nginx 代理到指定的网站,比如 GitHub 、GitHub API 等,现在支持了很多常用域名。其实做这个是非常简单的,nginx 判断二级目录是不是支持的域名,然后 proxy_pass 过去,写一个 Dockerfile + nginx.conf 就可以了。

我之前这方面也写过一篇 文章 的,因为我要借助 Funcraft 来生成 nginx 环境的那些文件,所以整体流程其实是非常麻烦的,而且最重要的是,那个方法现在已经不行了,没仔细去排查,应该是后面版本迭代升级了然后影响到了,我自身没有去控制好版本号。

用 Custom Runtime 来完成反代需求,呈现的效果是非常棒的,让我对这块有了不一样的期望,那就是能不能把整一个应用更便捷部署上来。

Custom Runtime 有什么优势呢?

  1. 容器镜像,可以更好的实现我们业务的运行环境,不过 FC 不支持多阶段构建,go 的 Dockerfile 都是编译后,就放在 scratch 中去跑,但测试后发现是不行的。
  2. 低成本迁移,因为我们可以用 Dockerfile 来构建环境。
  3. 镜像加速,实例的镜像拉取可能是通过已启动的实例,不是每次都走源站,相当于启动速度会快很多,毕竟不支持多阶段构建,编译后基本都 200M+ 了。
  4. 自动部署,在控制台配置好后,监听到代码仓库的变化,自动进行构建后部署到 FC。
  5. 权限,不需要向之前打包一样,还是在 linux 下加上执行权限然后再打包。

业务的灰度是实现不了的,但可以做测试环境、生产环境的区分,相当于两个函数去监听两个不同的分支。


接着我们来简单的部署一个,Gin 官方的 Demo 稍微改一下,我们在代码中要写死监听端口的,经过打印 env 的排查,这边 FC 是没有在环境变量中提供 FC_SERVER_PORT 的。

main.go

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "pong",
        })
    })

    err := r.Run(":9000")

    if err != nil {
        return
    }
}

Dockerfile

FROM golang:1.18-alpine as build

# 时区
RUN apk --no-cache add tzdata

ENV TZ=Asia/Shanghai

WORKDIR /code

COPY go.mod go.sum ./

# 下载依赖
RUN go mod download && go mod verify

COPY . .

# 编译
RUN env GOOS=linux GOARCH=amd64 go build -o main main.go

EXPOSE 9000

# 执行
CMD ["./main"]

部署流程:

页面最底部我放了完整的源码,可以先去下载。下载完成后,上传到代码托管平台。

到阿里云的容器镜像服务,有个人免费版的,创建一个镜像仓库。

填写基本的信息。

设置代码的来源。

进入镜像仓库,配置下触发编译的分支。

填写触发信息。

手动进行一个触发。

好家伙,报错了,可以上代理或者使用海外编译,dddd。

开启海外编译模式。

编译完成了,共花费 82 秒。

开始进入 FC 流程,创建一个容器镜像类型的,接着选择我们的容器镜像仓库。

可以看到,因为不支持多阶段构建,所以还是比较大的。

来触发器看一下请求的链接。

发起个请求看看,成功了。

如果你的程序涉及一些静态文件,比如 HTML 模板,可以了解下 embed。

其实 Serverless 或者上云,其实还是有很多需要注意的,那就是不要对某一个云厂商的某一个产品依赖太严重,要考虑下如果后期换云会怎么样。

南极哥:厂商提供的 MySQL ✔,厂商提供的 AliSQL/TDSQL ✘

厂商提供的这些产品是非常棒的,但最怕如果它 GG 了,或者我们要换一个云,没有替代品,那我们的重构成本是多少了。

比如最近微信群传的,微信小程序云开发的费用可能会提升很多,但云开发对特供提供的分发依赖是非常强的,相当于你抛弃云开发,你只能重新重构,所以我一直很抗拒这种,包括后面出的云托管。

可能在有些方面,我们不是当前最流行的,但企业应用,我们不是要让我们的业务存在更多的可控性嘛,不能意味的追求牛逼、高大上、最先进的架构,而忽略了出现故障之类的时候,我们有没有能力及时处置、及时降低我们的业务损失。


源码

原文发布于:https://www.hongfs.cn/2022/07/go/gin/fc-custom-container-automatic-deployment-of-gin-in-the-runtime-environment/

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Android开发 开发者
苹果开发者账号申请教程
登陆苹果官网注册账号 点击地址https://developer.apple.com/account/进入苹果官网 如果没有账号可以点击'Create Apple ID'进行账号注册,输入需要的信息后点击'continue'按钮进入网站 因为我已经有账号,所以直接点'Sign In'登陆进入网站 .
11192 0
|
4月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
191 1
【果蔬识别系统】Python+深度学习+人工智能+算法模型+图像识别+2026原创
|
9月前
|
人工智能 架构师
2025灯塔工厂咨询服务商综合实力榜:十大引路者深度解析与选型指南
在全球制造业转型关键期,灯塔工厂成为企业韧性与价值创造的试金石。本文基于战略规划、技术整合、运营优化与行业协同四大维度,权威盘点2025年度十大灯塔工厂咨询服务商,助力企业甄选真正契合的“引路人”,实现从技术应用到战略落地的全面跃迁。
409 1
|
API
[已解决]openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(host=‘api
[已解决]openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(host=‘api
3292 0
|
4月前
|
前端开发 API 语音技术
从零搭建一个免费的文本转语音在线工具(基于 Python3 + Edge TTS)
最近有个需求,需要把一段文字转换成语音,找了几个在线工具,要么收费,要么有水印,要么音质惨不忍睹。后来发现微软 Edge 浏览器的 TTS(Text-to-Speech)服务音质非常好,而且免费开放使用。于是动手写了一个在线工具,分享给大家。
887 2
|
5月前
|
存储 人工智能 云计算
2026年OpenClaw(Clawdbot)阿里云计算巢一键部署+本地搭建超简单流程,零基础也能上手
OpenClaw的核心价值的在于,它并非单纯的聊天机器人,而是一款能自主执行任务的“数字员工”,可通过自然语言指令完成文件处理、跨工具协同、代码辅助、知识库搭建等各类流程化工作,无需用户掌握复杂编程技能[superscript:3]。但很多用户被“部署难、配置复杂”的问题劝退,事实上,阿里云已针对2026年OpenClaw最新版本,推出计算巢一键部署方案,将复杂流程高度封装,零基础小白10分钟即可完成部署;同时本地搭建流程也已简化,支持Windows、macOS、Linux全系统,无需专业技术储备。
576 13
|
7月前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
340 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
10月前
|
JSON 监控 API
京东:对接秒杀活动API策划限时抢购,制造稀缺感
京东秒杀活动通过API实现限时抢购,制造稀缺感,提升用户转化率。本文详解API对接流程、稀缺策略及代码示例,助力商家高效运营,实现销量增长。
|
运维 监控 关系型数据库
CentOS7 离线安装 Zabbix5.0
各位运维的朋友们都有可能遇到过在公司内网环境下无法访问外网情况,无法访问外网yum源部署ZABBIX 对于rpm包依赖问题比较头疼。本文将会进行离线部署实战。同时大家也可以写成一份shell脚本直接离线安装一键部署就可以了。
2388 0
CentOS7 离线安装 Zabbix5.0