2017-01-01 30 views
1

我搞砸了AWS,我已經使用dynamodb,api網關和cognito設置了一個簡單的REST API。我使用node + express編寫了REST API。AWS後端+響應前端:處理請求

我的節點應用程序在EB上,基本上我使用cognito處理API網關中的請求的身份驗證。作爲獨立的,這似乎工作正常,因爲我使用簡單的反應應用程序進行測試。

現在我正在爲我的實際反應應用程序做服務器端渲染,所以我試圖找出處理這個問題的最佳方法。對於服務器端渲染,我有另一個名爲react-app-server的節點應用程序,並且我想要處理API網關上的緩存並使用cloudfront來提供靜態文檔,圖像等。

所以如果我去了www.mysite.com/for-sale/some-item-thats-for-sale ,這個請求應該首先檢查是否有這個頁面的緩存版本並提供它。否則,我需要讓我的react-app-server呈現.html並提供/緩存它。由於有兩個節點應用程序,api-server和react-app-server,我如何從我的api-gateway指向react-app-server來呈現html?

這種情況如何適應AWS體系結構?我意識到這可能是一個非常愚蠢的問題,但我對此很新。謝謝

+0

爲什麼要讓API網關提供HTML? –

+0

對於混淆感到抱歉。正如我剛纔提到的那樣,我第一次只花了幾天的時間,對我來說有點尷尬,因爲這是全新的。我試圖弄清楚如何處理必須首次渲染頁面,如果它不存在於緩存中。爲此,我必須以某種方式打我的「react-app-server」,這是我的斷開。所以我正在考慮使用Lambda來執行我的渲染函數,它將呈現HTML並將其添加到緩存中,但我不確定這是否是正確的方法。 – user1354934

+0

如何正確緩存HTML? –

回答

1

我建議您將Cloudfront放置在所有應用程序前面,並允許Cloudfront使用您在每個HTML響應中返回的Cache-ControlExpires標題來處理所有緩存。這將允許從Cloudfront邊緣服務器返回所有緩存的內容,從而提高性能並簡化您的應用。例如,如果您的節點應用程序返回帶有Cache-Control: public, max-age=31536000標題的HTML文檔,則Cloudfront將讀取該值,並將從邊緣服務器返回長達一年的相同HTML響應(31,536,000秒= 1年)。如果您的節點應用程序返回一個帶有Cache-Control: public, max-age=3600的HTML文檔,Cloudfront將讀取該值並在邊緣服務器上將HTML緩存長達1小時。

您可以在發行版中定義兩個(或多個)來源,並且您可以使用行爲來控制每個請求將委派給哪個來源。

我其實剛剛在API網關前面寫了一篇關於使用Cloudfront的教程:https://www.codeengine.com/articles/process-form-aws-api-gateway-lambda/。這與您的用例不同,但如果您希望在API網關前使用Cloudfront,則可以幫助您開始使用。

如果您按照本教程的話,可以看到我服務的是來自S3存儲桶的大多數請求,但是路由路徑從/rest/開始到API Gateway,相信也可以用於您的用例。

+0

謝謝戴夫。這是一篇不錯的文章。我想我的大問題將是我在節點端呈現HTML,現在儀式將呈現的頁面存儲在內存中。如果我將呈現的HTML導出到s3存儲桶,然後使用雲端陣列,會更好嗎?對不起,我仍然有點困惑......有這麼多的信息:P所以基本上客戶端點擊某個頁面(看一輛二手車或什麼) - >節點呈現該頁面,如果它不存在 - >現在只是從內存中提供服務,但是把它放到s3然後是cloudfront? – user1354934

+0

我不確定S3層會提供多少優勢,除非您計劃預先填充所有HTML?如果您只是使用'Cache-Control'或'Expires'標頭從API網關返回HTML並將Cloudfront配置爲遵循原始標頭,則它將在邊緣緩存內容,並且對同一HTML的後續請求不會返回到原點(節點API),直到在這些頭文件中指定的過期時間。 –

+0

另一方面,如果您希望在每次部署時都提前構建HTML的100%(例如Jekyll),那麼在Cloudfront後面使用S3存儲區肯定是一種可行的方法。 –

1

CloudFront是一個內容交付網絡,旨在通過將文件的副本放置在邊緣位置來減少世界各地訪問者的延遲和傳輸時間。它具有緩存功能,因此使用正確的設置,您應該能夠從react-prerenderer中檢索靜態內容並緩存它們。

API網關的構建是爲了提供動態內容,並且只能在AWS的主要可用區域運行,而不是在邊緣位置運行。如果可能的話,通過API網關將請求路由到CloudFront會很奇怪。

另一種可能性是在應用程序中處理緩存(例如在Express中,您可以使用use mcache)。

+0

謝謝!實際上,我在我的節點應用程序中緩存不使用mcache只是一個簡單的字典。試圖瞭解所有這些東西如何融合在「現實世界」中,以及如何閱讀:D如何處理爲網頁提供正確的HTML文檔,例如,如果有人點擊了「/ for-sale/some-item-123 ',我如何向他們發送緩存的HTML? – user1354934