aws微服务器
几个月前,Amazon Web Services推出了无服务器应用程序模型 (SAM)。 它定义了用于表达无服务器资源的简化语法。 SAM扩展了AWS CloudFormation,以添加对API网关,AWS Lambda和Amazon DynamoDB的支持。 该博客将展示如何使用SAM创建简单的微服务。 当然,我们将使用Couchbase代替DynamoDB!
该博客还将使用在使用AWS API Gateway,AWS Lambda和Couchbase的Microservice中解释的基本概念。 SAM将展示如何轻松部署和管理整个微服务堆栈。
作为回顾,这里是体系结构中的关键组件:
- 客户端可以是curl,AWS CLI /控制台,Postman客户端或可以调用REST端点的任何其他工具/ API。
- AWS API Gateway用于配置API。 顶级资源位于path
/books
。 为该资源发布了HTTPGET
和POST
方法。 - 每个API都会触发Lambda函数。 创建了两个Lambda函数,用于列出所有可用
book-create
的书籍book-list
功能,以及用于创建新书籍的书籍book-create
功能。 - Couchbase在EC2中用作持久性存储。 所有JSON文档都从该数据库存储和检索。
其他无服务器博客:
让我们开始吧!
无服务器应用程序模型(SAM)模板
具有符合AWS SAM模型的无服务器资源的AWS CloudFormation模板称为SAM文件或模板。 它被部署为CloudFormation堆栈。
让我们看一下我们的SAM模板:
该模板位于github.com/arun-gupta/serverless/blob/master/aws/microservice/template.yml中 。
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Microservice using API Gateway, Lambda and Couchbase
Resources:
MicroserviceGetAllGateway:
Type: AWS::Serverless::Function
Properties:
Handler: org.sample.serverless.aws.couchbase.gateway.BucketGetAll
Runtime: java8
CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
Timeout: 30
MemorySize: 1024
Environment:
Variables:
COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com
Role: arn:aws:iam::598307997273:role/microserviceRole
Events:
GetResource:
Type: Api
Properties:
Path: /books
Method: get
MicroservicePostGateway:
Type: AWS::Serverless::Function
Properties:
Handler: org.sample.serverless.aws.couchbase.gateway.BucketPost
Runtime: java8
CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
Timeout: 30
MemorySize: 1024
Environment:
Variables:
COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com
Role: arn:aws:iam::598307997273:role/microserviceRole
Events:
GetResource:
Type: Api
Properties:
Path: /books
Method: post
SAM模板规范提供了有关模板内容的完整详细信息。 模板的关键部分是:
- 定义两个资源,这两个资源都是由
AWS::Serverless::Function
属性标识的Lambda Function类型。 Lambda函数的名称由Resources.<resource>
定义。 - 每个处理程序的类由
Resources.<resource>.Properties.Handler
属性的值定义Resources.<resource>.Properties.Handler
- Java 8运行时用于运行
Resources.<resource>.Properties.Runtime
属性定义的Function - 该类的代码已上传到S3存储桶,在我们的示例中为
s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
-
Resources.<resource>.Properties.Environment.Variables.COUCHBASE_HOST
属性值定义了运行Couchbase的主机。 如Setup Couchbase中所述,可以轻松地将其部署在EC2上。 - 每个Lambda函数均由API触发。 使用AWS API Gateway进行部署。 该路径由
Events.GetResource.Properties.Path
定义。 HTTP方法是使用Events.GetResource.Properties.Method
属性定义的。
Java应用
包含Lambda函数的Java应用程序位于github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint 。
显示由HTTP GET
方法触发的Lambda函数:
public class BucketGetAll implements RequestHandler<GatewayRequest, GatewayResponse> {
@Override
public GatewayResponse handleRequest(GatewayRequest request, Context context) {
try {
N1qlQuery query = N1qlQuery
.simple(select("*")
.from(i(CouchbaseUtil.getBucketName()))
.limit(10));
String result = CouchbaseUtil.getBucket().query(query).allRows().toString();
return new GatewayResponse(200, result, GatewayResponse.HEADERS_JSON);
} catch (ConfigurationException e) {
return new GatewayResponse(400, e.getMessage(), GatewayResponse.HEADERS_TEXT);
}
}
}
一点解释:
- 每个Lambda函数都需要实现
com.amazonaws.services.lambda.runtime.RequestHandler
接口。 - API Gateway和Lambda集成需要特定的输入格式和输出格式 。 这些格式定义为
GatewayRequest
和GatewayResponse
类。 - 函数逻辑使用Couchbase Java SDK查询Couchbase数据库。 N1QL查询用于查询数据库。 然后将结果和异常包装在
GatewayRequest
和GatewayResponse
。
HTTP POST方法触发的Lambda函数也非常简单:
public class BucketPost implements RequestHandler<GatewayRequest, GatewayResponse> {
@Override
public GatewayResponse handleRequest(GatewayRequest request, Context context) {
try {
JsonDocument document = CouchbaseUtil.getBucket().upsert(Book.fromStringToJson(request.getBody()));
return new GatewayResponse(200, document.content().toString(), GatewayResponse.HEADERS_JSON);
} catch (Exception ex) {
return new GatewayResponse(400, ex.getMessage(), GatewayResponse.HEADERS_TEXT);
}
}
}
一点解释:
- 从
GatewayRequest
检索传入的请求有效负载 - 插入Couchbase中的文档将作为响应返回。
- 与前一种方法一样,函数逻辑使用Couchbase Java SDK查询Couchbase数据库。 然后将结果和异常包装在
GatewayRequest
和GatewayResponse
。
将Java应用程序构建为:
mvn -f microservice-http-endpoint/pom.xml clean package
将Lambda函数上传到S3
SAM模板从S3存储桶读取代码。 让我们创建一个S3存储桶:
aws s3 mb s3://serverless-microservice --region us-west-2
us-west-2
地区是API Gateway支持的地区之一 。 S3存储桶名称是全局唯一的,但它们的位置是特定于区域的。
将代码上传到S3存储桶:
aws s3 cp microservice-http-endpoint/target/microservice-http-endpoint-1.0-SNAPSHOT.jar s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
该代码现在已上传到S3存储桶。 SAM模板已准备就绪,可以部署!
部署SAM模板
部署SAM模板:
aws cloudformation deploy \
--template-file template.yml \
--stack-name microservice-gateway \
--region us-west-2
它显示输出:
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - microservice-gateway
此命令将部署Lambda函数以及触发这些Lambda函数的REST资源/ API。
调用微服务
API Gateway发布了可以由curl,wget,AWS CLI /控制台,Postman或任何其他可以调用REST API的应用程序调用的REST API。 该博客将使用AWS控制台显示交互。
位于us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis的 API网关主页显示:
单击API以查看此资源中的所有API:
单击POST以查看执行POST方法的默认页面:
单击测试以测试API:
将有效负载添加到请求主体中,然后单击“ Test
以调用API。 结果如下所示:
现在单击GET查看默认执行页面:
单击测试以测试API:
不需要请求主体,只需单击“测试”以调用API。 结果如下所示:
Couchbase数据库的输出显示在响应正文中。
参考资料
- 部署基于Lambda的应用程序
- 无服务器架构
- AWS API网关
- 使用Lambda和API网关创建简单的微服务
- Couchbase服务器文档
- Couchbase论坛
- 在@couchbasedev上关注我们
aws微服务器