使用AWS Lambda在Go中构建RESTful API

在本文中,我们将学习使用AWS Lambda在Go中设计,构建和部署RESTful API。 在开始之前,让我给您简要介绍一下AWS Lambda。

什么是AWS Lambda?
AWS Lambda是一种无服务器计算服务,可运行我们的代码以响应事件并自动为我们管理基础计算资源。 我们可以使用AWS Lambda通过自定义逻辑扩展其他AWS服务,或者创建我们自己的后端服务,这些后端服务以AWS规模,性能和安全性运行。 AWS Lambda可以自动运行代码以响应多个事件,例如通过Amazon API Gateway发出的HTTP请求,对Amazon S3存储桶中的对象的修改,Amazon DynamoDB中的表更新以及AWS Step Functions中的状态转换。

Lambda在高可用性计算基础架构上运行我们的代码,并执行所有计算资源管理,包括服务器和操作系统维护,容量配置和自动缩放,代码和安全补丁部署以及代码监视和日志记录。 我们需要做的就是提供代码。

现在,让我们开始构建一个API,该API将帮助本地电影租赁店管理其可用电影。

API架构

下图显示了API Gateway和Lambda如何适应API体系结构:

RESTful API

AWS Lambda支持微服务开发。 话虽如此,每个端点都会触发不同的Lambda函数。 这些功能彼此独立并且可以用不同的语言编写,从而导致在功能级别上进行缩放,更易于进行单元测试以及松散耦合。

来自客户端的所有请求都首先通过API网关。 然后,它将传入的请求相应地路由到正确的Lambda函数。

请注意,单个Lambda函数可以处理多种HTTP方法( GETPOSTPUTDELETE等)。 建议为每个功能创建多个Lambda函数,以利用微服务的功能。 但是,构建单个Lambda函数来处理多个端点可能是一个不错的练习。

端点设计

现在已经定义了体系结构,是时候完成上图中描述的功能的实现了。 您可以使用net / http Go包并使用内置的状态代码变量,例如http.StatusOKhttp.StatusCreatedhttp.StatusBadRequesthttp.StatusInternalServerError等 ,而不是对HTTP状态代码进行硬编码。

GET方法

要实现的第一个功能是列出电影。 这就是GET方法起作用的地方。 让我们从以下步骤开始:

步骤1:创建注册了findAll处理程序的Lambda函数。 该处理程序将电影列表转换为字符串,然后返回由APIGatewayProxyResponse变量包装的字符串以及200 HTTP状态代码。 如果转换失败,它也会处理错误。 处理程序的实现如下:

package mainimport ("encoding/json""github.com/aws/aws-lambda-go/events""github.com/aws/aws-lambda-go/lambda"
)var movies = []struct {ID int `json:"id"`Name string `json:"name"`
}{{ID: 1,Name: "Avengers",},{ID: 2,Name: "Ant-Man",},{ID: 3,Name: "Thor",},{ID: 4,Name: "Hulk",}, {ID: 5,Name: "Doctor Strange",},
}func findAll() (events.APIGatewayProxyResponse, error) {response, err := json.Marshal(movies)if err != nil {return events.APIGatewayProxyResponse{}, err}return events.APIGatewayProxyResponse{StatusCode: 200,Headers: map[string]string{"Content-Type": "application/json",},Body: string(response),}, nil
}func main() {lambda.Start(findAll)
}

您可以使用net / http Go包并使用内置的状态代码变量,例如http.StatusOKhttp.StatusCreatedhttp.StatusBadRequesthttp.StatusInternalServerError等 ,而不是对HTTP状态代码进行硬编码。

步骤2:创建一个包含以下内容的脚本文件,以构建Lambda函数部署包,一个包含您的代码和任何依赖项的.zip文件,如下所示:

#!/bin/bashecho "Build the binary"
GOOS=linux GOARCH=amd64 go build -o main main.goecho "Create a ZIP file"
zip deployment.zip mainecho "Cleaning up"
rm main

步骤3:执行以下命令以将部署包构建为.zip文件:

$ chmod +x build.sh
$ ./build.sh

步骤4:使用此处提到的步骤配置AWS CLI。 配置完成后,按照此处提到的步骤创建一个名称为FindAllMoviesRole的AWS角色,并验证是否成功创建该角色:

$ aws iam get-role --role-name FindAllMoviesRole

上面的命令应给出响应,如下面的屏幕快照所示:

RESTful API

步骤5:接下来,使用AWS CLI创建一个新的Lambda函数,如下所示:

aws lambda create-function --function-name FindAllMovies \--zip-file fileb://deployment.zip \--runtime go1.x --handler main \--role arn:aws:iam::ACCOUNT_ID:role/FindAllMoviesRole \--region us-east-1

创建函数后,将为我们提供与以下屏幕快照所示的输出相同的输出:

RESTful API

步骤6 :回到AWS Lambda控制台,您应该看到该函数已成功创建:

RESTful API

步骤7 :创建一个带有空JSON的示例事件,因为该函数不需要任何参数,然后单击Test按钮:

RESTful API

您将在上一个屏幕截图中注意到,该函数以JSON格式返回预期的输出。

步骤8:现在已经定义了函数,您需要创建一个新的API网关来触发它:

RESTful API

步骤9:接下来,从“ 操作”下拉列表中,选择“ 创建资源并将其命名为电影”

RESTful API

步骤10:通过点击Create Method在此/ movies资源上公开GET 方法 。 在“ 集成类型”部分下选择“ Lambda函数 ”,然后选择“ FindAllMovies”函数:

RESTful API

步骤11:要部署API,请从“ 操作”下拉列表中选择“ 部署API ”。 系统将提示您创建一个新的部署阶段:

RESTful API

步骤12:一旦创建了部署阶段,就会显示一个调用URL:

RESTful API

步骤13:将浏览器指向给定的URL或使用现代的REST客户端(例如Postman或Insomnia)。 您可以使用cURL工具,因为默认情况下它已安装在几乎所有操作系统上:

curl -sX GET https://51cxzthvma.execute-api.us-east-1.amazonaws.com/staging/movies | jq '.'

上面的命令将以JSON格式返回电影列表:

RESTful API

调用GET端点时,请求将通过API网关,这将触发findAll处理程序。 这会将API网关代理的响应以JSON格式返回给客户端。

现在已经部署了findAll函数,您可以实现findOne函数以通过其ID搜索电影。

带参数的GET方法

findOne处理程序需要包含事件输入的APIGatewayProxyRequest参数。 然后,它使用PathParameters方法获取影片ID并对其进行验证。

如果提供的ID无效,则Atoi方法将返回错误,并将500错误代码返回给客户端。 否则,将根据索引获取电影,并以包装在APIGatewayProxyResponse中200 OK状态返回给客户端:

...func findOne(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {id, err := strconv.Atoi(req.PathParameters["id"])if err != nil {return events.APIGatewayProxyResponse{StatusCode: 500,Body:       "ID must be a number",}, nil}response, err := json.Marshal(movies[id-1])if err != nil {return events.APIGatewayProxyResponse{StatusCode: 500,Body:       err.Error(),}, nil}return events.APIGatewayProxyResponse{StatusCode: 200,Headers: map[string]string{"Content-Type": "application/json",},Body: string(response),}, nil}func main() {lambda.Start(findOne)}

FindAllMovies函数类似,创建一个新的Lambda函数以搜索电影:

aws lambda create-function --function-name FindOneMovie \--zip-file fileb://deployment.zip \--runtime go1.x --handler main \--role arn:aws:iam::ACCOUNT_ID:role/FindOneMovieRole \--region us-east-1

返回API Gateway控制台,创建一个新资源,公开GET方法,然后将资源链接到FindOneMovie函数。 注意在路径中使用{id}占位符。 id的值将通过APIGatewayProxyResponse对象提供。 以下屏幕截图描述了这一点:

RESTful API

重新部署API,并使用以下cURL命令测试端点:

curl -sX https://51cxzthvma.execute-api.us-east-1.amazonaws.com/staging/movies/1 | jq '.'

将返回以下JSON:

RESTful API

使用ID调用API URL时,如果存在ID对应的影片,则返回该影片。

POST方法

现在,您知道带有和不带有路径参数的GET方法如何工作。 下一步是通过API网关将JSON有效负载传递给Lambda函数。 该代码是不言自明的。 它将输入的请求转换为电影结构,将其添加到电影列表,然后以JSON格式返回新的电影列表:

package mainimport ("encoding/json""strconv""github.com/aws/aws-lambda-go/events""github.com/aws/aws-lambda-go/lambda"
)type Movie struct {ID int `json:"id"`Name string `json:"name"`
}var movies = []Movie{Movie{ID: 1,Name: "Avengers",},...
}func insert(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {var movie Movieerr := json.Unmarshal([]byte(req.Body), &movie)if err != nil {return events.APIGatewayProxyResponse{StatusCode: 400,Body: "Invalid payload",}, nil}movies = append(movies, movie)response, err := json.Marshal(movies)if err != nil {return events.APIGatewayProxyResponse{StatusCode: 500,Body: err.Error(),}, nil}return events.APIGatewayProxyResponse{StatusCode: 200,Headers: map[string]string{"Content-Type": "application/json",},Body: string(response),}, nil
}func main() {lambda.Start(insert)
}

接下来,使用以下命令为InsertMovie创建一个新的Lambda函数:

aws lambda create-function --function-name InsertMovie \--zip-file fileb://deployment.zip \--runtime go1.x --handler main \--role arn:aws:iam::ACCOUNT_ID:role/InsertMovieRole \--region us-east-1

接下来,在/ movies资源上创建一个POST方法,并将其链接到InsertMovie函数:

RESTful API

要对其进行测试,请使用下面的cURL命令以及POST动词和-d标志,后跟JSON字符串(具有id和name属性):

curl -sX POST -d '{"id":6, "name": "Spiderman:Homecoming"}' https://51cxzthvma.execute-api.us-east-1.amazonaws.com/staging/movies | jq '.'

上面的命令将返回以下JSON响应:

RESTful API

如您所见,新电影已成功插入。 如果再次测试,它应该可以按预期工作:

curl -sX POST -d '{"id":7, "name": "Iron man"}' https://51cxzthvma.execute-api.us-east-1.amazonaws.com/staging/movies | jq '.'

前面的命令将返回以下JSON响应:

RESTful API

如您所见,它成功完成并且再次按预期方式插入了影片,但是如果您等待几分钟并尝试插入第三部影片怎么办? 以下命令将用于再次执行它:

curl -sX POST -d '{"id":8, "name": "Captain America"}' https://51cxzthvma.execute-api.us-east-1.amazonaws.com/staging/movies | jq '.'

再次,将返回一个新的JSON响应:

RESTful API

您会发现ID为6和7的电影已被删除; 为什么会这样? 这很简单。 Lambda函数是无状态的。

首次(首次插入)调用InsertMovie函数时,AWS Lambda将创建一个容器并将函数有效负载部署到该容器。 然后,它保持活动状态几分钟,然后终止( 热启动 ),这说明了第二个刀片通过的原因。 在第三个插件中,该容器已经终止,因此Lambda创建一个新容器( 冷启动 )以处理该插件。

这就是为什么以前的状态会丢失的原因。 下图说明了冷/热启动问题:

RESTful API

这就解释了为什么Lambda函数应该是无状态的,为什么您不应该做出任何假设将状态从一次调用保留到另一次调用的假设。

完整的源代码托管在github上 。

翻译自: https://www.javacodegeeks.com/2018/11/build-restful-api-go-using-aws-lambda.html

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

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

相关文章

【渝粤题库】陕西师范大学210011幼儿园语言教育作业(高起专)

《幼儿园语言教育》作业 一、填空题 1、儿童语言的发展是指儿童对母语的理解和 能力随着时间的推移而发生变化的过程和现象。 2、儿童获得语言之前,用语音及伴随的表情或动作代替语言进行交往的现象被称为 。 3、 是指交际双方根据交际目的和语言情境有效地使用语言…

html的段落标志中 标注行中断,?HTML的段落标志中,标注行中断的是?

A:,B:,C: ,D:答案查看答案?HTML的段落标志中,标注行中断的是?解析【单选题】下列关于元素在网页中的叠放顺序描述,不正确的是?【单选题】HTML代码表示?【单选题】创建选项菜单应使用以下标记符?【单选题】在本窗口打开超链接的代…

【渝粤题库】陕西师范大学292301 国际金融学Ⅱ 作业(专升本)

《国际金融II》作业 一、判断 1、国际收支一般总是有差额的,当国际收入部分小于支出部分称为顺差,反之为逆差或赤字。 2、特别提款权在国际储备中所占的比重很大,约为40%。 3、在不同标价法下,买入价与卖出价的表示方法不同。在直…

【渝粤题库】陕西师范大学500010 量子力学 作业(专升本)

一、填空题 1、历史上第一个完全肯定光除了波动性之外还具有粒子性的科学家是 。按照光子假,频率为ν、波长为λ的电磁辐射其光子的能量E ,动量P . 2、按照德布罗意假说,能量为E、动量为的自由粒子,其相应的物质波可表…

【渝粤题库】陕西师范大学800004 遥感概论

《遥感概论》作业 一. 填空题 1.根据运载工具的类型,可分为 、 、 。    2.固体自扫描目前常用的探测元件是 ,它是一种用电荷量表示信号大小,用耦合方式传输信号的探测元件。 &…

undertow服务器分析_使用undertow构建和测试Websocket服务器

undertow服务器分析即将发布的JBoss Application Server版本将不再使用Tomcat作为集成的Web服务器,而是将其替换为undertow 。 undertow的体系结构基于可通过Builder API动态添加到服务器的处理程序。 这种方法类似于在Node.js中构造Web服务器的方式。 它使开发人员…

国家开放大学2021春1087数学分析专题研究题目

教育 教育 试卷代号:1087 2021年春季学期期末统一考试 数学分析专题研究 试题 2021年7月 一、单项选择题(每小题4分,共20分) 1.设映射f:A→B,g:B→C,且g。f:A→C是双射,则映射f一定是&#xf…

跳转指令微型计算机,哪种类型的汇编程序跳转指令最有用?

Ira Baxter..5(我已经为汇编程序编写了40多年;实际上在20世纪70年代早期设计并构建了一个生产多寄存器16位机器).真正有用的是CMP指令和指定该条件的JMP相对.我建议你让算术指令产生状态位零结果从结果出发结果的标志溢出(签名)我们称之为"条件位".你会发现它们都很有…

渝粤题库]西北工业大学组成与系统结构

一单选题 1.动态流水线是指( )。(2分) A.只有一种功能的流水线 B.同时只能完成一种功能的多功能流水线 C.功能不能改变的流水线 D .可同时执行多种功能的流水线 2.通道程序执行结束后引起的中断是(). (2分) A.程序性中断 B.外中断 C. I/O中断 D.机器校验中断 3.不属于堆栈型替…

重新开始Java的原始字符串文字讨论

在2018年12月宣布 将从JDK 12中删除原始字符串文字 。 现在,在新的一年中,与Java中原始字符串文字的设计有关的讨论又开始了。 在琥珀色专家OpenJDK邮件列表上的“ 原始字符串文字-重新开始讨论 ”一文中 ,Brian Goetz参考了有关从JDK 12中删…

【渝粤教育】广东开放大学 计算机思维 形成性考核 (29)

题库查询系统 选择题 题目:计算思维的特征有概念化,不是程序化、有根本的,不是刻板的技能、有是人的不是计算机的思维方式() 答案: A、是思想,不是人造物 题目:以下是算法的特性的() 答案: A、确定性、有穷性、不可行、输出、有穷…

计算机考博哪个学校好考,管理学博士哪个学校好考

我知道都不容易,都是宽进严出。 但是排除那些像上财、复旦这种热门、大。东华大学授予管理学博士学位的有企业管理博士点和管理科学与工程博士点。 如果你只是想混文凭的话,建议你选择企业管理专业进行报考。该专业相对管理科学与工程的论文要求要低一些…

【渝粤教育】广东开放大学 文化经济实务 形成性考核 (49)

选择题 题目:钢琴三重奏指的是钢琴和()。 题目:音乐经纪业务的本质其实就是( )。 题目:明星制的核心功能是()。 题目:模特经纪人还要帮助模特制定近期、中期、…

【渝粤教育】广东开放大学 现代服务业管理 形成性考核 (21)

选择题 题目:产权交易的主要形式有 题目:不属于责任保险的是 题目:以下哪些行业不属于现代服务业? 题目:是国民经济发展的晴雨表,是现代经济的核心。 题目:按照评估对象来分,以下不属…

武汉科技大学计算机研究生拟录取名单,武汉科技大学2021年硕士研究生拟录取名单公示...

104881414604818 黄威威 004 【信息科学与工程学院/人工智能学院】 081100 控制科学与工程 310 66.80 63.44 全日制 学术学位104881421605130 厉许昌 004 【信息科学与工程学院/人工智能学院】 081100 控制科学与工程 306 64.10 62.07 全日制 学术学位104881421200121 饶梓归 0…

spring boot程序_Spring Boot –现代Java应用程序的基础

spring boot程序Spring Boot是Spring.io中一个相对较新的项目。 其目的是简化创建新的基于Spring Framework的项目,并通过应用一些约定来统一其配置。 这种关于配置的方法约定已经成功地应用于大多数所谓的现代Web框架中,例如Ruby on Rails,D…

【渝粤教育】广东开放大学 云计算技术与应用 形成性考核

选择题 题目:下列哪个文件提出:到2020年,云计算成为我国信息化重要形态和建设网络强国的重要支撑()。 题目:一般认为,我国云计算产业链主要分为四个层面,即:(…

【渝粤教育】广东开放大学 商务英语听说 形成性考核 (37)

选择题 题目:贵公司成功营销的产品有哪些呢? 题目:3on’ ‘t be afraid to call the front desk should you need something.无论需要什么不要怕打电话到柜台询问。 题目:我想他们会想要回房门钥匙。 题目:n.问题 题目&#xff1…

使用SparkJava和Graal的本机微服务

使用SparkJava编写的微服务只是使用标准Java库的普通Java代码。 没有注释魔术,只有代码。 这种简单的编程风格的优点在于,它很简单。 非常简单,以至于Graal本机编译器无需闪烁就可以对其进行编译 ,这在例如Spring之类的更复杂的框…

计算机原理与应用简称,基础知识-计算机原理与应用.ppt

基础知识-计算机原理与应用第1章 基础知识 本章内容: 单片机的概念 单片机的发展、基本的结构和特点 单片机的应用模式和领域 MCS-51单片机等。 1.1 计算机的一些概念 1.2 单片机   单片机即单片机微型计算机,就是将CPU、RAM、ROM、定时/计数器和多种接…