2016-08-12 25 views
10

Jeden z moich klientów ma bardzo rygorystyczne wymagania dotyczące sposobu wdrażania aplikacji internetowej. Wymagają, aby był możliwy do wdrożenia jako WAR w serwerze Java, takim jak Tomcat. Nasza aplikacja jest jednak napisana w języku golang i kompiluje się w wykonywalny serwer.Czy mogę podać serwer Golanga osadzony w WAR?

Jedynym rozwiązaniem mogłoby myślę off byłoby rozpocząć długo żył proces golang w tle, który nasłuchuje na niestandardowym porcie jak 8080 a następnie umieścić jakieś proxy w java, które w przejrzysty proxy wszystko Żądania HTTP i odpowiedzi na ten proces.

Co mam zrobić, jeśli chodzi o wdrożenie? Nie jestem zaznajomiony z serwletami Java i uruchomieniem długich procesów takich jak ten w tle.

Moim głównym problemem jest to, czy coś takiego jest standardem,

  1. wpłynie to zużycie pamięci JVM za, etc?
  2. Czy serwer zezwala mojemu procesowi golang na przydzielenie wymaganej ilości pamięci wynoszącej ?
  3. Czy JVM będzie w stanie śledzić wykorzystanie procesora?

Czy jest lepszy sposób na zrobienie tego? Jak jakiś rodzaj mechanizmu komunikacji między procesami?

Odpowiedz

5

Jeśli HTTP jest jedynym interfejsem użytkownika udostępnianym przez aplikację Go, to pozostaje tylko opcja wysyłania żądania HTTP do wersji Go. Tak, możesz uruchomić plik wykonywalny Go jako proces potomny z JVM przy użyciu ProcessBuilder. Ale to nie jest prawdziwe osadzanie się w twojej WOJNIE. Możesz użyć JNI (wiązania Go nazywają się GoJVM), aby wywołać natywne procedury w Go z Java, ale musisz również wprowadzić wiele zmian w bazie Go.

To, czego prawdopodobnie szukasz, to rzeczywiście odwrotne proxy. Nie jest to często wykonywane w serwletach/serwerach aplikacji, ponieważ zwykle odbywa się to już w modułach równoważenia obciążenia. Zwykle będzie to NGINX lub httpd z mod_rewrite. W przypadku serwerów aplikacji można użyć serwletu proxy.

Przykłady:

Pamięć ślad nie jest zazwyczaj zły, bo jesteś w zasadzie tylko łączenia strumieni. JVM będzie w stanie śledzić wykorzystanie procesora i pamięci - jeśli zostanie poprawnie zaimplementowane, a plik wykonywalny Go będzie działał na tym samym serwerze. Oczywiście statystyki specyficzne dla Javy nie mają już większego sensu, ponieważ korzystasz tylko z serwera Java jako przepustki.

Wygląda na to, że masz kłopoty. Jeśli moim rygorystycznym wymaganiem było archiwum WAR, które można wdrożyć na serwerze aplikacji, nie zaakceptowałbym innego pliku wykonywalnego dodanego do mojego stosu. Odwrotny serwer proxy, czy nie.

0

Jeśli chcą wojny, daj im wojnę!

Napisz cienką warstwę usługi internetowej, która ma plik wykonywalny osadzony jako zasób, który wykonuje go w celu wywołania serwera go i akceptuje połączenia internetowe i przechodzi do usługi go.

Nie osiąga nic, co słyszysz? Cóż, nie ma też ich arbitralnego wymogu, który prawdopodobnie został wprowadzony przez kogoś, kto już dawno opuścił firmę i/lub ponieważ brakuje im pewności/doświadczenia/wiedzy, aby operacyjnie radzić sobie z innymi formami wdrażania. Nie ma szczególnie dobrego powodu, aby odmówić świadczenia usługi, z wyjątkiem prac wymaganych do ustanowienia właściwych procedur operacyjnych (lenistwo).

Po prostu postępuj zgodnie z literą ich zasad, a nie duchem, i bądź szczery, jeśli zapytasz o swoje wdrożenie. Nie będą mieli nic przeciwko.

To może brzmieć jak rant, ale IMHO i doświadczenie, tego rodzaju podejście jest rzeczywistością, a kierowcy wymagań są oparte na emocjach, więc uzasadniona jest nieco emocjonalna odpowiedź.

+0

W środowisku mikroserwisów, kto dba o jedną usługę zapisaną w Go, inną w węźle, inną z możliwością użycia Dropwizarda. Usługi i tak są małe i można je łatwo wymienić, jeśli nikt nie jest w pobliżu, który zna język lub ramy. Ale jeśli masz stos J2ee, ops, który go obsługuje, i programistów, którzy go utrzymują, po prostu nie ujdzie ci to na sucho, chyba że masz do tego bardzo dobry powód (i omówiłeś to wcześniej). Zakładając, że ci pracownicy od dawna nie żyją lub nawet nie żyją, nie dotrą daleko. Nie spełnienie rygorystycznych wymagań będzie oznaczać brak wynagrodzenia lub sądu. –