无服务器 - 大型应用

时间:2017-12-21 06:34:34

标签: serverless-framework serverless serverless-architecture

我是无服务器框架的新手。

我正在启动一个具有多个路由的Rest API,例如:

获取用户/ {userid}

POST用户

获取帐户/ {accountid}

POST帐户

我需要2项服务 - 帐户+用户吗?

最佳做法是什么?如果2个服务然后2 serverless.yml?任何人都有无服务器大型应用程序的例子吗?

谢谢大家!

4 个答案:

答案 0 :(得分:2)

对于您的示例,它足以使用一个服务(serverless.yml)。

您可以在1个服务中使用一个lambda来处理usersaccounts个请求。

functions:
  <your-function-name>:
    handler: handler.execute
    events:
      - http:
          path: /user/{userid}
          method: get
      - http:
          method: post
          path: /user    
      - http:
          path: /account/{accountid}
          method: get
      - http:
          method: post
          path: /account

或者你可以创建2个lambdas(每个实体一个)

functions:
  user:
    handler: userHandler.execute
    events:
      - http:
        path: /user/{userid}
        method: get
      - http:
        method: post
        path: /user
  account:
    handler: accountHandler.execute
    events:
      - http:
        path: /account/{accountid}
        method: get
      - http:
          method: post
          path: /account

答案 1 :(得分:1)

这实际上取决于您想要的应用程序架构。 看看here,我认为它可以帮助您决定您想要什么。

如果您一度有很多端点,则可能需要2个服务,因为您将达到资源限制。如果您想为自己的应用设置一个网址,则可以随时设置pathmapping

resources:
  Resources:
    pathmapping:
      Type: AWS::ApiGateway::BasePathMapping
      Properties:
        BasePath: <your base for this service>
        DomainName: mydomain.com
        RestApiId:
            Ref: ApiGatewayRestApi
        Stage: dev

答案 2 :(得分:1)

用几句话-如您所愿。 从技术上讲:您可以将多个函数聚合为一个,然后根据事件参数属性调用特定的函数。此外,您可以在AWS lambdas(或其他FaaS)中运行express / koa服务器,而不会遇到任何麻烦。
+作为奖励,您可以使用ANY{any+}

    events:
  - http:
      path: /foo
      method: ANY
  - http:
      path: /foo/{any+}
      method: ANY

但总的来说-取决于情况。如果您经常调用特定的端点,那么最好将其移至独立的lambda。如果您知道很少调用端点基准,最好将它们汇总在一个lambda下。特别是如果您使用热身。

答案 3 :(得分:0)

我喜欢架构的一件事是没有正确的答案,但是最适合您的问题/情况。最重要的是,最佳/良好做法是在所有方面都可以帮助您的指南。

就我而言,我在代码中增加了复杂性,因此我的CRUD路径非常简单。 cms / {entity}或cms / {entity} / {id}。实体意味着我的集合在我的后端,所以我知道该使用哪种模型。

将此问题应用到您的问题中,您将得到类似的信息:

GET {entity}/{userid}
POST {entity}

使用此解决方案,您不必为在数据库中创建的每个新实体创建函数。它还具有SOLID原则的开放式概念。