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

news2024/12/30 3:34:34

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开发工具等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/824755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盖雅工场典范案例之纤维隐形冠军兰精的人效提升密码

一面是严苛的环保工艺要求企业不能只关注降本&#xff0c;一面是“为人所有 与人共享”的企业文化将“人”摆在极其重要的位置。 如何找到一条合适的人效提升路径&#xff0c;既能持续高速发展&#xff0c;又让员工干得满意、自豪&#xff1f; 注&#xff1a;本文整理自盖雅工…

STM SPI学习

SPI介绍 SPI&#xff1a;串行外设设备接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步通信总线。 IIC总线与SPI总线对比 全双工&#xff1a;同一时刻既能接收数据&#xff0c;也能发送数据。 CS&…

windows上给oracle打补丁注意事项

打补丁的过程 1、升级opatch工具&#xff0c;检查剩余空间用于存放ORACLE_HOME的备份&#xff0c;设置oracle_home环境变量,通过readme中的先决条件来检查现有补丁是否和本次补丁冲突 2、opatch apply 升级数据库软件&#xff0c;这个必须数据库文件不要被进程调用 在windows上…

VS中使用QT的插件:QT VS Tools

1、插件下载 &#xff08;1&#xff09;可以在VS中的管理扩展中直接搜索安装&#xff0c;但是我下载太慢&#xff0c;甚至是根本就无法安装。 &#xff08;2&#xff09;qt插件下载地址&#xff1a;Index of /official_releases/vsaddin 这个地址下载就很快&#xff0c;下载…

关于BQ27427的配置问题

EVM是TI家做的BQ27427的开发板&#xff0c;这款芯片还挺新的。 大概是这样&#xff0c;一块开发板要一千多块钱&#xff0c;使用的时候还出现了一些奇怪的问题。 配置使用的是买的盗版的EV2400&#xff0c;就是黑色的那个东西&#xff0c;使用的通信方式IIC。 TI手册上写的软件…

实战:Prometheus+Grafana监控Linux服务器及Springboot项目

文章目录 前言知识积累什么是Prometheus什么是Grafana怎样完成数据采集和监控 环境搭建docker与docker-compose安装docker-compose编写 监控配置grafana配置prometheus数据源grafana配置dashboardLinux Host Metrics监控Spring Boot 监控 写在最后 前言 相信大家都知道一个项目…

@ConfigurationProperties

目录 ConfigurationProperties 自定义bean使用注入 第三方bean注入 EnableConfigurationProperties ConfigurationProperties 当想需要获取到配置文件数据时&#xff0c;除了可以用 Spring 自带的 Value 注解外&#xff0c;SpringBoot 还提供了一种更加方便的方式&#xff1…

零基础C#编写上位机如何入门?

学习C#基础语法和.NET框架&#xff0c;掌握基本编程概念和语法&#xff0c;例如数据类型、类、对象、继承、多态、异常处理等。学习WinForm窗体应用程序开发技术&#xff0c;掌握窗体应用程序的设计和开发&#xff0c;例如控件的使用、事件驱动编程、窗体的布局与设计等。学习数…

结构重参数化详解。(bn+conv)与(conv+bn)的融合

结构重参数化详解。&#xff08;bnconv&#xff09;与&#xff08;convbn&#xff09;的融合 原理哪种情况不能合并&#xff1f;带bn的合并结构&#xff08;conv bn&#xff09;&#xff08;bn conv&#xff09;需要注意&#xff1a;pytorch代码 原理 如何理解结构重参数化&…

低代码是什么意思?

低代码是什么意思&#xff1f; 简单而言&#xff0c;低代码&#xff08;Low-code&#xff09;是一种软件开发和应用开发方法论&#xff0c;旨在帮助开发人员快速构建应用软件&#xff0c;同时减少繁琐的手动编码工作。该方法论注重简化开发流程&#xff0c;通过可视化建模和少…

【eNSP】Telnet远程登录

Telnet远程登录 eNSP软件TelnetTelnet远程登录-路由连接关闭防火墙eNSP根据图1画图路线配置路由端口IP配置路由R1改名配置接口IP 配置路由R2 配置R2的远程登录设置登录用户授权级别退出登录超时时间 Telnet测试 eNSP软件 eNSP(Enterprise Network Simulation Platform)是一款由…

RocketMQ 5.x延时消息源码分析(不包含时间轮)

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 RocketMQ版本 5.1.0 背景 首先说明本次源码分析仅分析时间轮之前的延时消息设计 现在的RocketMQ已经支持基于时间轮的任意级别延时消息 延时消息基础知识 默认…

2023财务ERP-业财一体化ERP系统功能应用,实现河北企业报表专业管理|亿发

信息技术迅速发展&#xff0c;传统的人工管理会导致财务与业务数据割裂&#xff0c;繁琐的数据处理和低效的财务管理已经不能满足河北省企业的发展需要&#xff0c;需要通过智能化手段持续推动河北企业的组织和管理变革。而在数字化时代&#xff0c;业财一体化建设与应用正逐渐…

PySpark-RDD编程入门

文章目录 2.PySpark——RDD编程入门2.1 程序执行入口SparkContext对象2.2 RDD的创建2.2.1 并行化创建2.2.2 获取RDD分区数2.2.3 读取文件创建 2.3 RDD算子2.4 常用Transformation算子2.4.1 map算子2.4.2 flatMap算子2.4.3 reduceByKey算子2.4.4 WordCount回顾2.4.5 groupBy算子…

Connection is read-only. Queries leading to data modification are not allowe解决

场景&#xff1a;用动态代理类调用本类中的事务方法后&#xff0c;又调用其他service的方法时&#xff0c;会抛此异常 解决方法:事务注解放在本类方法上&#xff0c;让处于同一事务下即可 初步认为是动态代理类影响了事务aop。

vsphere之vmotion精华 虚拟机迁移

概念 vmotion是vsphere高级功能的基础&#xff0c;DRS、HA、FT等功能都依赖于vmotion。简单来说&#xff0c;vmotion指虚拟机漂移。比如有一台VM原来在exsi1上运行&#xff0c;我们可以通过vmotion技术把VM移动到exsi2上。 那为什么要用到vmotion呢&#xff1f;显而易见&…

隔断玻璃内部的雕花工艺有哪些特点

隔断玻璃内部的雕花工艺具有以下几个特点&#xff1a; 1. 精细细腻&#xff1a;隔断玻璃内部的雕花工艺通常需要经过精细的雕刻和打磨&#xff0c;以展现出细腻的纹理和图案。因此&#xff0c;这种工艺在细节上非常令人印象深刻。 2. 独特个性&#xff1a;隔断玻璃内部的雕花工…

华中科技大学成功验证LK-99,美国实验室证实常温常压超导理论可行!

原创 | 文 BFT机器人 上周&#xff0c;全球物理学界迎来了一则令人震惊的消息&#xff1a;一支韩国科学家团队宣布他们发现了全球首个室温超导材料。这种材料被称为“改性铅磷灰石晶体结构&#xff08;下称LK-99&#xff0c;一种掺杂铜的铅磷灰石&#xff09;”。这项研究引起…

炒股杠杆途乐证券;股票买入卖出时间规则?

股票买入卖出时刻规则是指出资者在股票商场上进行生意交易时需求遵循的一系列时刻规定。正确的买入和卖出时刻能够协助出资者最大化出资回报&#xff0c;一起降低风险。但是&#xff0c;在股票商场上&#xff0c;生意时刻的挑选是一个复杂的问题&#xff0c;需求从多个角度剖析…