aws lambda只能暴露一个spring boot api

问题描述 投票:-1回答:1

我用弹簧靴开发了4个apis。现在我试图为无服务器启用aws lambda。是否有可能用单个lambda暴露4个api。

java amazon-web-services spring-boot aws-lambda microservices
1个回答
0
投票

是否有可能用单个lambda暴露4个api。

AWS lambda是FaaS - 作为服务的功能,每个Lambda一个功能。

但是,您可以使用包装器/代理函数作为入口点来实现预期的功能,并根据需要将请求路由到上游方法/函数

它在这里描述aws api gateway & lambda: multiple endpoint/functions vs single endpoint

enter image description here

请查看以下有关创建API网关的文档=> Lambda代理集成:http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html

以下仅仅是对aws api gateway & lambda: multiple endpoint/functions vs single endpoint所给出的内容的重写解释。

AWS示例有一个很好的解释; Lambda请求如下:

POST /testStage/hello/world?name=me HTTP/1.1
Host: gy415nuibc.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
headerName: headerValue

{
    "a": 1
}

最终会将以下事件数据发送到您的AWS Lambda函数:

{
  "message": "Hello me!",
  "input": {
    "resource": "/{proxy+}",
    "path": "/hello/world",
    "httpMethod": "POST",
    "headers": {
      "Accept": "*/*",
      "Accept-Encoding": "gzip, deflate",
      "cache-control": "no-cache",
      "CloudFront-Forwarded-Proto": "https",
      "CloudFront-Is-Desktop-Viewer": "true",
      "CloudFront-Is-Mobile-Viewer": "false",
      "CloudFront-Is-SmartTV-Viewer": "false",
      "CloudFront-Is-Tablet-Viewer": "false",
      "CloudFront-Viewer-Country": "US",
      "Content-Type": "application/json",
      "headerName": "headerValue",
      "Host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
      "Postman-Token": "9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f",
      "User-Agent": "PostmanRuntime/2.4.5",
      "Via": "1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)",
      "X-Amz-Cf-Id": "pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==",
      "X-Forwarded-For": "54.240.196.186, 54.182.214.83",
      "X-Forwarded-Port": "443",
      "X-Forwarded-Proto": "https"
    },
    "queryStringParameters": {
      "name": "me"
    },
    "pathParameters": {
      "proxy": "hello/world"
    },
    "stageVariables": {
      "stageVariableName": "stageVariableValue"
    },
    "requestContext": {
      "accountId": "12345678912",
      "resourceId": "roq9wj",
      "stage": "testStage",
      "requestId": "deef4878-7910-11e6-8f14-25afc3e9ae33",
      "identity": {
        "cognitoIdentityPoolId": null,
        "accountId": null,
        "cognitoIdentityId": null,
        "caller": null,
        "apiKey": null,
        "sourceIp": "192.168.196.186",
        "cognitoAuthenticationType": null,
        "cognitoAuthenticationProvider": null,
        "userArn": null,
        "userAgent": "PostmanRuntime/2.4.5",
        "user": null
      },
      "resourcePath": "/{proxy+}",
      "httpMethod": "POST",
      "apiId": "gy415nuibc"
    },
    "body": "{\r\n\t\"a\": 1\r\n}",
    "isBase64Encoded": false
  }
}

现在您可以访问所有标题,url参数,正文等。因此,您可以使用它来在您的包装器/代理Lambda函数中以不同方式处理请求,并根据您的路由需求路由到上游函数。

今天许多人正在使用这种方法,而不是为每个方法和api网关资源创建lambda函数。

这种方法有利有弊

  • 部署:如果每个lambda函数都是离散的,那么您可以单独部署它们,这可以降低代码更改带来的风险(微服务策略)。相反,您可能会发现需要单独部署功能会增加复杂性并且非常繁琐。
  • 自我描述:API Gateway的界面使您可以非常直观地查看RESTful端点的布局 - 名词和动词一目了然。实现您自己的路由可能会牺牲这种可见性。
  • Lambda大小和限制:如果您代理所有 - 那么您最终需要选择适合所有RESTful端点的实例大小,超时等。如果创建离散函数,则可以更仔细地选择最符合特定调用需求的内存占用,超时,死信行为等。

更多关于Monolithic lambda vs Micro Lambdahttps://hackernoon.com/aws-lambda-should-you-have-few-monolithic-functions-or-many-single-purposed-functions-8c3872d4338f

© www.soinside.com 2019 - 2024. All rights reserved.