2014-05-05 22 views
69

Wygląda na to, że w przestrzeni java istnieje aktualny trend, aby odejść od wdrażania aplikacji internetowych Java do kontenera serwletu Java (lub serwera aplikacji) w postaci pliku wojny (lub plik ear), a zamiast tego pakiet jest aplikacją jako słojem wykonywalnym z wbudowanym serwletem/serwerem HTTP, takim jak pomost. Chodzi mi o to bardziej w ten sposób, w jaki nowsze ramy wpływają na to, jak nowe aplikacje są opracowywane i wdrażane, a nie w jaki sposób aplikacje są dostarczane do użytkowników końcowych (ponieważ, na przykład, rozumiem, dlaczego Jenkins używa wbudowanego kontenera, bardzo łatwego do pobrania i przejścia). Przykłady frameworków przyjmujących opcję pliku wykonywalnego jar: Dropwizard, Spring Boot i Play (nie działa on na kontenerze serwletów, ale serwer HTTP jest osadzony).Porady dotyczące rozmieszczania plików wojennych w stosunku do pliku wykonywalnego z osadzonym kontenerem

Moje pytanie pochodzi ze środowiska, w którym wdrożyliśmy nasze aplikacje (do tej pory głównie Struts2) na serwerze aplikacji Tomcat, jakie zmiany, najlepsze praktyki lub uwagi należy wprowadzić, jeśli planujemy użyć podejście do kontenera osadzonego? Obecnie mamy około 10 rodzimych aplikacji działających na pojedynczym serwerze tomcat, a dla tych niewielkich aplikacji możliwość dzielenia zasobów i zarządzania na jednym serwerze jest dobra. Nasze aplikacje nie są przeznaczone do rozpowszechniania wśród użytkowników końcowych w celu działania w ich środowisku. Czy jednak, jeśli zdecydujemy się wykorzystać nowszą strukturę Java, czy to podejście powinno się zmienić? Czy przejście na słoiki wykonywalne jest stymulowane przez rosnące wykorzystanie wdrożeń w chmurze (np. Heroku)?

Jeśli masz doświadczenie w zarządzaniu wieloma aplikacjami w stylu Play w porównaniu z tradycyjnym wdrażaniem pliku wojny na jednym serwerze aplikacji, podziel się swoim spostrzeżeniem.

Odpowiedz

65

Interesujące pytanie. To tylko mój pogląd na ten temat, więc weź wszystko z przymrużeniem oka. Od czasu do czasu wdrażałem i zarządzałem aplikacjami przy użyciu kontenerów serwletów i wbudowanych serwerów. Jestem pewien, że wciąż istnieje wiele dobrych powodów do używania kontenerów serwletów, ale spróbuję po prostu skupić się na tym, dlaczego są one dziś mniej popularne.

Wersja skrócona: Kontenery serwletów doskonale nadają się do zarządzania wieloma aplikacjami na jednym hoście, ale nie są przydatne do zarządzania tylko jedną aplikacją. W środowiskach chmurowych jedna aplikacja na maszynę wirtualną wydaje się być lepsza i bardziej powszechna. Nowoczesne frameworki chcą być zgodne z chmurą, co oznacza przejście na wbudowane serwery.


Uważam, że usługi w chmurze są głównym powodem rezygnacji z kontenerów serwletów. Podobnie jak kontenery serwletów umożliwiają zarządzanie aplikacjami, usługi w chmurze pozwalają zarządzać maszynami wirtualnymi, instancjami, pamięcią masową i wieloma innymi. Brzmi to bardziej skomplikowanie, ale w środowisku chmurowym nastąpiło przejście na komputery z jedną aplikacją. Oznacza to, że często można traktować całą maszynę tak, jak jest to aplikacji. Każda aplikacja działa na komputerze o odpowiednim rozmiarze. Wystąpienia w chmurze mogą pojawiać się i znikać w dowolnym momencie, co jest świetne do skalowania. Jeśli aplikacja potrzebuje więcej zasobów, tworzysz więcej instancji.

Serwery dedykowane z drugiej strony są zazwyczaj wydajne, ale mają stały rozmiar, dzięki czemu można uruchamiać wiele aplikacji na jednym komputerze, aby zmaksymalizować wykorzystanie zasobów. Zarządzanie dziesiątkami aplikacji - każda z własnymi konfiguracjami, serwerami WWW, trasami i połączeniami itp. - nie jest zabawne, więc użycie kontenera serwletów pomaga utrzymać wszystko w porządku i przy zdrowych zmysłach. Trudniej jest jednak skalować. Kontenery serwletów w chmurze nie wydają się zbyt przydatne. Będą musiały być skonfigurowane dla każdej niewielkiej instancji, bez zapewnienia dużej wartości, ponieważ zarządzają tylko jedną aplikacją.

Ponadto, chmury są fajne, a chmury nie są nudne (jeśli nadal wierzymy w ten hype).Wiele frameworków domyślnie jest skalowalnych, dzięki czemu można je łatwo wdrożyć w chmurach. Wbudowane serwery są szybkie do wdrożenia i uruchomienia, więc wydają się rozsądnym rozwiązaniem. Kontenery serwletów są zwykle nadal obsługiwane, ale wymagają bardziej skomplikowanej konfiguracji.

Niektóre inne punkty:

  • Wbudowany serwer mógłby być zoptymalizowane dla ram lub jest lepiej zintegrowany z narzędziami ramami (jak na konsoli grać na przykład).
  • Nie wszystkie środowiska chmurowe mają konfigurowalne obrazy maszyn. Zamiast pisania skryptów inicjalizacyjnych do pobierania i konfigurowania kontenerów serwletów, używanie dedykowanego oprogramowania do wdrożeń aplikacji w chmurze jest znacznie prostsze.
  • Muszę jeszcze znaleźć konfigurację Tomcat, która nie przywita Cię z perm genem błąd miejsca co kilka przegrupowań swojej aplikacji. Zrobienie nieco więcej czasu na (ponowne) uruchomienie wbudowanych serwerów nie stanowi problemu, gdy prawie natychmiast można przełączać się między instancjami tymczasowymi i produkcyjnymi bez żadnych przestojów.
  • Jak już wspomniano w pytaniu, użytkownik końcowy może po prostu uruchomić aplikację.
  • Wbudowane serwery są przenośne i wygodne w użyciu. Dzisiaj wszystko jest gotowe, prototypy i MVP muszą być tworzone i dostarczane tak szybko, jak to tylko możliwe. Nikt nie chce spędzać zbyt wiele czasu na tworzeniu środowiska dla każdego programisty.
+0

Dzięki za odpowiedź, masz kilka dobrych punktów. Chmura jest czynnikiem napędzającym! W naszej sytuacji czułbym się bardziej komfortowo, mając serwer chmury w modelu Amazon Web Services (Infrastructure as a Service), a nie tylko wdrażając aplikację Google App Engine (platforma jako usługa), ale przypuszczam, że to jest stara szkoła myśli. Tak więc na wynos: jeśli nie planujemy wykorzystać chmury na platformie jako usługi, to raczej wdrożenie wojny to raczej droga niż zarządzanie wieloma niezależnymi aplikacjami internetowymi Java na jednym serwerze. Jeszcze raz dziękuję za Twój wkład. –

+2

Tylko 2cc: możesz uruchomić wiele _jar-apps_ na jednej maszynie z niewielkim serwerem HTTP jako proxy, np .: nginx, może być dodatkowo używany do typowego ruchu internetowego, jak niestandardowy CDN, load balancer, firewall, itp. Więc rozsądnie jest rozważ użycie go przy planowaniu dużego ruchu (ma lepszą wydajność, a następnie obsługę każdego żądania - nawet dla statycznych zasobów za pośrednictwem głównej aplikacji). – biesior