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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
函数计算FC,每月15万CU 3个月
简介: 借助 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/

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5月前
|
编译器 Linux PHP
【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
|
2月前
|
JavaScript C++ 容器
【Azure Bot Service】部署NodeJS ChatBot代码到App Service中无法自动启动
2024-11-12T12:22:40.366223350Z Error: Cannot find module 'dotenv' 2024-11-12T12:40:12.538120729Z Error: Cannot find module 'restify' 2024-11-12T12:48:13.348529900Z Error: Cannot find module 'lodash'
47 11
|
5月前
|
Python
【Azure 应用服务】Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误
【Azure 应用服务】Python Function App重新部署后,出现 Azure Functions runtime is unreachable 错误
|
5月前
|
Kubernetes Linux Docker
【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误
【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误
|
5月前
|
Docker 容器
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
|
5月前
|
Linux C# C++
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
|
7月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之在执行环境 custom pre-deploy 时,命令 "go mod tidy" 失败了,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
421 0
|
jenkins Java 持续交付
Jenkins容器安装ruby-runtime插件失败报错解决
Jenkins容器安装ruby-runtime插件失败报错解决
194 0
|
弹性计算 Go 开发者
如何使用 Docker 来将 Go Web 项目容器化,并实现在不同环境中快速部署和运行?
如何使用 Docker 来将 Go Web 项目容器化,并实现在不同环境中快速部署和运行?
297 0
|
Go Docker 容器
Docker 部署Go Web应用
随着Go的逐渐流行,基于性能、高效及稳定部署,越来越多的企业开始将其应用框架移植至Go平台。本文主要基于Goland开发平台和Docker容器环境运行,简要介绍Go语言开发的Web项目的容器化部署相关操作。
196 0

热门文章

最新文章