使用AWS无服务器应用程序模型和Couchbase的微服务

几个月前,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 。 为该资源发布了HTTP GETPOST方法。
  • 每个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属性定义的功能Resources.<resource>.Properties.Runtime
  • 该课程的代码已上传到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集成需要特定的输入格式输出格式 。 这些格式定义为GatewayRequestGatewayResponse类。
  • 函数逻辑使用Couchbase Java SDK查询Couchbase数据库。 N1QL查询用于查询数据库。 然后将结果和异常包装在GatewayRequestGatewayResponse

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数据库。 然后将结果和异常包装在GatewayRequestGatewayResponse

将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网关支持的地区之一 。 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数据库的输出显示在响应正文中。

参考文献

翻译自: https://www.javacodegeeks.com/2017/01/microservice-using-aws-serverless-application-model-couchbase.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值