Java oraz platforma Azure

Udostępnij na: Facebook

Autor: Piotr Zieliński

Opublikowano: 2011-01-05

Wprowadzenie

Windows Azure został zaprojektowany do wspierania różnych języków i technologii. Programiści nie są więc ograniczeni wyłącznie do technologii .NET, a dzięki architekturze Azure jesteśmy w stanie wywołać niemal dowolny kod. Staje się to możliwe dzięki Worker Role. Dla przypomnienia, Worker Role może być utożsamiany z usługą Windows – wykonuje w tle jakąś operację. W przeciwieństwie do Web Role nie jest hostowany na IIS,  mimo to dostęp do Worker Role mamy za pomocą protokołu HTTP. W odpowiednim zdarzeniu Worker Role można zatem wywołać proces z kontenerem Tomcat oraz odpowiednio go skonfigurować. W ten sposób nasze serwlety, tak jak inne aplikacje .NET, będą wykorzystywać Load Balancera do zarządzania ruchem w Azure.

Dodatkowe oprogramowanie (pominięto standardowe biblioteki Azure):

  • Eclipse Galileo/Helios 3.5 lub 3.6 (sposób instalacji pominięto w artykule),
  • Apache Tomcat (sposób instalacji pominięto w artykule),
  • Windows Azure Tools for Eclipse (instalacja opisana w artykule poniżej).
  • Windows Azure Tomcat Solution Accelerator.

Windows Azure Tools for Eclipse

Podstawowym zestawem narzędzi i bibliotek jest Windows Azure Tools for Eclipse. Biblioteki z tego pakietu umożliwiają m.in. integrację z Azure oraz korzystanie z Windows Azure Blobs,Tables i Queues. Najłatwiej zainstalować narzędzie z poziomu Eclipse:

  1. Otwieramy środowisko Eclipse i z menu głównego wybieramy Help->Install New Software.

  2. Klikamy w przycisk Add.

  3. W otworzonym oknie w polu Location wpisujemy http://www.windowsazure4e.org/update.  Pole Name wypełnia użytkownik.

  4. Po naciśnięciu OK zostanie pobrana lista dostępnego oprogramowania. Zaznaczamy stosowny węzeł i przechodzimy dalej (przycisk Next).

  5. Teraz możemy obejrzeć, co dokładnie zostanie zainstalowane:

  6. W następnych etapach zapoznajemy się z licencją i kończymy pracę, klikając Finish.

Po kilku minutach oprogramowanie zostanie ściągnięte i zainstalowane automatycznie.

Zazwyczaj do pracy z Azure potrzebujemy następujących bibliotek:

Powyższe biblioteki z kolei zależne są od:

Wdrożenie aplikacji

Stwórzmy najpierw prosty serwlet wyświetlający tekst:

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class Example extends HttpServlet {

       private static final long serialVersionUID = 1L;

       public Example() {

              // TODO Auto-generated constructor stub

       }

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              response.getOutputStream().println("Witaj swiecie!");        

       }

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              doGet(request,response);

       }

}

Następnie musimy wygenerować plik WAR – archiwum aplikacji webowej. Wykorzystując środowisko Eclipse, możemy to zrobić w bardzo szybki sposób:

  1. Z menu kontekstowego PackageExplorer wybieramy Export.

  2. Zaznaczamy węzeł Web->WAR i klikamy Next.

  3. Jako docelową ścieżkę wybieramy folder webapps, który znajduje się w katalogu głównym Tomcat:

  4. Na koniec klikamy Finish, aby wyeksportować aplikację.

W tej chwili moglibyśmy przetestować aplikację lokalnie za pomocą czystego Tomcat. Naszym zadaniem jest jednak instalacja strony w środowisku symulacyjnym Azure.

Do wdrożenia aplikacji potrzebujemy Windows Azure Tomcat Solution Accelerator. Narzędzie pozwoli nam stworzyć „paczki”, które zawierają wspomnianego Worker Role wraz z niezbędnymi bibliotekami (JRE, Tomcat, serwlet). Akcelerator zawiera trzy skrypty:

  1. Buildme.cmd – tworzy paczkę na podstawie plików JRE oraz Tomcat,
  2. Runme.cmd – uruchamia aplikację Azure w lokalnym środowisku symulacyjnym,
  3. Packme – tworzy pakiet Azure, który następnie możemy wdrożyć w prawdziwym środowisku Azure (pakiet .cspkg).

Zacznijmy więc od skryptu Buildme:

  1. Uruchamiamy wiersz poleceń CMD.

  2. Za pomocą komendy CD przechodzimy do katalogu akceleratora, w którym znajdują się wspomniane skrypty:

    > cd C:\Samples\TomcatSetup_x64\Tomcat

  3. Wywołujemy skrypt Buildme.cmd:

    > Buildme.cmd

Skrypt poprosi nas o podanie ścieżki do Tomcata oraz JRE. Po chwili zostanie wygenerowany folder Tomcat.csx zawierający TomcatWorKerRole. Warto podkreślić, że folder Tomcat zawiera również nasz serwlet w formie archiwum WAR.

Następnie wywołujemy Runme.cmd:

> Runme

Skrypt uruchomi serwer Tomcat oraz środowisko uruchomieniowe Azure:

Z kolei uruchomienie komendy Packme spowoduje utworzenie pakietu, który będziemy mogli wdrożyć w Azure za pomocą panelu webowego.  Powstanie dokładnie taki sam pakiet, jak w przypadku standardowej publikacji w Visual Studio. W ten sposób wygenerowany plik można wdrożyć za pomocą panelu dostępnego na windows.azure.com:

Aby przekonać się, że aplikacja Java faktycznie działa w chmurze, wpiszmy adres w przeglądarce i przekonajmy się!:

 

Windows Azure Storage

Wykorzystując Javę, mamy również do dyspozycji Windows Azure Storage (blobs, queues, tables). Aby wykorzystywać Windows Azure Storage API, musimy najpierw dołączyć do projektu pakiet org.soyatec.windows.azure.java_2.0.0.20101027.

W tym celu w Eclipse z menu kontekstowego Package Explorer wybieramy Build Path->Configure Build Path. Następnie w zakładce Libraries klikamy Add External JAR’s i zaznaczamy stosowny pakiet. Jeśli nie zostały dołączone biblioteki zależne (patrz instalacja Azure Tools for Eclipse), należy je również dodać na tym etapie.

Następnie importujemy wymagane pakiety:

 

import org.soyatec.windowsazure.blob.*;

import org.soyatec.windowsazure.blob.io.*;

 

W aplikacji będziemy również potrzebować nazwę konta Azure oraz klucz:

 

privatestaticfinal String m_AccountName="http://127.0.0.1:10000";

privatestaticfinal String m_AccountKey="Klucz";

 

Spróbujmy uzyskać dostęp do bloba przechowującego plik tekstowy. Załóżmy, że odpowiedni blob jest już utworzony. Można go stworzyć np. za pomocą widoku dostępnego w Eclipse – Windows Azure Storage Explorer. Dostęp do bloba z poziomu kodu jest dość łatwy:

  1. Tworzymy klienta blob:

    BlobStorageClient blobClient=null;    blobClient=BlobStorageClient.create(URI.create("http://127.0.0.1:10000"),true,m_AccountName,m_AccountKey);

  2. Pobieramy referencję do kontenera:

    IBlobContainer container=blobClient.getBlobContainer("examplecontainer");

  3. Pobieramy  referencję do konkretnego bloba:

    IBlob blob=container.getBlobReference("hello.txt");

  4. Wczytujemy całą zawartość bloba do strumienia pamięciowego i tworzymy stringa:

    BlobMemoryStream memoryStream=newBlobMemoryStream();
    blob.getContents(memoryStream); 
    String text=newString(memoryStream.getBytes());

Powyższy kod można wdrożyć i przetestować np. w środowisku symulacyjnym, w którym nazwa konta oraz klucz mają zawsze następujące wartości:

 

Nazwa konta: devstoreaccount1

Klucz konta: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

 

Przedstawione serwlety są dowodem na to, że platforma Azure nie jest przeznaczona wyłącznie dla rozwiązań Microsoftowych. Dzięki elastycznej architekturze jesteśmy w stanie uruchomić niemal każdą aplikację – również napisaną w konkurencyjnych technologiach.


          

Piotr Zieliński

Absolwent informatyki o specjalizacji inżynieria oprogramowania Uniwersytetu Zielonogórskiego. Posiada szereg certyfikatów z technologii Microsoft (MCP, MCTS, MCPD). W 2011 roku wyróżniony nagrodą MVP w kategorii Visual C#. Aktualnie pracuje w General Electric pisząc oprogramowanie wykorzystywane w monitorowaniu transformatorów . Platformę .NET zna od wersji 1.1 – wcześniej wykorzystywał głównie MFC oraz C++ Builder. Interesuje się wieloma technologiami m.in. ASP.NET MVC, WPF, PRISM, WCF, WCF Data Services, WWF, Azure, Silverlight, WCF RIA Services, XNA, Entity Framework, nHibernate. Oprócz czystych technologii zajmuje się również wzorcami projektowymi, bezpieczeństwem aplikacji webowych i testowaniem oprogramowania od strony programisty. W wolnych chwilach prowadzi blog o .NET i tzw. patterns & practices.*