Top Azure PaaS Services That Developers Love and Why

Chmura Microsoft Azure oferuje wiele usług dla prawie każdego scenariusza, który może być potrzebny. Możesz skategoryzować te usługi na typy chmury obliczeniowej, takie jak IaaS, PaaS i SaaS, aby określić ilość kontroli i odpowiedzialności, jaką masz, w porównaniu z czasem, jaki możesz poświęcić na budowanie rzeczy, które mają znaczenie.

Pozwól mi wyjaśnić te typy nieco dalej:

IaaS (Infrastructure-as-a-Service)

Typowe usługi IaaS to usługi kontenerowe i maszyny wirtualne. Pozwalają one na dużą kontrolę nad tym, jak je uruchomić, ale wymagają również odpowiedzialności za takie rzeczy jak system operacyjny, antywirus i równoważenie obciążenia. Z tego powodu Ty i Twój zespół możecie poświęcić mniej czasu na pracę nad dodawaniem wartości biznesowej.

PaaS (Platform-as-a-Service)

Przykładami usług PaaS są App Services, Azure Search i Azure CDN. Nie musisz się martwić o system operacyjny, a nawet o serwer, możesz po prostu uruchomić swoją aplikację. Jesteś odpowiedzialny za niektóre konfiguracje serwera, takie jak skalowanie, chociaż w przypadku niektórych usług, takich jak Azure Functions, dzieje się to automatycznie.

SaaS (Software-as-a-Service)

Przykładami usług SaaS są rzeczy takie jak Azure IoT Suite i Office 365. SaaS jest najwyższym poziomem abstrakcji i pozwala po prostu korzystać z aplikacji, nie trzeba jej nawet budować. Wystarczy ją skonfigurować. Nie trzeba się martwić o system operacyjny, ani nawet o skalowanie aplikacji. Pozwala to na pracę nad wartością biznesową, ale oferuje niewielką kontrolę nad aplikacją.

Dla twórców oprogramowania, PaaS jest świetnym typem chmury obliczeniowej do wykorzystania. Masz wystarczającą kontrolę, aby po prostu pracować nad swoją aplikacją i dostosować ją tak, aby była w sam raz i nie musisz się martwić o wszystkie rzeczy związane z operacjami. Rzeczy po prostu działają bez martwienia się o poprawki OS lub równoważenie obciążenia.

Azure ma bardzo silną ofertę PaaS, która jest bardzo atrakcyjna dla programistów. W tym artykule omówimy najlepsze usługi Azure PaaS dla programistów, które mogą sprawić, że Twoja aplikacja będzie lepsza.

Top Azure PaaS Services

Jedną z podstawowych usług Azure PaaS jest Azure App Services. Usługi Azure App Services zapewniają wiele typów usług, z których każdy jest ukierunkowany na hosting aplikacji lub logiki biznesowej dla konkretnego przypadku użycia. Dodatkowo, typy App Service dzielą wspólne możliwości, takie jak automatyczne skalowanie, uwierzytelnianie i autoryzacja oraz niestandardowe domeny i SSL.

Przejrzyjmy typy App Service:

Web Apps

Azure App Service Web Apps są niezbędne, jeśli chcesz hostować standardową aplikację internetową ASP.NET. Aplikacje Web Apps są abstrakcją serwera WWW, takiego jak IIS lub Tomcat, i mogą uruchamiać aplikacje napisane w .NET, PHP, Pythonie, Node.js, Javie i innych. Są bardzo łatwe do skonfigurowania i zapewniają wiele korzyści, takich jak fakt, że domyślnie są dostępne przez 99,95% czasu. Nie musisz się martwić o przestoje. Usługi App Services są obecnie dostępne dla systemów Windows i Linux.

Aplikacje mobilne

Azure może również pomóc w tworzeniu aplikacji mobilnych. Możesz hostować backend dla swojej aplikacji mobilnej w Azure App Services Mobile Apps. Możesz łatwo połączyć się z tym backendem za pomocą SDK dla Azure Mobile Apps, które są dostępne dla IOS, Android, Windows, Xamarin.IOS, Xamarin.Android i Xamarin.Forms.

Mobilny backend zapewnia kilka unikalnych korzyści. Jedną z nich jest możliwość synchronizacji w trybie offline. Dzięki temu użytkownik może kontynuować pracę z aplikacją, jeśli jest offline i synchronizować dane z powrotem do backendu, gdy ponownie pojawi się online. Inną możliwością jest push notifications. Pozwala to na wysyłanie powiadomień o Twojej aplikacji na urządzenie użytkownika. Ponadto aplikacje mobilne mają wszystkie te same możliwości, które mają aplikacje sieciowe, takie jak automatyczne skalowanie i wysoka dostępność.

Aplikacje logiczne

Usługi aplikacji Azure Aplikacje logiczne różnią się od aplikacji sieciowych i mobilnych tym, że nie hostujesz w nich aplikacji, ale orkiestrujesz logikę biznesową za ich pomocą. Pomyśl o aplikacjach logicznych jako o sposobie automatyzacji procesu biznesowego poprzez jego konfigurację.

Aplikacja logiczna jest uruchamiana przez wyzwalacz. Może to być czas (co 15 minut) lub zewnętrzne źródło, jak np. nowa wiadomość w kolejce. Wyzwalacz przekazuje do przepływu pracy wartości (takie jak zawartość wiadomości z kolejki), które mogą być użyte w całej aplikacji logicznej. Reszta przepływu Logic App składa się z wywołań Connectors, które są API do usług firm trzecich, takich jak Office365 lub Twitter lub własnych API.

Logic Apps skalują się automatycznie i płacisz za nie tylko wtedy, gdy są uruchomione. Jest to czasami nazywane „bezserwerowym”, ponieważ oznacza to, że możesz całkowicie skupić się na swojej aplikacji lub logice, a nie na infrastrukturze bazowej.

Azure Functions

Azure App Services Function Apps mogą hostować jedną lub więcej funkcji Azure. Używasz Azure Functions do hostowania małych aplikacji, takich jak zadania w tle lub mikrousługi, które działają tylko przez krótki okres czasu.

Azure Functions mogą być wyzwalane przez konfigurowalne timery, takie jak harmonogram (co 15 minut) lub przez zewnętrzną usługę, taką jak kiedy nowy Blob jest dodawany do Azure Blob Storage. Po wyzwoleniu, kod w funkcji Azure może użyć wartości z wyzwalacza, jak np. dodanego Bloba. Możesz również dodać wiązania wyjściowe do funkcji Azure, aby wyprowadzić wartość do zewnętrznej usługi, bez pisania jakiejkolwiek hydrauliki. Może to być na przykład wyjście Blob Storage, gdzie po prostu zwracasz Blob bez konieczności pisania kodu, aby połączyć się z Azure Storage.

Tak jak Logic Apps, Azure Functions są „bezserwerowe”, ponieważ skalują się automatycznie i płacisz za nie tylko wtedy, gdy są uruchamiane.

Azure WebJobs

Innym sposobem na uruchamianie zadań w tle jest uruchamianie ich w Azure WebJobs. WebJobs są częścią App Services i działają wewnątrz App Service, jak Web App lub Mobile App. W WebJobs można pisać i hostować kod, który jest uruchamiany przez wyzwalacz, taki jak timer (co 15 minut) lub usługę zewnętrzną, taką jak nowa wiadomość w kolejce.

WebJobs działają podobnie do Azure Functions, ponieważ uruchamiają małe fragmenty kodu, które mogą być wyzwalane przez zewnętrzne źródła, które nie wymagają żadnego kodu hydraulicznego do skonfigurowania.

Różnią się od Azure Functions tym, że trzeba je skalować ręcznie. Płacisz za usługę App Service, która hostuje twoje WebJob, co jest miesięczną opłatą, niezależnie od tego, czy WebJob działa, czy nie.

Czytaj dalej: Porównaj Azure Functions vs Azure WebJobs

Co używać kiedy

Więc z której usługi App Service powinieneś korzystać kiedy? Ta tabela może pomóc:

.

.

.

Web Apps Mobile Apps Logic Apps Funkcje WebJobs
Host aplikacji internetowych i interfejsów API X
Obsługa backendu dla aplikacji mobilnych X
Obsługa przepływów logiki biznesowej X
Obsługa zadań w tle X X
Skaluje się automatycznie i płaci tylko wtedy, gdy jest uruchomiony X X X
Kontroluj skalowanie i płać miesięczną opłatę X X X

Wspólne funkcje usług aplikacji

Usługi aplikacji firmy Azure mają kilka niesamowitych funkcji, które czynią je bardzo atrakcyjnymi w użyciu. Oto niektóre z nich:

  • Łatwe uwierzytelnianie i autoryzacja
  • Ciągła dostawa
  • Domeny niestandardowe
  • Połączenia hybrydowe
    • Umożliwiają łączenie się z zasobami on-premises, jak usługi internetowe lub bazy danych
  • (automatyczne) skalowanie i równoważenie obciążenia
  • Sloty wdrażania
    • Pozwalają one na testowanie nowej wersji aplikacji i wdrażanie jej do produkcji bez przestojów. Pozwalają one nawet kierować część ruchu produkcyjnego do nowej wersji aplikacji, aby sprawdzić, czy działa zgodnie z oczekiwaniami.
    • Dowiedz się więcej o gniazdach wdrażania tutaj

Wdrażanie usług

Tworzenie nowej aplikacji Web App lub Logic App jest proste za pośrednictwem portalu Azure, ale powinieneś naprawdę zautomatyzować swoje wdrożenia, abyś mógł je powtarzać w różnych środowiskach i uruchamiać dokładnie tę samą konfigurację. Możesz to zrobić tworząc szablony Azure Resource Manager (ARM), które wdrażasz z Visual Studio lub w ciągłym dostarczaniu za pomocą usługi takiej jak Visual Studio Team Services.

Szablony ARM opisują twoje zasoby takie jak Web Apps, Azure SQL Databases i grupy zasobów w dokumentach JSON. Można je tworzyć za pomocą szablonu projektu Azure Resource Group w Visual Studio i czerpać inspirację, klikając przycisk Automation Script na dowolnym zasobie w Azure Portal.

Azure Event Grid

Względnie nowa usługa, Azure Event Grid, działa jako spoiwo między usługami. Azure Event Grid może kierować zdarzenia z dowolnego źródła do dowolnego miejsca docelowego.

Prawie każda usługa Azure może publikować zdarzenia, które Azure Event Grid może odbierać i wykorzystywać do wyzwalania aplikacji. Możesz również mieć własne aplikacje i usługi publikujące zdarzenia, które Azure Event Grid może wykorzystać do kierowania do innych usług.

Azure Event Grid skaluje się automatycznie i płacisz tylko za liczbę operacji, które wykorzystujesz.

Azure Event Grid eliminuje potrzebę odpytywania. Twoje aplikacje mogą nasłuchiwać i reagować na zdarzenia z dowolnej usługi, która opublikowała zdarzenia do Azure Event Grid.

Możesz, na przykład, mieć Azure Event Grid nasłuchujący zmian na liście mailingowej i uruchamiający Azure Logic App, gdy coś się zmieni.

Azure Service Bus

Jedną z najstarszych i najbardziej używanych i niezawodnych usług w Azure jest Azure Service Bus. Składa się ona z wielu usług, przede wszystkim z kolejek Azure Service Bus i tematów Azure Service Bus.

Aplikacja może umieszczać wiadomości na kolejce Azure Service Bus. Każda wiadomość jest odczytywana z kolejki i przetwarzana przez jedną aplikację. Kolejki Azure Service Bus mają pewne zaawansowane funkcje, które są dostępne od razu po wyjęciu z pudełka, takie jak wykrywanie duplikatów i podkolejka dead-letter, do której przenoszone są wiadomości, które nie mogą zostać przetworzone.

Tematy Azure Service Bus są nieco inne. Aplikacje mogą umieszczać wiadomości na Azure Service Bus Topic, a wiele aplikacji może czytać i przetwarzać wiadomości. Otrzymują one wiadomości, które mają atrybuty, którymi są zainteresowane. Subskrybują one „tematy” w kolejce. Tematy Azure Service Bus mają te same zaawansowane możliwości, co kolejki.

Obydwie te usługi pozwalają oddzielić aplikację, która umieszcza wiadomości w kolejce, od aplikacji, która przetwarza wiadomości. Ten wzorzec umożliwia aplikacji przetwarzającej przetwarzanie zadań w swoim własnym tempie bez zmuszania użytkownika do czekania na nią. Jest to przydatne, gdy przetwarzanie może zająć trochę czasu i nie chcesz, aby użytkownik musiał na to czekać, na przykład gdy przetwarzasz żądanie zamówienia, które może zająć 5 minut.

Azure Storage

Podstawowym elementem każdej aplikacji jest przechowywanie danych. Usługa Azure Storage zapewnia wiele opcji przechowywania danych, takich jak pliki lub rzędy danych. Oferuje kilka różnych usług, które są stosunkowo niedrogie, skalują się niemal w nieskończoność i w różnych regionach geograficznych oraz oferują funkcje takie jak szyfrowanie i uwierzytelnianie. Wszystko to otrzymujemy od razu po uruchomieniu konta Azure Storage. Omówmy różne rodzaje pamięci masowej Azure:

Blob Storage

Przechowujesz duże pliki, lub „bloby” w Azure Blob Storage. Mogą to być rzeczy takie jak pliki VHD, pliki audio lub wideo lub kopie zapasowe baz danych.

Możesz wybrać poziom przechowywania Blob, który określa wydajność i koszty. Istnieje warstwa Hot, dla Blobów, do których masz częsty dostęp. Jest też Cool tier, który jest używany dla Blobów, do których nie masz dostępu tak często, może raz w miesiącu. I na koniec jest warstwa Archiwum, dla Blobów, których prawie nigdy nie używasz. Kiedy zażądasz Bloba z warstwy Archive, może minąć kilka godzin zanim będziesz miał do niego dostęp.

Table Storage

Możesz przechowywać półrelacyjne dane w wierszach i kolumnach używając Azure Table Storage. Jest to idealne rozwiązanie dla takich rzeczy jak dane logowania. Dane są przechowywane w tabelach, które są podobne do tych w SQL Server, ale są mniej rygorystyczne, ponieważ nie mają relacji między nimi. Azure Table Storage jest szybkie i stosunkowo niedrogie, podobnie jak inne rodzaje Azure Storage.

Queue Storage

Możesz przechowywać małe wiadomości, które mogą być odebrane i przetworzone później w Azure Storage Queues, podobnie jak Azure Service Bus Queues. Jest to trochę dziwna oferta, ponieważ pokrywa się z kolejkami magistrali usług Azure. Różnią się one tym, że kolejki magistrali serwisowej mają funkcję wykrywania duplikatów, a kolejki pamięci masowej nie. Ponadto, wiadomości Service Bus Queue pozostają dostępne po 7 dniach, podczas gdy wiadomości Storage Queue mogą być przechowywane tylko przez 7 dni.

File Storage

Możesz używać Azure File Storage jako dodatkowego dysku twardego, który montujesz na swoim komputerze lub maszynie wirtualnej. Jest to świetna usługa, aby rozpocząć pracę w chmurze, migrując do niej swoje pliki. Aplikacje mogą z niej korzystać, po prostu wskazując im Azure File Storage zamiast ich własnego dysku twardego. Pozwala to na rozpoczęcie przenoszenia się do chmury.

Przechowywanie dysków

Azure Disk Storage to funkcja premium, która jest wysoce wydajna i przydatna, gdy trzeba wykonać pracę wymagającą dużej liczby operacji wejścia/wyjścia, np. na podstawowym dysku twardym maszyny wirtualnej. Działa jako skalowalny, wysokowydajny dysk, który można zamontować w maszynie wirtualnej.

Azure Cosmos DB

Nowa wersja i nazwa Azure DocumentDB to Azure Cosmos DB. Azure Cosmos DB to oferta baz danych, która idealnie pasuje do chmury. Jako usługa PaaS, po prostu uruchamiasz Cosmos DB i jesteś gotowy do pracy. Jeśli używałeś Azure DocumentDB, teraz automatycznie używasz Azure Cosmos DB. Twój kod nie musi być zmieniany.

Jest kilka rzeczy, które czynią Cosmos DB niezwykłym:

  • Możesz programować przeciwko niemu używając różnych „API”, takich jak SQL, JavaScript, MongoDB, Gremlin i Table Storage. Nie wybierasz już typu bazy danych, wybierasz tylko sposób, w jaki chcesz z nią rozmawiać, Cosmos DB zajmie się resztą
  • Nie musisz już tworzyć indeksów, Cosmos DB zrobi to automatycznie za Ciebie
  • Cosmos DB jest bardzo wydajny. Gwarantuje nawet niskie opóźnienia w umowie SLA
  • Skalowalność geograficzna jest dostępna od razu po wyjęciu z pudełka. Wystarczy wskazać miejsce na świecie, w którym mają się znajdować dane, a zostaną one zreplikowane w czasie rzeczywistym. W ten sposób możesz mieć pewność, że Twoje dane są blisko Twoich użytkowników

Dowiedz się, jak rozpocząć pracę z Azure Cosmos DB w tych 5-minutowych samouczkach.

Cosmos DB jest najbardziej odpowiedni dla danych nierelacyjnych lub półrelacyjnych.

Azure Cognitive Services

Dodawanie inteligencji do Twoich aplikacji nigdy nie było tak łatwe, jak dzięki Azure Cognitive Services. Jest to zestaw interfejsów API, które zapewniają niemal magiczne zdolności, zasilane przez AI i uczenie maszynowe. Istnieje około 30 usług kognitywnych, a kolejne będą się pojawiać. Oto kilka przykładów:

  • Emotion API, który analizuje twarze na zdjęciach i wideo w celu wykrycia emocji, takich jak szczęście, smutek, obrzydzenie i tak dalej
  • Language Understanding Intelligent Service (lub LUIS), który może rzeczywiście zrozumieć kontekst językowy w ponad 12 językach. Możesz użyć tego do stworzenia inteligentnego bota, który faktycznie rozumie, co do niego mówisz
  • Speaker Recognition API, który identyfikuje mówców na podstawie mowy. Możesz użyć tego do uwierzytelniania za pomocą głosu lub do identyfikacji osób na podstawie ich głosu
  • Computer Vision API, który może wykryć informacje o zawartości wizualnej znalezionej w obrazach, jak to, że tło to woda i niebo lub kurtka, którą osoba ma na sobie jest czarna

Usługi poznawcze są bardzo łatwe w użyciu, ponieważ po prostu używasz ich z chmury i nie musisz zarządzać żadną infrastrukturą lub konfiguracją.

Możesz użyć własnych danych do trenowania usług, aby poprawić swoje wyniki. W ten sposób Face API może na przykład zwracać imiona i wiek Twoich współpracowników. Dodatkowo, usługi kognitywne uczą się na bieżąco, na podstawie danych, które im podajesz. To czyni je inteligentniejszymi i dokładniejszymi.

Aby użyć usługi kognitywnej, po prostu wywołujesz punkt końcowy API, taki jak https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect z kluczem subskrypcji, który otrzymujesz podczas rejestracji i podajesz parametry, których potrzebuje, takie jak tablica bajtów obrazu, w przypadku Face API. To zwraca odpowiedź JSON jak to (niektóre linie są pominięte, aby zaoszczędzić miejsce):

Wynik wykrywania twarzy:

 }, "smile": 0.826, "headPose": { "pitch": 0.0, "roll": -16.9, "yaw": 21.3 }, "gender": "female", "age": 23.8, "facialHair": { "moustache": 0.0, "beard": 0.0, "sideburns": 0.0 }, "glasses": "ReadingGlasses", "makeup": { "eyeMakeup": true, "lipMakeup": true }, "emotion": { "anger": 0.103, "contempt": 0.003, "disgust": 0.038, "fear": 0.003, "happiness": 0.826, "neutral": 0.006, "sadness": 0.001, "surprise": 0.02 }, … }]

Wyraźnie widać na wyjściu, że ta konkretna usługa zwraca dużo danych. Wykrywa ona nawet, gdzie na zdjęciu znajdują się rysy twarzy i czy dana osoba ma na sobie makijaż. Myślę, że to naprawdę niesamowite.

Azure CDN

Możesz przyspieszyć działanie swoich aplikacji, odciążając ruch w Azure CDN. Azure CDN (Content Delivery Network) działa jako punkt końcowy dla statycznej zawartości, takiej jak pliki wideo, obrazy, JavaScript i CSS. Dzięki temu, że Azure CDN obsługuje te pliki, twoja aplikacja nie musi tego robić i ma więcej zasobów do obsługi większej ilości żądań. Dodatkowo, Azure CDN replikuje zawartość statyczną do punktów obecności (PoP) na całym świecie, umieszczając w ten sposób zawartość statyczną blisko miejsca, w którym znajdują się użytkownicy i ograniczając opóźnienia, co jest korzystne dla wydajności.

Możesz użyć Azure CDN tworząc punkt końcowy Azure CDN, sprzęgając go ze źródłem, takim jak Azure Storage i przesyłając pliki do Azure Storage. Azure CDN automatycznie replikuje pliki do PoPs na całym świecie i można połączyć się z plikami poprzez adres URL, taki jak https://custom.azureedge.net/cd/myimag.png. Możesz również użyć niestandardowej nazwy domeny dla adresu URL.

Azure Redis Cache

Innym sposobem na przyspieszenie aplikacji jest buforowanie danych za pomocą Azure Redis Cache. Kiedy pobierasz dane z pamięci podręcznej zamiast z innego magazynu danych, takiego jak baza danych, przyspieszasz działanie swojej aplikacji.

Dzieje się tak, ponieważ pamięć podręczna taka jak Azure Redis Cache przechowuje dane w pamięci i przechowuje je w prostym formacie klucz-wartość. Dzięki temu dane mogą być serwowane szybciej, ponieważ nie muszą być pobierane z dysku i nie muszą być pobierane poprzez wykonanie złożonego zapytania.

Azure Redis Cache dostarcza cache-as-a-service i zapewnia zaawansowane możliwości, takie jak klastrowanie i georeplikacja. Bazuje na popularnym open-source’owym Redis Cache i jest teraz wspierany przez umowy SLA firmy Microsoft oraz wsparcie dla przedsiębiorstw. Azure Redis Cache to opcja buforowania dla aplikacji w Azure.

Azure API Management

Możesz użyć Azure API Management do ulepszenia swoich interfejsów API lub interfejsów API innych firm, z których korzystasz. Azure API Management działa jako brama pomiędzy twoim API a światem zewnętrznym. Dzięki temu możesz ulepszyć swój interfejs API.

Dzięki zarządzaniu interfejsem API możesz stworzyć portal, do którego użytkownicy twojego interfejsu API będą mogli przejść w celu zarządzania subskrypcją(ami) i przetestowania aplikacji. Przykładem takiego portalu dla deweloperów jest strona jednej z usług kognitywnych, która również korzysta z zarządzania API:

Możesz kontrolować wykorzystanie API, ustawiając limity na użytkownika lub typ subskrypcji. Jest to dobry sposób na monetyzację API, na przykład oferując bezpłatny poziom użytkowania do 10 żądań dziennie, a jeśli potrzebujesz więcej, zaczynasz płacić. Jeśli użytkownicy próbują używać więcej, bez odpowiedniej subskrypcji, ich żądania zostaną zdławione.

Dodatkowo, możesz ulepszyć interfejsy API, czyniąc je bardziej wydajnymi. Możesz buforować odpowiedzi API tak, że nie muszą uzyskać odpowiedzi, wykonując obliczenia lub komponowanie danych ze źródła danych.

I można chronić swoje API z kluczy, haseł, certyfikatów i filtrowania IP. Na dodatek, możesz przekształcać dane wejściowe i wyjściowe do i z twoich interfejsów API. Możesz na przykład przekształcić przychodzący XML na JSON lub zrobić to samo z odpowiedziami.

Azure API Management jest naprawdę potężne i zwiększa kontrolę, jaką masz nad swoimi interfejsami API (oraz interfejsami API innych firm, które udostępniasz poprzez API Management). I pozwala to zrobić bez zmiany API.

Koniec

Usługi w tym artykule są przykładami usług Azure PaaS. Wszystkie z nich są bardzo łatwe do uruchomienia i wymagają minimalnej konserwacji. Zostaną uruchomione, są samoregenerujące i w zasadzie „po prostu działają”.

Wartość, jaką te usługi mogą zapewnić, jest ogromna i łatwa do włączenia w aplikacje. To naprawdę zajmuje się wieloma hydrauliką i powtarzalnymi zadaniami, które kiedyś musieliśmy budować i wykonywać sami.

Azure PaaS pozwala nam skupić się na budowaniu rzeczy, które mają znaczenie. Pamiętaj, aby zawsze skupiać się na ulepszaniu swoich aplikacji, korzystając z narzędzia APM, takiego jak Stackify Retrace. Dowiedz się więcej.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.