Wdrażanie zawartości statycznej w usłudze magazynu opartej na chmurze, która może dostarczyć ją bezpośrednio do klienta. Może ono zmniejszyć zapotrzebowanie na potencjalnie kosztowne wystąpienia obliczeniowe.
Kontekst i problem
Aplikacje internetowe zazwyczaj zawierają jakieś elementy zawartości statycznej. Zawartość statyczna może obejmować strony HTML i inne zasoby, takie jak obrazy i dokumenty, które są dostępne dla klienta jako część strony HTML (np. wbudowane obrazy, arkusze stylów i pliki JavaScript po stronie klienta) lub jako osobne pliki do pobrania (np. dokumenty PDF).
Mimo że serwery internetowe są zoptymalizowane pod kątem dynamicznego renderowania i buforowania danych wyjściowych, nadal muszą obsługiwać żądania pobierania zawartości statycznej. Powoduje to zużycie cykli przetwarzania, które często można wykorzystać w lepszy sposób.
Rozwiązanie
W większości środowisk hostingu w chmurze niektóre zasoby aplikacji i strony statyczne można umieścić w usłudze magazynu. Usługa magazynu może obsługiwać żądania dla tych zasobów, zmniejszając obciążenie zasobów obliczeniowych obsługujących inne żądania internetowe. Koszt magazynu hostowanego w chmurze jest zwykle dużo mniejszy niż koszt wystąpień obliczeniowych.
W przypadku hostowania niektórych części aplikacji w usłudze magazynu najważniejsze kwestie są związane z wdrożeniem aplikacji oraz zabezpieczaniem zasobów, które nie mają być dostępne dla użytkowników anonimowych.
Problemy i kwestie do rozważenia
Podczas podejmowania decyzji o sposobie wdrożenia tego wzorca należy rozważyć następujące punkty:
Hostowana usługa magazynu musi udostępniać punkt końcowy HTTP, do którego użytkownicy mogą uzyskać dostęp, aby pobrać zasoby statyczne. Niektóre usługi magazynu obsługują także protokół HTTPS, dlatego istnieje możliwość hostowania zasobów w usługach magazynu wymagających protokołu SSL.
Aby uzyskać maksymalną wydajność i dostępność, rozważ buforowanie zawartości kontenera magazynu w wielu centrach danych na całym świecie przy użyciu sieci dostarczania zawartości (CDN). Jednak korzystanie z usługi CDN prawdopodobnie będzie wymagało opłat.
Domyślnie konta magazynu często korzystają z replikacji geograficznej, aby zapewnić odporność na zdarzenia, które mogą mieć wpływ na centrum danych. Oznacza to, że adres IP może ulec zmianie, ale adres URL pozostanie taki sam.
Gdy część zawartości znajduje się na koncie magazynu, a inna zawartość znajduje się w hostowanym wystąpieniu obliczeniowym, staje się trudniejsze do wdrożenia i zaktualizowania aplikacji. Może być konieczne przeprowadzenie oddzielnych wdrożeń oraz wersjonowanie aplikacji i zawartości w celu łatwiejszego zarządzania nią — szczególnie wtedy, gdy zawartość statyczna zawiera pliki skryptów lub składniki interfejsu użytkownika. Jednak jeśli mają zostać zaktualizowane tylko zasoby statyczne, można po prostu przekazać je na konto magazynu bez konieczności ponownego wdrażania pakietu aplikacji.
Usługi magazynu mogą nie obsługiwać korzystania z niestandardowych nazw domen. W takim przypadku należy określić pełny adres URL zasobów w linkach, ponieważ będą one znajdować się w innej domenie niż dynamicznie generowana zawartość zawierająca linki.
Kontenery magazynu muszą być skonfigurowane na potrzeby publicznego dostępu do odczytu, ale koniecznie należy upewnić się, że nie skonfigurowano dla nich publicznego dostępu do zapisu, aby uniemożliwić użytkownikom przekazywanie zawartości.
Rozważ użycie klucza lub tokenu valet, aby kontrolować dostęp do zasobów, które nie powinny być dostępne anonimowo. Aby uzyskać więcej informacji, zobacz wzorzec klucza valet.
Kiedy używać tego wzorca
Ten wzorzec jest przydatny w przypadku:
Minimalizacja kosztu hostingu witryn internetowych i aplikacji zawierających jakieś zasoby statyczne.
Minimalizacja kosztu hostingu witryn internetowych składających się tylko z zawartości statycznej i zasobów. W zależności od możliwości systemu magazynu dostawcy hostingu może być możliwe całkowite hostowanie w pełni statycznej witryny internetowej na koncie magazynu.
Udostępnianie zasobów statycznych i zawartości dla aplikacji działających w innych środowiskach hostingu lub na innych serwerach lokalnych.
Wyszukiwanie zawartości w więcej niż jednym obszarze geograficznym przy użyciu sieci dostarczania zawartości, która buforuje zawartość konta magazynu w wielu centrach danych na całym świecie.
Monitorowanie kosztów i użycia przepustowości. Używając oddzielnego konta magazynu dla części lub całości zawartości statycznej, można łatwiej oddzielić koszty hostingu od kosztów środowiska wykonawczego.
Ten wzorzec może nie być użyteczny w następujących sytuacjach:
Aplikacja musi wykonać jakieś operacje przetwarzania na zawartości statycznej przed dostarczeniem jej do klienta. Na przykład może być konieczne dodanie sygnatury czasowej do dokumentu.
Ilość zawartości statycznej jest bardzo mała. Koszty pobierania tej zawartości z oddzielnego magazynu mogą przeważyć zalety oddzielenia jej od zasobu obliczeniowego.
Projekt obciążenia
Architekt powinien ocenić, w jaki sposób wzorzec hostingu zawartości statycznej może być używany w projekcie obciążenia, aby sprostać celom i zasadom opisanym w filarach platformy Azure Well-Architected Framework. Na przykład:
Filar | Jak ten wzorzec obsługuje cele filaru |
---|---|
Optymalizacja kosztów koncentruje się na utrzymaniu i poprawie zwrotu obciążenia z inwestycji. | Hosty aplikacji dynamicznych są zwykle droższe niż hosty statyczne, ponieważ hosty dynamiczne mogą uruchamiać zakodowaną logikę biznesową. Korzystanie z platformy aplikacji w celu dostarczania zawartości statycznej nie jest opłacalne. - CO:09 Koszty przepływu - CO:10 Koszty danych |
Wydajność pomaga wydajnie sprostać zapotrzebowaniu dzięki optymalizacjom skalowania, danych, kodu. | Odciążanie odpowiedzialności za zewnętrznego hosta pomaga ograniczyć przeciążenie i umożliwia używanie platformy aplikacji tylko do dostarczania logiki biznesowej. - PE:07 Kod infrastruktury |
Podobnie jak w przypadku każdej decyzji projektowej, należy rozważyć wszelkie kompromisy w stosunku do celów innych filarów, które mogą zostać wprowadzone przy użyciu tego wzorca.
Przykład
Usługa Azure Storage obsługuje obsługę zawartości statycznej bezpośrednio z kontenera magazynu. Pliki są obsługiwane za pośrednictwem anonimowych żądań dostępu. Domyślnie pliki mają adres URL w poddomenie typu core.windows.net
, na przykład https://contoso.z4.web.core.windows.net/image.png
. Możesz skonfigurować niestandardową nazwę domeny i użyć usługi Azure CDN, aby uzyskać dostęp do plików za pośrednictwem protokołu HTTPS. Aby uzyskać więcej informacji, zobacz Statyczna witryna internetowa hostująca w usłudze Azure Storage.
Statyczna witryna internetowa hostująca udostępnia pliki na potrzeby dostępu anonimowego. Jeśli musisz kontrolować, kto może uzyskiwać dostęp do plików, możesz przechowywać pliki w usłudze Azure Blob Storage, a następnie generować czas i zakres ograniczone sygnatury dostępu współdzielonego w celu ograniczenia dostępu. Wygenerowane sygnatury dostępu powinny używać tokenów delegowanych użytkowników firmy Microsoft i być krótkotrwałe.
Linki na stronach dostarczonych do klienta muszą określać pełny adres URL zasobu. Jeśli zasób jest chroniony za pomocą klucza valet, takiego jak sygnatura dostępu współdzielonego, ten podpis musi być uwzględniony w adresie URL.
Przykładowa aplikacja, która demonstruje używanie magazynu zewnętrznego dla zasobów statycznych, jest dostępna w witrynie GitHub. W tym przykładzie użyto pliku konfiguracji do określenia adresu URL konta magazynu i kontenera zawierającego publiczną, statyczną zawartość.
Klasa StaticContentUrlHtmlHelper
w pliku StaticContentUrlHtmlHelper.cs udostępnia metodę o nazwie StaticContentUrl
, która generuje adres URL zawierający ścieżkę do konta magazynu w chmurze, jeśli przekazany adres URL zaczyna się od znaku ścieżki katalogu głównego ASP.NET (~).
public static class StaticContentUrlHtmlHelper
{
public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
{
if (contentPath.StartsWith("~"))
{
contentPath = contentPath.Substring(1);
}
contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
contentPath.TrimStart('/'));
var url = new UrlHelper(helper.ViewContext.RequestContext);
return url.Content(contentPath);
}
}
Plik Index.cshtml w folderze Views\Home zawiera element obrazu, który używa metody StaticContentUrl
do tworzenia adresu URL dla jego atrybutu src
.
<img src="@Html.StaticContentUrl("~/media/orderedList1.png")" alt="Test Image" />
Następne kroki
- Przykład hostingu zawartości statycznej. Przykładowa aplikacja, która demonstruje ten wzorzec.
Powiązane zasoby
- Wzorzec klucza portiera. Jeśli zasoby docelowe nie mają być dostępne dla użytkowników anonimowych, użyj tego wzorca, aby ograniczyć bezpośredni dostęp.
- Bezserwerowa aplikacja internetowa na platformie Azure. Architektura referencyjna, która używa statycznej witryny internetowej hostingu z usługą Azure Functions do implementowania bezserwerowej aplikacji internetowej.