5

Nếu tôi có hai dịch vụ, 'Người dùng' và 'Sản phẩm', mỗi dịch vụ có một số chức năng với điểm cuối được xác định cho mỗi (như bất kỳ API truyền thống nào), có thể cho chúng được tổ chức riêng biệt trong cơ sở mã (để rõ ràng) nhưng một khi được triển khai chia sẻ cùng một URL cơ sở API? Ví dụ, hãy xem xét tôi có cấu trúc sau:Serverless Framework - Hai dịch vụ dưới một điểm cuối APIGW

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

src/users/serverless.yml tôi có định nghĩa sau đây:

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

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

src/products/serverless.yml tôi đã cơ bản được điều tương tự, chỉ cần hoán đổi 'sử dụng' cho 'sản phẩm' .

Hiện nay, cả những dịch vụ này sẽ được triển khai điểm cuối API để khác biệt rõ rệt, một với một URL https://fghijklmnop.execute-api... và khác với một URL https://abcdevwxyz.execute-api....

Câu hỏi của tôi là, nó sẽ có thể để có những dịch vụ này được triển khai nhưng vẫn trong một API duy nhất có một URL duy nhất (vì vậy cả hai URL sẽ được phân phát dưới URL https://abcdevwxyz.execute-api....)?

Tôi giả sử câu trả lời là 'Không, bởi vì Cloud Formation ...', nhưng tôi nghĩ tôi sẽ đăng câu hỏi ở đây chỉ vì mục đích thảo luận và giúp tôi hiểu về việc xây dựng ứng dụng không cần máy chủ.

Tôi biết sử dụng Miền tùy chỉnh, theo the answer here, nhưng đối với chu kỳ phát triển nhanh hơn, đây không thực sự là giải pháp lý tưởng. Giải pháp duy nhất của tôi cho đến nay sẽ đơn giản là tạo một dịch vụ gọi là 'api' chứa tất cả các điểm cuối API của tôi sẽ chỉ cần gọi các hàm Lambda của các dịch vụ khác trực tiếp thay vì thông qua các điểm cuối được cấu hình trước đó. Nó sẽ là một lớp trừu tượng, thực sự, nhưng thêm các lớp có khả năng không cần thiết vào ứng dụng của tôi. Một lần nữa, tò mò muốn xem những gì cộng đồng cảm thấy về điều này.

Trả lời

0

Tôi đã đưa ra giải pháp của riêng mình cho vấn đề này. Tôi tóm tắt các điểm tích hợp của ứng dụng để tôi có các dịch vụ tích hợp cụ thể (API, S3, SNS, v.v.) phản hồi các sự kiện và sau đó xử lý các sự kiện đó và ủy quyền chúng để tách các dịch vụ nhỏ. Tôi đã viết một article trên đó, với các ví dụ mã.

1

Bạn có thể đặt nhiều chức năng trong một serverless.yml

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

Điều này đúng, nhưng sau đó các dịch vụ này được kết hợp chặt chẽ và phải luôn được triển khai và quản lý cùng nhau. Nếu bạn muốn giữ các dịch vụ tách riêng biệt (nhưng được liên kết qua một lớp API) thì điều này không hoạt động. Tên dịch vụ phải giống nhau, ví dụ. –

1

Tôi không thể nói chuyện trực tiếp để hỗ trợ khung serverless, nhưng điều này chắc chắn là có thể trong API Gateway.

Bạn có thể duy trì nhiều tệp Swagger cho từng "API phụ" và sử dụng chế độ nhập? Chế độ = hợp nhất để nhập cả hai định nghĩa vào cùng một API.

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

Cảm ơn, Ryan

0

Bạn có thể sử dụng tên miền tùy chỉnh: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

thiết lập tên miền tùy chỉnh (bạn sẽ cần một chứng chỉ SSL) http://myapi.com/

sau đó ánh xạ apis của bạn:

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

Chỉ cần gọi chức năng của bạn như thế này:

http://myapi.com/users/create 
http://myapi.com/users/read 
http://myapi.com/products/whaterver 
+0

Theo câu hỏi của tôi, tôi thực sự đang tìm kiếm các giải pháp thay thế cho điều này vì nó không phù hợp để phát triển trơn tru. Tôi chưa sẵn sàng đăng ký bất kỳ miền nào ngay bây giờ. –

1

Những gì tôi đã làm với mã của riêng tôi là để kéo tất cả các mã ra khỏi các tập tin handler.js và đặt nó module bên trong.Các mô-đun này sẽ được yêu cầu vào các tệp handler.js và một hàm đơn giản sau đó sẽ được gọi.

usersModule.js:

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

người dùng/handler.js:

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

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

Bằng cách này, bạn có thể đặt thịt của mã của bạn bất cứ nơi nào bạn muốn có nó, tổ chức trong bất cứ điều gì có ý nghĩa với bạn.

Tuy nhiên, bạn vẫn phải có một API được xác định. Hoặc sử dụng câu trả lời từ RyanG-AWS để hợp nhất các API.


Nếu bạn vẫn muốn tách riêng các định nghĩa mã và API, bạn có thể tạo riêng API người dùng và API sản phẩm. Sau đó, bạn sẽ có một API kết hợp khác sẽ gọi một trong hai API này. Vì vậy, theo cách này, bạn sẽ có một dịch vụ duy nhất với một URL cơ sở duy nhất mà bạn sẽ gọi. Bạn có thể làm điều này với HTTP kiểu tích hợp. Tôi đã không thử điều này, vì vậy tôi không biết nó sẽ hoạt động tốt như thế nào.

Các vấn đề liên quan