Microservices 无服务器框架-一个APIGW端点下的两个服务

Microservices 无服务器框架-一个APIGW端点下的两个服务,microservices,amazon-cloudformation,aws-api-gateway,serverless-framework,Microservices,Amazon Cloudformation,Aws Api Gateway,Serverless Framework,如果我有两个服务,“用户”和“产品”,每个服务都有多个功能,每个功能都定义了端点(就像任何传统API一样),那么它们是否可以单独组织在一个代码库中(为了清晰起见),但部署后共享同一个API库URL?例如,考虑我有以下结构: /src -- /users ---- event.json ---- handler.js ---- serverless.yml -- /products ---- event.json ---- handler.js ---- serverless.yml mysrc

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

/src
-- /users
---- event.json
---- handler.js
---- serverless.yml
-- /products
---- event.json
---- handler.js
---- serverless.yml
my
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...
和另一个带有URL的
https://abcdevwxyz.execute-api....

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

我假设答案是‘不,因为云形成…’,但我想我会在这里发布这个问题只是为了讨论,并帮助我自己理解构建无服务器应用程序

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


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

您可以在一个serverless.yml中放置多个函数

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

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

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

谢谢,
Ryan

您可以使用自定义域名:

设置自定义域名(您需要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

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

usersModule.js:

export const doSomething = () => {
    // Do something here.
};
users/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来实现这一点。我还没有尝试过这个,所以我不知道它的效果如何。

我想出了自己的解决方案。我抽象了我的应用程序的集成点,这样我就有了特定的集成服务(API、S3、SNS等),这些服务响应事件,然后处理这些事件,并将它们委托给单独的微服务。我在上面写了一篇文章,其中有代码示例。

这是真的,但是这些服务是紧密耦合的,必须始终一起部署和管理。如果您想使服务保持明显的分离(但通过API层链接),那么这是行不通的。例如,服务名称必须相同。根据我的问题,我真的在寻找替代方案,因为它不适合顺利开发。我现在还没有准备好注册任何域名。