5

如果我有两个服务,“用户”和“产品”,每个服务都有几个函数,每个函数都定义了端点(就像任何传统的 API 一样),它们是否可以在代码库中单独组织(为了清楚起见)但是一旦部署共享相同的 API 基本 URL?例如,考虑我有以下结构:

/src
-- /users
---- event.json
---- handler.js
---- serverless.yml
-- /products
---- event.json
---- handler.js
---- serverless.yml

src/users/serverless.yml的定义如下:

functions:
  create:
    handler: handler.create
    events:
      - http: POST user

  read:
    handler: handler.read
    events:
      - http: GET user

和我src/products/serverless.yml的基本相同,只需将“用户”换成“产品”。

目前,这两种服务都将部署到截然不同的 API 端点,一个带有 URL https://fghijklmnop.execute-api...,另一个带有 URLhttps://abcdevwxyz.execute-api....

我的问题是,是否可以部署这些服务但仍保留在具有单个 URL 的单个 API 下(因此两者都将在 URL 下提供https://abcdevwxyz.execute-api....)?

我假设答案是“不,因为 Cloud Formation ...”,但我想我只是为了讨论和帮助我自己理解构建无服务器应用程序而在此处发布问题。

根据此处的答案,我知道使用自定义域,但是对于更快的开发周期,这并不是一个理想的解决方案。

到目前为止,我唯一的解决方案是简单地创建一个名为“api”的服务,该服务将包含我的 API 需要的所有端点,这些端点将直接调用我的其他服务的 Lambda 函数,而不是通过以前配置的端点。实际上,这将是一个抽象层,但会为我的应用程序添加可能不必要的层。再次,很好奇社区对此的感受。

4

5 回答 5

1

您可以将多个功能放在一个 serverless.yml

/src
-- event.json
-- users.handler.js
-- products.handler.js
-- serverless.yml
于 2016-09-12T13:34:46.827 回答
1

我不能直接谈论无服务器框架支持,但这在 API Gateway 中肯定是可能的。

您可以为每个“子 API”维护多个 Swagger 文件,并使用 import?mode=merge 将两个定义导入同一个 API。

请参阅 http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-import-api.html

谢谢,瑞安

于 2016-09-12T21:03:42.657 回答
1

我对自己的代码所做的是将所有代码从 handler.js 文件中提取出来并将其放入模块中。这些模块将需要到 handler.js 文件中,然后将调用一个简单的函数。

usersModule.js:

export const doSomething = () => {
    // Do something here.
};

用户/handler.js:

import {doSomething} from '../.../usersModule.js';

export const handler = ( event, context, callback ) => {
    doSomething();
    // Do other stuff...
    callback( null, "Success" );
};

这样,您可以将代码的核心放在任何您想要的地方,以任何对您有意义的方式进行组织。

但是,您仍然必须定义一个 API。或者使用 RyanG-AWS 的答案来合并 API。


如果您仍然希望将代码和 API 定义分开,您可以分别创建用户 API 和产品 API。然后,您将拥有另一个组合 API,可以调用这些 API 中的任何一个。因此,通过这种方式,您将拥有一个服务,该服务具有您将调用的单个基本 URL。您可以使用集成类型 HTTP 执行此操作。这个我没试过,不知道效果如何。

于 2016-09-24T05:33:56.833 回答
0

您可以使用自定义域名:http ://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

设置自定义域名(您需要 SSL 证书)http://myapi.com/

然后映射您的 api:

http://myapi.com/users
http://myapi.com/products 

只需像这样调用您的函数:

http://myapi.com/users/create
http://myapi.com/users/read
http://myapi.com/products/whaterver
于 2016-09-12T23:07:02.943 回答
0

我想出了自己的解决方案来解决这个问题。我抽象了我的应用程序的集成点,以便我拥有特定的集成服务(API、S3、SNS 等),它们响应事件,然后处理这些事件并将它们委托给单独的微服务。我写了一篇关于它的文章,带有代码示例。

于 2017-03-10T09:43:08.340 回答