<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.caelum.com.br &#187; jetty</title>
	<atom:link href="http://blog.caelum.com.br/tag/jetty/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Java EE6: Começando com as Servlets 3.0</title>
		<link>http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/</link>
		<comments>http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 13:00:35 +0000</pubDate>
		<dc:creator>Adriano Almeida</dc:creator>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[anotação]]></category>
		<category><![CDATA[fj-21]]></category>
		<category><![CDATA[javaee]]></category>
		<category><![CDATA[javaee6]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlets]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[WebServlet]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1654</guid>
		<description><![CDATA[Se você nunca escreveu uma servlet antes por causa do medo de tantas configurações, agora é o momento para iniciar nessa tecnologia. Repare, com esse artigo, como ficou mais simples desenvolver para a web com Java. Grande parte das aplicações atualmente desenvolvidas em Java são para a Web e geralmente são desenvolvidas através de frameworks <a href="http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/#more-1654'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Se você nunca escreveu uma servlet antes por causa do medo de tantas configurações, agora é o momento para iniciar nessa tecnologia. Repare, com esse artigo, como ficou mais simples desenvolver para a web com Java.</p>
<p>Grande parte das aplicações atualmente desenvolvidas em Java são para a Web e geralmente são desenvolvidas através de frameworks como <a href="http://struts.apache.org/">Struts</a>, <a href="http://www.vraptor.com.br/">VRaptor</a> e <a href="http://java.sun.com/javaee/javaserverfaces/">JSF</a>. No entanto, é muito importante que antes de aprendermos alguma dessas ferramentas, entendamos os conceitos que elas nos abstraem.</p>
<p><strong>Servlets</strong></p>
<p>O principal pilar do desenvolvimento Web em Java é a API de Servlets. Com ela é possível executarmos código de uma determinada classe Java a partir de requisições HTTP para uma URL. Esse acesso é feito através de configurações não triviais de um servidor e arquivos específicos, de maneira diferente às antigas linguagens de script, como Perl, o que pode tornar o aprendizado de Servlets complicado.</p>
<p>Até a versão 2 da API de Servlets, precisamos fazer a declaração dessas classes através de XML (o <code>web.xml</code>). Portanto, além de nos preocuparmos em escrever o código Java com o processamento e lógica que desejamos fazer, ainda temos que nos preocupar com as configurações em XML, numa estrutura de diretórios especifica (o famoso diretório <code>WEB-INF/classes</code>), além de ter de manusear um <em>servlet container</em>.</p>
<p><strong>Pronto pra escrever sua primeira servlet? Use a versão 3.0!</strong></p>
<p>No mês passado foi aprovada oficialmente a versão nova do JavaEE 6, trazendo entre várias especificações novas, uma versão para Servlets, contendo diversas atualizações, a<a href="http://jcp.org/en/jsr/detail?id=315" target="_blank"> JSR 315</a>, também conhecida como Servlet 3.0.</p>
<p>Nessa nova versão criamos as Servlets da mesma forma que fazíamos antes, ou seja, através de uma classe que estenda <code>HttpServlet</code>. Dessa forma, podemos criar uma Servlet que recebe um parâmetro pela requisição e imprime o mesmo no console da seguinte forma:</p>
<pre class="brush: java; title: ; notranslate">
public class OiMundo extends HttpServlet {
    protected void service(HttpServletRequest request,
        HttpServetResponse response)
        throws ServletException, IOException {

        String nome = request.getParameter(&quot;nome&quot;);

        PrintWriter out = response.getWriter();
        out.println(&quot;Ola: &quot; + nome);
    }
}
</pre>
<p>A primeira grande diferença que pode ser percebida na Servlet 3.0 é o uso de anotações para a configuração das Servlets em vez de grandes declarações em XML. Na versão 3, existe a anotação <code>@WebServlet</code>, que indica que aquela classe é uma Servlet. Essa anotação recebe no seu parâmetro <code>value</code> em qual URL a Servlet estará disponível.</p>
<pre class="brush: java; title: ; notranslate">
@WebServlet(value=&quot;/oiMundo&quot;)
public class OiMundo extends HttpServlet {
        PrintWriter out = response.getWriter();
</pre>
<p>Você já poderia acessar nossa Servlet através de uma URL semelhante a <code>http://localhost:8080/projeto/OiMundo?nome=Caelum</code>, porém é mais interessante termos um  formulário HTML que enviará a requisição e o parâmetro para a Servlet. Podemos criar um <code>oiMundo.html</code> com o seguinte conteúdo:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
  &lt;body&gt;
    &lt;form action=&quot;oiMundo&quot;&gt;Informe o nome:
      &lt;input name=&quot;nome&quot; type=&quot;text&quot; /&gt;
      &lt;input type=&quot;submit&quot; value=&quot;Enviar&quot; /&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Desenvolvedores que já trabalharam com a versão 2 de Servlets podem perceber que não declaramos nenhum nome para nossa Servlet em sua configuração. Isso anteriormente era feito através da Tag <code>&lt;servlet-name&gt;</code> no XML. Porém, por padrão, na versão 3.0 é utilizado o nome completo da classe que está anotada. Podemos sobrescrever essa padrão através do parâmetro name da anotação <code>@WebServlet</code>:</p>
<pre class="brush: java; title: ; notranslate">
@WebServlet(value=&quot;/oiMundo&quot;, name=&quot;ServletOiMundo&quot;)
</pre>
<p><strong>Mais novidades da especificação</strong></p>
<p>Além de não precisarmos mais fazer a declaração das nossas Servlets em XML, agora também podemos declarar Filtros via anotações com o uso de <code>@WebFilter</code>.</p>
<p>Outro ponto que também acaba sendo muito comum quando utilizamos frameworks e bibliotecas de terceiros é que se exige uma configuração mínima no <code>web.xml</code> dos nossos projetos. Mas agora nem mesmo precisamos fazer essa configuração. As bibliotecas podem disponibilizar no diretório <code>META-INF</code> de seus jars um arquivo chamado <code>web-fragment.xml</code> contendo as configurações mínimas necessárias para o funcionamento da biblioteca, dessa forma, nós que utilizamos as bibliotecas não precisaremos nem fazer as configurações mínimas. </p>
<p><strong>O que preciso para usar a nova versão?</strong></p>
<p>Para que possamos utilizar Servlet 3.0 em nossas aplicações precisamos de um servidor que implemente essa nova versão. Até o momento, o único servidor que possui um release compatível é o <a href="http://glassfish.java.net/" target="_blank">Glassfish v3</a>. Outros servidores famosos como <a href="http://jetty.codehaus.org/jetty/" target="_blank">Jetty</a> (disponível em versão experimental na versão 8 ) e <a href="http://tomcat.apache.org/">Tomcat</a> (planejado para a versão 7) também suportarão.</p>
<p>Agora bastaria disponibilizar um projeto no servidor contendo no seu diretório <code>WEB-INF/classes</code> o <code>.class</code> da nossa nova Servlet.</p>
<p><strong>Servlet 3.0 e a Caelum</strong></p>
<p>Nosso conhecido <a href="http://www.caelum.com.br/curso/fj-21-java-web/" target="_blank">curso de java para web</a>, que vai desde servlets e JSP até Struts 2 e um pouco de Hibernate e VRaptor, já incorpora essas novidades do Java EE 6, e agora possui um capítulo totalmente dedicado à API Servlet 3.0.</p>
<p>Além disso, a versão 3.1 do <a href="http://www.vraptor.com.br/">VRaptor</a> possui suporte também através do uso dos <em>web fragments</em>, dessa forma, você utiliza o framework sem escrever absolutamente nenhuma linha de XML, nem mesmo a declaração do filtro do framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/java-ee6-comecando-com-as-servlets-3-0/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Melhorando o GUJ: Jetty, NIO e load balancing</title>
		<link>http://blog.caelum.com.br/melhorando-o-guj-jetty-nio-e-load-balancing/</link>
		<comments>http://blog.caelum.com.br/melhorando-o-guj-jetty-nio-e-load-balancing/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 10:41:36 +0000</pubDate>
		<dc:creator>Fabio Kung</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Caelum]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[guj.com.br]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[load balancing]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[nio]]></category>
		<category><![CDATA[reverse proxy]]></category>
		<category><![CDATA[servlet container]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2008/06/27/melhorando-o-guj-jetty-nio-e-load-balancing/</guid>
		<description><![CDATA[Durante boa parte da vida do GUJ.com.br, na sua segunda versão (screenshot acima), o site sofreu diversas quedas e passou por muitos períodos de lentidão, mesmo depois de ter migrado para um servidor dedicado. A grande verdade é que por um bom tempo ficamos devendo a devida atenção ao deployment do GUJ. Sempre que um <a href="http://blog.caelum.com.br/melhorando-o-guj-jetty-nio-e-load-balancing/#more-225'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p><center><a href='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj2.png' title='GUJ2'><img style="display:inline" src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj2.png' alt='GUJ2' width="500" height="132" border="none" /></a></center>
<p/>
<p>Durante boa parte da vida do <a href="http://www.guj.com.br">GUJ.com.br</a>, na sua segunda versão (screenshot acima), o site sofreu diversas quedas e passou por muitos períodos de lentidão, mesmo depois de ter migrado para um servidor dedicado. A grande verdade é que por um bom tempo ficamos devendo a devida atenção ao deployment do GUJ. Sempre que um problema acontecia alguém simplesmente reiniciava o servidor, sem investigar as causas reais do problema com profundidade.</p>
<p>Dada a relação próxima que a Caelum sempre teve com o site, já que dois dos fundadores do GUJ são também os fundadores da Caelum, resolvemos assumir de vez a posição de <strong>criadores</strong> do GUJ. A Caelum agora é a <strong>patrocinadora e mantenedora oficial</strong> do GUJ. Recentemente andamos gastando algum tempo, tentando acabar de vez com estes problemas que o GUJ a tanto tempo sofre. Felizmente, a melhora já é bem perceptível!</p>
<p>Há algum tempo atrás, o GUJ ficava esporadicamente muito lento. Para resolver estes problemas de lentidão, o primeiro passo foi conseguir um servidor dedicado, pago pelos anúncios espalhados pelo site. Já faz tempo que o GUJ roda neste servidor dedicado e desde então a performance se tornou quase sempre aceitável.</p>
<p>Porém, o servidor dedicado não resolveu todos os problemas, já que <code>java.lang.OutOfMemoryError</code> sempre foi o principal problema enfrentado pelo GUJ. Sempre desconfiamos que o culpado poderia ser o código do próprio GUJ, ou até do JFórum, que deveriam conter algum <a href="http://en.wikipedia.org/wiki/Memory_leak">vazamento de memória</a>.</p>
<p>Alguns desenvolvedores da Caelum já tiveram ótimas experiências passadas com o <a href="http://jetty.mortbay.org">Jetty</a>, que é um excelente servidor web e servlet contêiner. Foi, inclusive, um dos servidores Java pioneiros a usar conectores <a href="http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html">NIO (java.nio)</a>. O Jetty foi desenhado para ser embutido em outras aplicações Java e portanto é extremamente leve. Consome bem menos memória que o Tomcat, seu concorrente mais conhecido, e não deixa nada a desejar nas outras características.</p>
<p>O servidor dedicado do GUJ tem 2GB de memória RAM e o Tomcat estava configurado inicialmente para ter um heap máximo de 768MB (<code>-Xmx768M</code>). A primeira tentativa foi aumentar o heap máximo (<code>-Xmx1024M</code>), mas mesmo assim o temível <code>OutOfMemoryError</code> insistia em aparecer.</p>
<p>Resolvemos então dar uma chance ao Jetty. Já que ele consome menos memória, acreditamos que os <code>OutOfMemoryError</code> demorariam mais a aparecer. Logo ao subir, o jetty ocupa 4% da memória do servidor. O impressionante é que em duas semanas no ar, o uso total de memória não passou de 12%. Na verdade, o uso de memória estabilizou em 9% do total, porém recentemente fizemos alguns testes de carga no servidor do guj, com mais do que o dobro do número de conexões que o guj recebe hoje nos períodos de pico. Isto fez com que o uso de memória do Jetty pulasse para 12%. Uma diferença <strong>enorme</strong> da quantidade usada pelo Tomcat, que chegava facilmente a 80%.</p>
<p><center><a href="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/top-guj.png" title='uso de memória do Jetty'><img src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/top-guj.png' alt='uso de memória do Jetty' width="480" height="117" border="none" /></a></center>
<p/>
<p>Já temos algum tempo rodando, sem problemas de memória e com o jetty estável usando 9-12% do total da memória do servidor. Já estamos até pensando em descartar a possibilidade de existir um vazamento de memória no código do GUJ ou do JForum. Isto tornaria o Tomcat culpado pelos problemas de memória!</p>
<p>A possibilidade de vazamentos de memória no Tomcat (estávamos com a versão 6.0.14, sem o APR e com Linux Kernel 2.6.22) deste tamanho é um pouco assustadora. Com a base de usuários que o Tomcat tem, muito possivelmente alguém já teria pego este problema muito antes de nós. Provavelmente o problema é de alguma configuração mal feita no Tomcat do GUJ.</p>
<p>Fato é que o Jetty foi uma tentativa que deu certo e o problema está aparentemente resolvido. O Jetty mostrou um uso mais alto de CPU que o Tomcat, chegando a picos de 60% da capacidade total de processamento do servidor, que possui 2 processadores. Através dos testes de carga que fizemos, temos percebido que o Jetty usa bastante CPU para responder diversas requisições simultâneas. Isso não chega a ser um problema, já que os dois processadores que o servidor possui são mais do que suficientes para atender a quantidade de requisições por segundo que o GUJ recebe hoje.</p>
<p>Apesar de termos <a href="http://jira.codehaus.org/browse/JETTY-256">algumas suspeitas</a>, ainda não investigamos a razão do alto uso de CPU. Este é um ponto a ser abordado, caso o GUJ tenha problemas com disponibilidade de processamento algum dia.</p>
<p>Mesmo não representando um problema hoje, esta situação preocupa já que o MySQL rodando na mesma máquina também costuma usar bastante CPU. Isto pode se tornar um problema em algum dia que tenha um pouco mais de requisições por segundo do que o comum, já que o uso de CPU chegava as vezes perto do limite. Felizmente, grande parte das requisições ao servidor do GUJ são para conteúdo estático: imagens, JavaScripts, arquivos CSS, download de pdfs (dos artigos), entre outros. Todo esse conteúdo estático era servido pelo Jetty, contribuindo para o alto uso de CPU. Resolvemos então tentar um <a href="http://en.wikipedia.org/wiki/Reverse_proxy">proxy reverso</a> na frente do Jetty, especificamente para servir este conteúdo estático.</p>
<p><center><img src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/reverse_proxy.png' alt='proxy reverso servindo conteúdo estático' /></center>
<p/>
<p>Existem diversas alternativas de <a href="http://en.wikipedia.org/wiki/Reverse_proxy">proxy reverso</a> e a primeira a ser considerada quase sempre é o conhecido servidor web <a href="http://httpd.apache.org/">Apache Httpd</a>, com a adição do <a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html">mod_proxy</a>. É uma excelente solução e existe bastante documentação para fazer tudo funcionar. No entanto, faz um tempo que eu já estava querendo testar o servidor <a href="http://nginx.net/">russo</a> <a href="http://wiki.codemongers.com/Main">Nginx</a>, tão falado pelo pessoal da <a href="http://engineyard.com/">Engine Yard</a>.</p>
<p>A desvantagem do Nginx para o Apache Httpd é a documentação não tão extensa. Esse é um grande problema para a comunidade do Nginx, que tem se esforçado em traduzir grande parte do que está escrito em russo. Apesar disso, o Nginx é impressionante e superou todas as nossas expectativas. Além de ser extremamente rápido, consome <strong>pouquíssimos</strong> recursos. Cada um dos processos (1 master + 5 workers) consome na maior parte do tempo apenas <strong>1%</strong> de CPU e <strong>0.2%</strong> da memória disponível do nosso servidor. Incrível!</p>
<p>O conteúdo estático do GUJ agora é todo servido pelo Nginx; as requisições nem chegam ao Jetty. Além disso, o Nginx, como um bom proxy reverso, oferece diversas otimizações. Uma essencial para o GUJ é o preenchimento automático dos cabeçalhos HTTP de cache, sugerindo aos browsers que façam cache do conteúdo estático. Agora o consumo de CPU diminuiu consideravalmente.</p>
<p><center><a href='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/nginx.png' title='uso de recursos do nginx no GUJ'><img src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/nginx.png' alt='uso de recursos do nginx no GUJ' /></a></center>
<p/>
<p>Não fizemos nenhum comparativo científico de performance, mas a melhora dos tempos de resposta do GUJ está visível. Frequentemente tenho a sensação de que o site está <em>&#8220;voando&#8221;</em>.</p>
<p>Configuramos também no Nginx a <a href="http://www.nginx.eu/nginx-rrd.html">exibição de algumas estatísticas de acesso</a>; tão valiosas ao GUJ. É <strong>assustador</strong> como o padrão de acesso se repete a cada dia, e a cada semana. Repare como o gráfico de requisições por segundo é praticamente <strong>idêntico</strong> para cada dia (com exceção do sábado e domingo, que são parecidos entre si).</p>
<p><center><a href='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj-requests-week.png' title='requisições por segundo no GUJ, em uma semana'><img src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj-requests-week.png' alt='requisições por segundo no GUJ, em uma semana' border="none" width="558" height="160"/></a></center>
<p/>
<p>Temos também o interesante gráfico de conexões por segundo, que mostra relação média aproximada de <strong>3 requisições por conexão</strong>.</p>
<p><center><a href='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj-connections-week.png' title='conexões por segundo no GUJ, em uma semana'><img src='http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2008/06/guj-connections-week.png' alt='conexões por segundo no GUJ, em uma semana' border="false" width="558" height="190"/></a></center>
<p/>
<p>Note que a legenda do gráfico está errada, já que deveria mostrar <em>&#8220;connections/sec&#8221;</em>. O pequeno pico que dá para ver no gráfico aparece por causa de alguns testes de carga que fizemos neste dia. Pode ser desconsiderado.</p>
<p>Fizemos ainda algumas experiências com múltiplos servidores Jetty por trás do Nginx, funcionando também como <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">balanceador de carga</a>. Espero em breve postar sobre nossa experiência em geral com balanceamento de carga e alguns outros truques que pudemos testar nesta experiência do GUJ e em alguns clientes.</p>
<p>Aproveitando o post, o <a href="http://www.guj.com.br/posts/list/94487.java">GUJ recentemente comemorou</a> a marca de <strong>meio milhão de mensagens</strong>. É um orgulho poder fazer parte desta comunidade, e mais ainda por poder torná-la cada vez melhor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/melhorando-o-guj-jetty-nio-e-load-balancing/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
	</channel>
</rss>

