当前位置: 首页 > news >正文

如何以无服务器方式运行 Go 应用程序

Go编程语言一直以来都对构建REST API提供了丰富的支持。这包括一个出色的标准库(net/HTTP),以及许多流行的包,如Gorilla mux、Gin、Negroni、Echo、Fiber等。使用AWS Lambda Go运行时,我们可以使用Go构建AWS Lambda函数。想象一下,一个Web应用程序需要对用户进行身份验证、存储用户数据和发送电子邮件。采用无服务器的方法,可以将每个功能/API实现为单独的Lambda函数。例如,我们可以有一个Lambda函数来处理用户注册,另一个来处理用户登录,依此类推。如果我们从头开始构建一切,这很好。但是,如果我们想将现有的Go REST API作为AWS Lambda函数运行,该怎么办呢?大体上来说,您需要进行以下操作:

  • 将现有的代码拆分为多个Lambda函数。
  • 重构每个函数以适配AWS Lambda Go运行时API。

不过使用AWS Lambda Go API Proxy,有一种更简单的方法。 接下来将演示如何使用AWS Lambda和Amazon API Gateway以无服务器方式运行基于Go框架的现有API。将通过简单的代码示例和框架来了解它们的工作原理,并使用AWS Serverless Application Model(SAM)部署它们。代码可在此GitHub存储库中找到。让我们从AWS Lambda Go API Proxy的简要介绍开始。

AWS Lambda Go API Proxy:它是如何工作的?

aws-lambda-go-api-proxy包使得使用框架(如Gin)编写的Go API能够轻松地在AWS Lambda和Amazon API Gateway上运行。除了适配器实现(针对Go标准库)和其他框架(如,,等)外,aws-lambda-go-api-proxy还声明了一个包,其中包含了将API Gateway代理事件转换为Go默认和对象的实用方法和接口,并允许您将任何框架适配到AWS Lambda Go运行时中。

下面是它的高级工作原理概述:

  • Lambda函数处理程序接收API Gateway的请求。
  • 函数处理程序将请求代理到与框架对应的适配器实现。
  • 最后,将API Gateway代理响应返回给客户端。

再让我们深入了解一下特定于框架的行为。

gorilla/mux库

gorilla/mux包实现了一个请求路由器和调度器,用于将传入的请求与其相应的处理程序进行匹配。与Go标准库中的类似,它将传入的请求与注册的路由列表进行匹配,并调用与URL或其他条件匹配的路由的处理程序。由于实现了接口与其他的兼容。下面有一个简单的Lambda函数示例,使用适配器实现与gorilla/mux包一起使用:

var gorillaLambda *gorillamux.GorillaMuxAdapter
​
func init() {r := mux.NewRouter()
​r.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {json.NewEncoder(w).Encode(Response{From: "gorilla", Message: time.Now().Format(time.UnixDate)})})
​gorillaLambda = gorillamux.New(r)
}
​
func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {r, err := gorillaLambda.ProxyWithContext(ctx, *core.NewSwitchableAPIGatewayRequestV1(&req))return *r.Version1(), err
}
​
func main() {lambda.Start(Handler)
}

在这个函数中:函数接收一个 http.Request 对象(其中定义了路由),并返回一个 http.Response 对象。在实现中:Handler 对象的 ServeHTTP 方法接收 http.Request 对象,将其转换为 http.ResponseWriter 对象,并将其发送到路由器进行路由处理。它将根据写入到响应写入器的数据生成一个代理响应对象(http.Response)。

Echo框架

Echo是另一个流行的Go Web框架,它既简约又高度可扩展。下面是一个简单的Lambda函数示例,使用适配器实现与Echo框架一起使用:

var echoLambda *echoadapter.EchoLambda
​
func init() {e := echo.New()
​e.Use(middleware.Logger())e.Use(middleware.Recover())
​e.GET("/ping", func(c echo.Context) error {return c.JSON(http.StatusOK, Response{From: "echo", Message: time.Now().Format(time.UnixDate)})})
​echoLambda = echoadapter.New(e)
}
​
func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {return echoLambda.ProxyWithContext(ctx, req)
}
​
func main() {lambda.Start(Handler)
}

该函数设置了一个路由器(echo.Echo),并将其传递给 echoadapter.New 函数,返回一个适配器实现(echoadapter.EchoLambda)。在函数中:Handler 对象的 ProxyWithContext 方法接收 events.APIGatewayProxyRequest 对象,并将其转换为 http.Request 对象,然后将其发送到 echo.Echo 进行路由处理。它将根据写入到响应写入器的数据生成一个代理响应对象(events.APIGatewayProxyResponse)。

net/http

对于net/http包,适配器实现的工作方式也是相同的。以下是代码片段的示例:

var httpLambda *httpadapter.HandlerAdapter
​
func init() {http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {json.NewEncoder(w).Encode(Response{From: "net/http", Message: time.Now().Format(time.UnixDate)})})
​httpLambda = httpadapter.New(http.DefaultServeMux)
}
​
func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
​return httpLambda.ProxyWithContext(ctx, req)
}
​
func main() {lambda.Start(Handler)
}

要与标准库一起使用,该函数接收一个 http.Handler 对象(其中定义了路由),并返回一个 httpadapter.HandlerAdapter 对象。然后,可以使用 ProxyWithContext 方法将其作为Lambda处理程序。


部署到AWS Lambda

使用SAM CLI将这些函数部署到AWS Lambda。

先决条件

需要安装了Go编程语言(v1.18或更高版本)和AWS SAM。克隆项目并切换到正确的目录。

git clone https://github.com/build-on-aws/golang-apis-on-aws-lambda
​
cd golang-apis-on-aws-lambda

基于gorilla和mux的Lambda函数

首先,将CodeUritemplate.yaml文件中更新为代码所在的本地文件夹路径。 构建函数:

sam build
​
#expected output
​
Building codeuri: <path>/lambda-go-api-proxy-getting-started/gorilla runtime: go1.x metadata: {} architecture: x86_64 functions: DemoFunction
Running GoModulesBuilder:Build
​
Build Succeeded
....

部署函数(按照SAM CLI的提示进行操作):

export STACK_NAME=lambda-go-gorilla
​
sam deploy --stack-name $STACK_NAME --guided
​
# response to the prompts
​
Stack Name [lambda-go-gorilla]: <press enter>
AWS Region [us-east-1]: <enter alternate region or press enter>
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]: n
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: n
DemoFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]: <press enter>
SAM configuration environment [default]: <press enter>

部署完成后,转到AWS控制台,检查已部署的堆栈和相关资源。这些资源包括Lambda函数、API Gateway(REST API)、IAM角色等。

可以在SAM CLI的输出中看到API Gateway的端点,或者在Outputs部分中找到它。

-----------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------
Outputs                                                                                                
--------------------------------------------------------------------------------------------------------
Key                 APIGWEndpoint                                                                   
Description         API Gateway Endpoint                                                                                                
Value               https://whrd2yy3ug.execute-api.us-east-1.amazonaws.com/dev/ping                    
--------------------------------------------------------------------------------------------------------
​
Successfully created/updated stack - lambda-go-gorilla in us-east-1

要测试函数,请使用以下命令调用API Gateway:

export API_ENDPOINT=<enter the API Gateway endpoint here>
​
curl $API_ENDPOINT

会得到类似以下的响应:

{"from": "gorilla","message": "Tue Jun 27 18:10:54 UTC 2023"
}

net/http和基于echo的Lambda函数

在部署这两个函数之前,请确保将CodeUri更新为代码所在的本地文件夹路径:- 对于net/http包,更新为http-stdlib/。- 对于echo框架,更新为echo/。构建并部署函数(按照之前的提示进行操作):

sam build
​
# change the stack name to lambda-go-echo in case of "echo" framework
export STACK_NAME=lambda-go-nethttp
​
sam deploy --stack-name $STACK_NAME --guided

可以通过调用API Gateway端点来测试函数:

export API_ENDPOINT=<enter your API endpoint here>
​
curl $API_ENDPOINT

会得到下面的响应:

{"from": "net/http","message": "Tue Jun 27 18:20:42 UTC 2023"
}

对于框架的情况,会得到下面的响应(注意字段中的不同名称):

{"from": "echo","message": "Tue Jun 27 18:30:25 UTC 2023"
}

以上步骤已成功将Go API部署为AWS Lambda函数。完成后,请删除堆栈:

sam delete --stack-name lambda-go-gorilla
sam delete --stack-name lambda-go-nethttp
sam delete --stack-name lambda-go-echo

结论

上面演示了AWS Lambda Go API代理,以及它的框架/包(对于gorilla/mux、echo和net/http)特定的适配器实现,能够将现有的Go应用程序作为AWS Lambda函数运行,并由API Gateway提供前端服务。通过简单的代码示例学习了基本概念,使用AWS SAM CLI部署了这些函数,并通过调用API Gateway端点进行了验证。

作者:Abhishek Gupta

更多技术干货请关注公众号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等

相关文章:

如何以无服务器方式运行 Go 应用程序

Go编程语言一直以来都对构建REST API提供了丰富的支持。这包括一个出色的标准库&#xff08;net/HTTP&#xff09;&#xff0c;以及许多流行的包&#xff0c;如Gorilla mux、Gin、Negroni、Echo、Fiber等。使用AWS Lambda Go运行时&#xff0c;我们可以使用Go构建AWS Lambda函数…...

小程序商城系统的开发方式及优缺点分析

小程序商城系统是一种新型的电子商务平台&#xff0c;它通过小程序的形式为商家提供了一种全新的销售渠道&#xff0c;同时也为消费者提供了一种便捷的购物体验。小程序商城系统具有低成本、快速上线、易于维护等特点&#xff0c;因此在市场上受到了广泛的关注和应用。这里就小…...

[数据集][目标检测]城市道路井盖破损丢失目标检测1377张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1377 标注数量(xml文件个数)&#xff1a;1377 标注类别数&a…...

【Spring Cloud 三】Eureka服务注册与服务发现

系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka&#xff1f;二、为什么要有服务注册发现中心&#xff1f;三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…...

WPF实战学习笔记21-自定义首页添加对话服务

自定义首页添加对话服务 定义接口与实现 添加自定义添加对话框接口 添加文件&#xff1a;Mytodo.Dialog.IDialogHostAware.cs using Prism.Commands; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Linq; using System.Tex…...

AngularJS学习(一)

目录 1. 引入 AngularJS2. 创建一个 AngularJS 应用3. 控制器&#xff08;Controller&#xff09;4. 模型&#xff08;Model&#xff09;5. 视图&#xff08;View&#xff09;6. 指令&#xff08;Directive&#xff09;7. 过滤器&#xff08;Filter&#xff09;8. 服务&#xf…...

918. 环形子数组的最大和

918. 环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n] &#xff0c; nums[i] 的前一个元素是…...

AI算法图形化编程加持|OPT(奥普特)智能相机轻松适应各类检测任务

OPT&#xff08;奥普特&#xff09;基于SciVision视觉开发包&#xff0c;全新推出多功能一体化智能相机&#xff0c;采用图形化编程设计&#xff0c;操作简单、易用&#xff1b;不仅有上百种视觉检测算法加持&#xff0c;还支持深度学习功能&#xff0c;能轻松应对计数、定位、…...

C语言文件指针设置偏移量--fseek

一、fseek fseek是设置文件指针偏移量的函数&#xff0c;具体传参格式为&#xff1a; int fseek(FILE *stream, long int offset, int whence) 返回一个整数&#xff0c;其中&#xff1a; 1、stream是指向文件的指针 2、offset是偏移量&#xff0c;一般是指相对于whence的便…...

快速消除视频的原声的技巧分享

网络上下载的视频都会有视频原声或者背景音乐&#xff0c;如果不喜欢并且想更换新的BGM要怎么操作呢&#xff1f;今天小编就来教你如何快速给多个视频更换新的BGM&#xff0c;很简单&#xff0c;只需要将原视频的原声快速消音同时添加新的背景音频就行&#xff0c;一起来看看详…...

lua脚本实现Redis令牌桶限流

背景 令牌桶限流是一种常见的流量控制算法&#xff0c;用于控制系统的请求处理速率&#xff0c;防止系统过载。在令牌桶限流算法中&#xff0c;可以将请求看作是令牌&#xff0c;而令牌桶则表示系统的处理能力。系统在处理请求时&#xff0c;首先需要从令牌桶中获取令牌&#…...

最新 23 届计算机校招薪资汇总

24 届的秋招提前批已经开始了&#xff0c;比如米哈游、oppoe、tplink 等公司都已经录取开启提前批。 像腾讯、字节、阿里等一线大厂的话&#xff0c;根据往年的情况&#xff0c;估计是 7月下-8 月初。 所以今年参加秋招的同学&#xff0c;要抓紧复习了。 提前批通常就持续不到…...

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…...

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …...

认识springboot 之 了解它的日志 -4

前言 本篇介绍springboot的日志&#xff0c;如何认识日志&#xff0c;如何进行日志持久化&#xff0c;通过日志级别判断信息&#xff0c;了解Lombok插件的使用&#xff0c;通过Lombok自带注释更简洁的来完成日志打印&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0…...

关于大规模数据处理的解决方案

大规模数据处理已经成为了现代商业和科学的核心。随着互联网普及和物联网技术的发展&#xff0c;越来越多的数据被收集和存储&#xff0c;这些数据包含了各种各样的信息&#xff0c;例如客户行为、传感器读数、社交媒体活动等等。这些数据的数量和复杂性已经超出了传统数据处理…...

免费快速下载省市区县行政区的Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 一、首先&am…...

MAC下配置android-sdk

MAC下配置android-sdk 1、前提2、brew安装3、配置sdk 1、前提 安装好JDK安装brew 2、brew安装 brew install android-sdk brew install android-platform-tools检查是否安装成功 android3、配置sdk brew list android-sdk进入配置文件 sudo vim ~/.zshrc配置 export AND…...

Hive-数据倾斜

在计算各省份的GMV时&#xff0c;有可能会发生数据倾斜&#xff0c;解决办法如下&#xff1a; 分组聚合 预聚合思想 map-side&#xff08;预聚合在map里面&#xff09;skew-groupby&#xff08;多个reduce阶段进行汇总&#xff09;&#xff1a;先对倾斜的key加上随机数&#x…...

Java多线程(三)

目录 一、Thread类基本用法 1.1 Thread常见构造方法 1.2 Thread常见属性 二、多线程常用的创建方式 2.1 继承Thread类 2.2 实现Runnable接口 2.3 继承Thread接口&#xff0c;使用匿名内部类 2.4实现Runnable接口&#xff0c;使用匿名内部类 2.5使用lambda表达式 三、线程的启动…...

【独家首发】Sora 2 v1.3.2内部一致性补丁文档泄露:仅限前500位AIGC工程师的8项prompt-engineering硬核干预法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Sora 2人物一致性保持的核心挑战与底层机制 在长时序视频生成任务中&#xff0c;Sora 2需在数十秒甚至更长的视频序列中维持同一人物的外观、姿态、服饰、发型及微表情等多维度特征稳定复现。这一目标面…...

极验v4点选验证码接入与服务端校验实践指南

我不能按照您的要求生成相关内容。原因如下&#xff1a;“绕过B站的风控检测机制”属于对他人平台安全防护体系的规避行为&#xff0c;违反《中华人民共和国网络安全法》第二十七条关于“不得从事非法侵入他人网络、干扰他人网络正常功能及其防护措施”的明确规定&#xff1b;“…...

终极AI音乐创作工具:5分钟生成专业级歌曲翻唱

终极AI音乐创作工具&#xff1a;5分钟生成专业级歌曲翻唱 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen 你是否曾经梦想…...

Node.js 服务中如何异步调用 Taotoken 聚合接口实现 AI 功能集成

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Node.js 服务中如何异步调用 Taotoken 聚合接口实现 AI 功能集成 在 Node.js 服务中集成大模型能力&#xff0c;通常意味着你需要处…...

5CGTFD7D5F27C7N、支持550MHz全局时钟与287MHz DSP处理的高性能FPGA

内容介绍今天我要向大家介绍的是 Altera 的一款高性能现场可编程门阵列&#xff08;FPGA&#xff09;——5CGTFD7D5F27C7N。它采用先进的Cyclone V架构设计&#xff0c;专为工业级应用和高性能低功耗系统而设计。对于核心性能部分&#xff0c;5CGTFD7D5F27C7N在-7速度等级下&am…...

在 Node.js 后端服务中接入 Taotoken 多模型 API 的实践

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Node.js 后端服务中接入 Taotoken 多模型 API 的实践 为后端服务添加 AI 能力&#xff0c;例如智能客服或内容生成&#xff0c;…...

GitHub中文插件:打破语言壁垒,让代码世界更亲切

GitHub中文插件&#xff1a;打破语言壁垒&#xff0c;让代码世界更亲切 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾因Git…...

驱动教学模式革新:广凌智慧教学融合平台如何实现个性化教学?

随着高等教育从“知识为主”向“能力为先”深刻转型&#xff0c;千人千面的个性化学习已成为未来教育的核心诉求。传统的统一内容、统一路径的教学模式&#xff0c;已难以满足学生差异化的发展需要。如何借助技术手段实现真正的因材施教&#xff1f;广凌智慧教学融合平台以人工…...

Seraphine终极指南:英雄联盟免费智能助手,5分钟提升排位胜率15%

Seraphine终极指南&#xff1a;英雄联盟免费智能助手&#xff0c;5分钟提升排位胜率15% 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 还在为英雄联盟排位赛中的战绩查询和BP决策烦恼吗&#xff1f;Seraphin…...

Token聚合平台 vs 传统云 vs AI原生云,AI推理应用怎么选?

在大模型能力深度融入生产环境的当下&#xff0c;后端 AI 架构的选择往往决定了应用的生死。从早期的“调用一个接口”到如今复杂的智能体&#xff08;Agent&#xff09;工作流&#xff0c;开发团队在底座选型上面临着两条截然不同的演进路径&#xff1a;一条是追求便利与极致轻…...