sexta-feira, 11 de outubro de 2013

Ordem de carregamento de classes / jars no JBoss AS 7


INTRODUÇÃO

Nesse blog escrevi sobre isolamentos de classloaders no JBoss AS 7.
Vejam nesse link:

http://www.josepojr.com/2013/01/isolamento-de-classloaders-no-jboss-as-7.html

Mas gostaria de complementar com mais explicações sobre a ordem usada no carregamento de classes / jars no JBoss AS 7.


CONCEITOS

1 - Só criar módulos no JBoss 7 se for alguma API que será usada em vários projetos (WAR ou EAR) que serão implantados (deploy) no JBoss 7.

2 - Dentro de um EAR, pode-se colocar os jars dentro dos seus respectivos subprojetos. Ou seja, se no seu EAR tem dois wars e um jar (Projeto EJB), um jar que será usado em somente um war, pode ser colocado dentro da pasta WEB-INF/lib desse respectivo war. Agora, se o seu jar é usado em todos os subprojetos do ear, usar dentro do diretório EAR/lib.

3 - O JBoss 7 tem uma regra de procedência para decidir qual classe de qual jar carregar primeiro. Veja em:

https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7


Resumindo a regra usada, de acordo com a prioridade:

1º Carregar classes de sistemas do JRE e JavaEE (especificação).
2º Dependências declaradas explicitamente no arquivo jboss-deployment-structure.xml
3º Classes / jars internos dos subprojetos como WEB-INF/classes ou WEB-INF/lib para um projeto WAR.
4º Jars contidos na pasta EAR/lib do seu projeto EAR.


Essas regras são muito importantes para o desenvolvimento de aplicações no JBoss AS 7. Se sua classe estiver no mesmo pacote e mesmo nome (exemplo meupacote.MinhaClasse) e estiver em dois lugares como WEB-INF/lib e EAR/lib, o JBoss AS 7 carregará a classe que achará primeiro. E pela regra da prioridade, pegará a classe MinhaClasse que está no jar do subprojeto WAR pasta WEB-INF/lib. Se a classe MinhaClasse estiver também em um outro jar da pasta EAR/lib, a classe nesse pacote não será carregada.


CONCLUSÃO

A equipe de projeto e desenvolvimento do JBoss AS 7, tiveram que elaborar algum mecanismo para definir em casos de "dúvidas" qual classe será carregada, no caso de existirem classes como mesmo nome e pacote dentro do servidor JBoss AS 7. Essas regras visam tomar decisões para em tempo de execução, o JBoss AS 7 resolver o impasse e escolher uma classe dentro de um conjunto de N classes de mesmo pacote e nome. Claro que nesse cenário estamos lidando com o pior caso, de temos a mesma classe e no mesmo pacote e M versões distintas e rodando no mesmo servidor de aplicações JBoss AS 7.



domingo, 11 de agosto de 2013

ACESSANDO VARIÁVEIS DO JBOSS AS 7 VIA LINHA DE COMANDO


INTRODUÇÃO

Além de acessar as configurações via arquivos xml no JBoss AS 7, podemos realizar operações como ler/escrever atributos e outras, na linha de comando (console) ou programaticamente (via Management API do JBoss AS 7).
Nesse artigo vamos explicar como fazer o acesso as variáveis no JBoss AS 7 tem linha de comando. Primeiramente, vamos explicar a estrutura geral das chamadas, linguagem, sintaxe até a conexão e execução via linha de comando.


ACESSO VIA LINHA DE COMANDO

Primeiramente, precisa entrar no diretório $JBOSS_HOME/bin e executar o script “jboss-cli.bat” (Windows) ou “jboss-cli.sh” (Linux). Ao executar esse programa, aparecerá outro shell (interface) e nesse momento, digite:

connect 127.0.0.1:9999

Para se conectar ao servidor no IP 127.0.0.1 e porta 9999 (responsável para permitir acesso ao módulo de gerenciamento no JBoss AS 7).

Estando conectado, digite o comando “ls” que dentro do JBoss CLI significa listar tudo que está dentro do “diretório”. Esse “diretório” entre aspas não significa um diretório realmente físico, mas como eles (JBoss AS) fizessem uma analogia entre a estrutura de diretórios (e até usando comandos similares do Linux, como o “ls”) e a estrutura das configurações usadas pelo JBoss (Hierarquia de configurações usadas nos arquivos XML). Veja na próxima figura para mais detalhes:
















Note que ao usar o comando “ls”, temos acesso já logo de cara as configurações fundamentais do servidor JBoss AS 7, como o modo de inicialização (launch-type) STANDALONE, versão (release-version) 7.1.3.Final e outras.
Digite o comando “help” para mais informações e use também o comando “clear” para limpar a tela.

Para começar, vamos entender como executar alguma instrução (requisição de operação) para poder ler/escrever nas propriedades do JBoss AS 7. Basicamente, uma requisição de operação (comumente chamado na documentação do JBoss AS 7) é construída de:

Caminho (endereço, Address), nome da operação e conjunto de parâmetros (depende da operação e é opcional).

Em uma notação na linguagem E-BNF (https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form), resumimos em:

[/node-type=node-name (/node-type=node-name)*]
“:” operation-name
(”[parameter-name=parameter-value (,” parameter-name=parameter-value)*]“)”


PARA QUEM NÃO CONHECE SOBRE A NOTAÇÃO E-BNF
É uma linguagem para codificar expressões e regras de gramáticas e assim, definir alguma linguagem, como as linguagens de programação Java, Python e outras.
Essa notação permitir definir de forma exata essas linguagens usadas no campo da ciência da computação, auxiliando na construção de compiladores, interpretadores, etc.
Outras linguagens como Português, Inglês, Alemão, Russo e outras não podem ser definidas por meio da notação E-BNF, pois são linguagens que não são exatas e possuem muitas regras que fogem da definição do E-BNF e também, são linguagens dinâmicas e vivas que mudam com o tempo.

O uso de colchetes “[” e “]” indicam que expressão contida é de uso opcional, ou seja, o número de ocorrências é 0 (zero) ou 1 (uma). O uso de parênteses “(” e “)” indicam que a expressão contida é de uso obrigatório e o número de ocorrências vai ser sempre 1 (uma). O asterisco “*” indica que a expressão próxima (lado esquerdo do asterisco) é de 0 (zero) ou N ocorrências, onde N pode ser qualquer valor.

Exemplo: Se temos (expressaoA)* indica que a expressão “expressaoA” pode ter 1 (uma) ou N ocorrências, pois o parênteses indica que a expressão (“expressaoA”) é obrigatória e deve ter uma ocorrência, ou 1 (uma) ou N ocorrência quando o asterisco está presente.




ACESSANDO VARIÁVEIS

- LER PORTA HTTP

Vamos começar mostrando como saber se o servidor JBoss AS 7 está rodando no modo “DOMAIN” ou “STANDALONE”. Para isso, na linha de comandos digite:

: read-attribute(name=launch-type)

Veja o resultado na figura a seguir:








Veja que o comando é executado na raiz (/) do diretório de configurações do JBoss AS 7.
Por isso, o comando executado não possuía nenhum endereço (/node-type=node-name) e já começava logo com os dois pontos (:).
 
DICA
Use a tecla TAB para o console completar o comando ou dar sugestões de opções possíveis. Com isso, podemos validar os nossos comandos antes de serem executados (ao clicar ENTER).
Em muitos casos aonde não temos exemplos, basta pressionar TAB para aparecer as sugestões validas de execução.

Agora vamos obter o número da porta usado pelo serviço http. Antes de executar o comando propriamente dito, vamos entrar nesse diretório para poder ver o caminho (desde a raiz) até chegar no diretório com essa configuração (valor da porta de vários serviços do JBoss AS 7). Execute os seguintes comandos:

cd socket-binding-group=standard-sockets

cd socket-binding=http

:read-attribute(name=port)

Veja na figura a seguir o resultado:








Note que o acesso do diretório se dar sempre em pares, isto é DiretórioPai=DiretórioFilho, seguindo a estrutura node-type=node-name.

Ou podemos entrar de diretório em diretório (um por vez), conforme comandos a seguir:

cd socket-binding-group

cd standard-sockets

cd socket-binding

cd http

:read-attribute(name=port)

Ou podemos executar tudo em um único comando:

/socket-binding-group=standard-sockets/socket-binding=http:read-attribute(name=port)

A operação usada (read-attribute) nesse exemplo está usando apenas um parâmetro que é o nome do atributo que queremos ler, no caso o nome é “port” que é o valor da porta http que queremos saber.

- LER CONFIGURAÇÕES DO INFINISPAN

// Lê só no primeiro nível.
/subsystem=infinispan:read-resource

// Lê de modo recursivo.
/subsystem=infinispan:read-resource(recursive=true)

// Lê os container-cache do infinispan.
/subsystem=infinispan:read-children-names(child-type=cache-container)


- IDENTIFICAR AS OPERAÇÕES POSSÍVEIS NO DIRETÓRIO ATUAL

// Dependendo do diretório atual, aparecerá mais ou menos operações que podem ser realizadas naquele diretório.
:read-operation-names

// Obtêm a descrição da operação escolhida.
// Nesse caso, estamos querendo saber como
// executar o comando shutdown no diretório raiz (/).
:read-operation-description(name=shutdown)


CONCLUSÃO

Nesse artigo mostramos como executar os comandos no console para poder administrar o servidor de aplicações JBoss AS 7. Com isso, podemos fazer diversas operações usando apenas o console.
A maneira de executar esse comando também é análoga a usada pela API Management para executar operações no JBoss AS 7.


REFERÊNCIAS





quarta-feira, 24 de abril de 2013

Criando Cluster de JBoss AS 7 com Load Balance (JBoss mod_cluster + httpd)




INTRODUÇÃO


Loadbalance é uma aplicação que recebe uma requisição HTTP, e decide qual instância (servidor) chamar de um cluster de servidores. Nesse caso, estamos lidando com cluster de servidores JBoss AS 7, que pode possuir N servidores, que também são chamados de instâncias do cluster. O loadbalance, através de critérios configurados, toma a decisão de chamar uma determinada instância do cluster para ATENDER a requisição HTTP. Um dos critérios usados, é verificar qual instância do cluster de JBoss AS 7 está ativa no momento e com menos carga. Localizado a instância, a requisição é direcionada para ela. E também, se algumas instâncias deixaram de funcionar, o loadbalance direciona as requisições para as instâncias ativas. Para isso, o loadbalance também conta com mecanismo para verificar se as instâncias estão vivas no momento, pois não faz sentido redirecionar requisições para instâncias mortas.

Veja no desenho abaixo como que funciona um cluster de instâncias do JBoss AS com o loadbalance (Apache WebService + mod_cluster).






CONFIGURAÇÃO DE CADA NODO DO JBOSS AS 7.1.3

1 – Copie as pastas do servidor JBOSS AS 7.1.3 e renomeie cada cópia para:

jboss-as-7.1.3.Final-node1
jboss-as-7.1.3.Final-node2
jboss-as-7.1.3.Final-node3

Cada pasta será uma instância do servidor JBoss AS 7 e funcionará no modo STANDALONE.

Para cada cópia, alterar o arquivo standalone.conf que está na pasta “bin” dentro de cada instância colocando os seguintes parâmetros:

JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone-full-ha.xml"
JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.as.logging.per-deployment=false"
# Esse offset deve ser diferente para cada nodo.
JAVA_OPTS="$JAVA_OPTS -Djboss.socket.binding.port-offset=1000"
# O nome do nodo deve ser diferente para cada nodo.
JAVA_OPTS="$JAVA_OPTS -Djboss.node.name=nodo1"

Lembrando que para cada instância, teremos o parâmetros “-Djboss.node.name” e “-Djboss.socket.binding.port-offset” diferentes.

Podemos usar os seguintes valores para cada instância:

Instância
-Djboss.socket.binding.port-offset
-Djboss.node.name
jboss-as-7.1.3.Final-node1
1000
nodo1
jboss-as-7.1.3.Final-node2
2000
nodo2
jboss-as-7.1.3.Final-node3
3000
nodo3


Arquivo standalone-full-ha.xml

Também, precisamos alterar o arquivo “standalone-full-ha.xml” para cada instância do cluster de acordo com as configurações a seguir:

Na tag “server”, colocar o atributo name com o nome da instância. Lembrando que esse nome deve ser único entre as instâncias do cluster.

Instância
Tag “server”, atributo “name”
jboss-as-7.1.3.Final-node1
<server name="standalone-nodo-1" xmlns="urn:jboss:domain:1.3">
jboss-as-7.1.3.Final-node2
<server name="standalone-nodo-2" xmlns="urn:jboss:domain:1.3">
jboss-as-7.1.3.Final-node3
<server name="standalone-nodo-3" xmlns="urn:jboss:domain:1.3">

Dentro da tag “server” colocar a seguinte tag para todas as instâncias do cluster.

<system-properties>
<property name="org.apache.tomcat.util.http.Parameters.MAX_COUNT" value="5000"/>
</system-properties>

Essa propriedade define o tamanho máximo de uma requisição HTTP. Se não definir esse tamanho, ao fazer uma requisição HTTP com muitos parâmetros na url, a instância que tratará a requisição, poderá lançar exceção com erro 500.

Dentro da tag “cache-container” colocar o seguinte atributo para iniciar o cache no inicio do servidor.

start="EAGER"

Existe um bug no JBoss AS 7.1.x que não inicia o cluster corretamente no infinispan (gerenciador de cache distribuído do JBoss AS 7.x). Para contornar esse problema, temos que iniciar todos os caches de forma “EAGER” (carrega tudo no inicio) e não “LAZY” (padrão, carrega só quando o cache for de fato chamado por alguma aplicação).

No subsistema web, mudar a tag para:

<subsystem xmlns="urn:jboss:domain:web:1.2" default-virtual-server="default-host" instance-id="${jboss.node.name}" native="false">

Note que essa tag vai informar o nome do servidor configurado acima.

Configurar as interfaces com o código abaixo:

<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>
<!-- TODO - only show this if the jacorb subsystem is added -->
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:0.0.0.0}"/>
</interface>
</interfaces>

Na tag “socket-binding-group”, alterar para as seguintes configurações de acordo com a instância usada.

Instância
Tag “socket-binding-group”
jboss-as-7.1.3.Final-node1
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:1000}">
jboss-as-7.1.3.Final-node2
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:2000}">
jboss-as-7.1.3.Final-node3
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:3000}">


No subsistema modcluster, mudar a tag para:

<subsystem xmlns="urn:jboss:domain:modcluster:1.1">
  <mod-cluster-config advertise-socket="modcluster" connector="ajp"
proxy-list="127.0.0.1:6666">
            <dynamic-load-provider history="10" decay="2">
        <load-metric type="cpu" weight="2" capacity="1"/>
        <load-metric type="sessions" weight="1" capacity="512"/>
    </dynamic-load-provider>
            </mod-cluster-config>
        </subsystem>


Muito importante configurar o atributo “proxy-list” para o servidor de IP 127.0.0.1 (local) na porta 6666. Esse valor é configurado também no arquivo httpd.conf do Apache Web Server (httpd). Se não configurar isso, a instância do JBoss pode não localizar o httpd e este último, não conseguir fazer os redirecionamentos e começar a lançar os erros 404, “not found”, não localizado.

No subsistema de logging, acrescente o seguinte bloco para fazer log no modcluster para debug.

<logger category="org.jboss.modcluster">
<level name="INFO"/>
</logger>



Arquivo nodo.sh

Esse arquivo será criado para iniciar cada instância do cluster. Veja abaixo:

./standalone.sh -c standalone-full-ha.xml -b 127.0.0.1 -u 230.0.0.4 &

Para funcionar o cluster com JGroups, o parâmetro b não pode ser configurado com “0.0.0.0”, deve ser atribuído endereço IP da máquina que está rodando o JBoss AS 7. Caso esteja rodando tudo local, use “127.0.0.1”.

O “&” (E comercial) serve para desvincular a execução do comando do prompt, assim, mesmo que o console seja fechado, o servidor continua ativo. Para desligar o servidor, precisa-se executar esses comandos:

ps aux | grep “jboss”

Para localizar o processo com o nome “jboss”.

kill -TERM pid

Para enviar uma mensagem para finalizar o processo, nesse caso, o servidor JBoss AS 7. A variável “pid” é o número do processo obtido na execução do comando anterior.

Ou para desligar de vez (definitivamente) o servidor JBoss AS 7, digite

kill -9 pid


Depois disso, copie esse arquivo para cada pasta “bin” de cada instância do JBoss AS 7.
Dê permissão de execução para esse arquivo “.sh”, com o comando abaixo:

chmod a+x nodo.sh



CONFIGURAÇÃO DO JBOSS MOD_CLUSTER (LOADBALANCE).

1 – Download do binário no site http://www.jboss.org/mod_cluster
na versão 1.1.x. A última versão até a escrita desse é artigo é a versão 1.1.3. Na documentação do JBoss AS 7, o site www.jboss.org deixa bem claro que deve ser usado o mod_cluster na versão 1.1.x. Se utilizar outra versão, pode ser que não funcione.
Lembrando também de baixar a versão para a plataforma alvo correta. Para escrever esse artigo, usamos o sistema operacional Linux 32 bit. E também, baixar o mod_cluster “completo”, no sentido de estar junto com Apache Web Server, chamado também de “httpd”. Pois o mod_cluster do JBoss é uma extensão (módulo) do httpd para trabalhar com cluster de JBoss AS's. Se baixar somente os módulos, deverá copiar os arquivos binários “.so” (linux) ou “.dll” (windows) para os diretórios de módulos do httpd e ainda, configurar o arquivo “httpd.conf”(que será usado a seguir). Mais detalhes da configuração do httpd, entre no site http://httpd.apache.org/docs/2.2/
Mas nesse artigo, usaremos a versão já empacotada do mod_cluster com o httpd.

2 – Descompactar arquivo “mod_cluster-1.1.3.Final-linux2-x86-ssl.tar.gz” com o comando:

tar xvfz mod_cluster-1.1.3.Final-linux2-x86-ssl.tar.gz

3 – Copiar o diretório "opt/jboss" para o diretório "/opt". Para isso, precisa-se usar o superusuário. 

Diretório aonde descompactou o arquivo “tar.gz”.
Entre no diretório “opt” criado, comando:

cd opt

Comando para cópia:

sudo cp -R jboss /opt

4 – Edite o arquivo httpd.conf localizado no diretório “/opt/jboss/httpd/httpd/conf”.
Procure a linha “ServerName” e descomente essa linha.
Mude “www.example.com:80” para “127.0.0.1:80”. Lembrando que a porta “80” é porta que será usada para receber requisições HTTP e apartir daí, o httpd com o mod_cluster (JBoss) delegará a requisição para a instância do JBoss AS 7 que cumprir os critérios do loadbalance (dentro do mod_cluster). Lembrando também que o endereço IP “127.0.0.1” pode ser alterado para o endereço IP da máquina atual.

5 – Criar os scripts para iniciar e parar o Apache Web Server com o mod_cluster.
O nosso loadbalance conforme explicado anteriormente, funciona como um módulo (extensão) do Apache Web Server, então criaremos scripts para iniciar e parar esse servidor (httpd).

// Script para inicio do Apache Web Server.
// Coloque o nome de “httpd_start.sh
// Dê permissão de execução com o comando:

chmod a+x httpd_start.sh

// Cole o conteúdo abaixo no arquivo “httpd_start.sh”.
/opt/jboss/httpd/sbin/apachectl start &

// De forma análoga, vamos criar o arquivo “httpd_stop.sh
// para parar o servidor httpd.
// Dê permissão de execução com o comando:

chmod a+x httpd_stop.sh

// Cole o conteúdo abaixo no arquivo “httpd_stop.sh”.
/opt/jboss/httpd/sbin/apachectl stop &

6 – Inicie o servidor Apache Web Server (httpd) com o comando
sudo ./httpd_start.sh

// Lembrando que para usar a porta 80 precisamos de acesso root ao sistema operacional.
7 – Entre em qualquer navedor web (firefox, chrome, etc) e acesse o endereço:


Deverá aparecer a seguinte mensagem:

It works!”

Está trabalho, ativo.


RODANDO UMA APLICAÇÃO WEB SIMPLES

Com o loadbalance (mod_cluster) e as instâncias configuradas, precisamos criar uma aplicação web simples e fazer a sua implantação (deploy) em cada instância do JBoss AS 7. Para isso, vamos criar o servlet “LoadBalanceServlet” cujo código será mostrado a seguir:

Arquivo “LoadBalanceServlet.java”

package test;

import java.io.IOException;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class LoadBalanceServlet
*/
@WebServlet("/LoadBalanceServlet")
public class LoadBalanceServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public LoadBalanceServlet() {
super();
// TODO Auto-generated constructor stub
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletOutputStream out = response.getOutputStream();
response.setContentType("text/html");

out.println("<html>");
out.println("<head>");
out.println("<title>" + "Teste loadbalance - Host "
+ request.getRemoteAddr());
out.println("</title>");
out.println("</head>");
out.println("<body>");
out.println("Nodo do JBOSS chamado: ");
out.println("jboss.node.name: "
+ System.getProperty("jboss.node.name"));
out.println("Tempo: " + Calendar.getInstance().getTimeInMillis());

out.println("</body>");
out.println("</html>");

out.close();
out.flush();
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}


A seguir será mostrado o código do arquivo web.xml contendo a configuração do Servlet.

xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LoadBalanceTestWAR</display-name>
<distributable/>
<servlet>
<servlet-name>LoadBalance</servlet-name>
<servlet-class>test.LoadBalanceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LoadBalance</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

Com essa configuração, basta acessar o servlet pelo seguinte endereço:
<


Também precisamos do arquivo “jboss-deployment-structure.xml” para fazer o deploy da aplicação web.


Arquivo “jboss-deployment-structure.xml

xml version="1.0" encoding="UTF-8"?>

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<deployment>
<dependencies>
<module name="javax.api" />
</dependencies>
</deployment>
</jboss-deployment-structure>

Todos esses arquivos “.xml” devem estar na pasta WEB-INF da aplicação web.

Como estamos usando a porta 80 que é padrão para o protocolo HTTP, podemos omitir a porta. Ao se fazer uma requisição para esse endereço, o mod_cluster de acordo com as políticas definidas, delegará a requisição para uma determinada instância do cluster de JBoss AS 7. Esse servlet deve criado e empacotado como um arquivo “LoadBalanceTestWAR.war”.

Para testar o loadbalance, faremos diversas requisições para o mesmo endereço (http://127.0.0.1/LoadBalanceTestWAR) diversas vezes, partindo de apenas um browser web ou diversos browsers web.

Nas figuras a seguir, serão mostradas duas chamadas para o mesmo endereço que foi processado por dois nodos diferentes. Para simular isso, basta clicar em atualizar diversas vezes, até mudar o texto da página para outro nodo do cluster.






CONCLUSÃO

Esse artigo mostrou todos os passos necessários para configurar um loadbalance sobre um cluster de JBoss AS 7. E também, podemos mudar as políticas envolvidas na seleção do nodo, como por exemplo:

  • O nodo que estiver mais inativo, isto é, quantidade de cpu usada menor, terá prioridade para receber requisições
  • O nodo que estiver usando menos memória heap da JVM, terá prioridade para receber requisições
  • O primeiro nodo localizado que estiver ativo terá prioridade de receber requisições.
  • O nodo será escolhido de forma aleatória e o escolhido, receberá a requisição.
  • O nodo que processou menos requisições no dia terá prioridade para receber requisições.
  • O nodo que processou uma requisição anterior do mesmo host de origem, terá prioridade para processar requisições.

Além dessas regras, podemos criar outras regras e combiná-las entre si, de acordo com as regras do negócio envolvidas. Basicamente, recebemos como ENTRADA a requisição e no fim, o loadbalance deverá retornar uma instância do cluster de JBoss AS 7 que deverá receber a requisição. Depois disso, o mod_cluster delega a requisição para o nodo escolhido. Esse processo se repete a cada requisição.
Portanto, para maior aprofundamento, precisa-se saber como configurar o mod_cluster para conter regras personalizadas e de acordo com o nosso negócio em questão.


REFERÊNCIAS

quarta-feira, 10 de abril de 2013

Configurando APR (JBoss Web Native) no JBoss AS 7.1.3


INTRODUÇÃO


Habilitando o uso do APR (Apache Portable Runtime), permite que o subsistema web do servidor JBoss AS 7 possa usar essa API que por sua vez, chama métodos nativos (JNI) da plataforma atual. Ou seja, se estamos usando linux, configuramos o servidor JBoss para "enxergar", "reconhecer" os arquivos binários ".so" que executará de maneira nativa no micro o que dará maior desempenho ao invés de usar o subsistema web no JBoss AS 7 totalmente em Java.
O Jboss fornece pacotes com binários para diversas plataformas, assim, podemos aumentar o desempenho do subsistema web para cada plataforma.


CONFIGURAÇÃO

Download do arquivo jbossweb-native-2.0.10.jar

Contêm todos binários de todas plataformas.

Descompacte esse arquivo.

Entre dentro da pasta que contêm o jbossweb-native descompactado e depois disso, entre na pasta "bin"

Copiar tudo o que contêm a pasta "bin" para dentro da pasta "bin" do servidor JBoss AS 7.1.

Exemplo:

// Supondo que essa pasta contêm
// os diretórios / arquivos do arquivo compactado jar.

cd jbossweb-native-2.0.10 

// Entra no diretório bin.
cd bin

// Copia de modo recursos todos os subdiretórios
cp -R META-INF $JBOSS_HOME/bin

// Entre no diretório $JBOSS_HOME/bin
cd $JBOSS_HOME/bin

// Veja se o diretório META-INF foi copiado dentro do diretório $JBOSS_HOME/bin
ls $JBOSS_HOME/bin.

// Execute o seguinte comando no diretório META-INF para
// que os arquivos binários (dll, so, etc, dependendo da plataforma) possam
// ser executados. Esse comando dará permissão de escrita.
chmod -R a+x META-INF

// Esse comando tem o argumento "-R" que indica recursividade, ou seja, o diretório META-INF
// e seus subdiretórios e arquivos, terão suas permissões alteradas de maneira recursiva, até achar diretórios folhas (sem filhos).
// Se não executar esse comando, os binários podem não ser carregados, pois o sistema operacional
// rejeitará o carregamento dos binários pela JVM.


Ajustar standalone-full-ha.xml:


Mude o valor do atributo "native" de "false" para "true".

<subsystem xmlns="urn:jboss:domain:web:1.2" default-virtual-server="default-host" instance-id="${jboss.node.name}" native="true">



Inicie o servidor JBoss AS 7.1.3.

Verifique no log ($JBOSS_HOME/standalone/log/server.log) se o APR está ativo.
Para isso, execute o seguinte comando:

cat server.log | grep "coyote"


O servidor deverá mostrar essas linhas:

09:41:37,492 INFO  [org.apache.coyote.ajp.AjpAprProtocol] (MSC service thread 1-1) Starting Coyote AJP/1.3 on ajp-/127.0.0.1:8009
09:41:37,519 INFO  [org.apache.coyote.http11.Http11AprProtocol] (MSC service thread 1-2) Starting Coyote HTTP/1.1 on http-/127.0.0.1:8080


Se não aparecer essas linhas, isso indica que as bibliotecas nativas do jboss-web native não foram instaladas com sucesso.


CONCLUSÃO

Com o uso do jboss web nativo, aumentamos o desempenho do servidor na parte web. E também, é importante lembrar que o uso dessas bibliotecas nativas (binários) é de uso opcional, não impactando no funcionamento correto do servidor e a única coisa que agrega, é mais desempenho, por usar componentes que são executados diretamente na máquina e não via JVM.
Lógico que o servidor JBoss AS 7 roda em cima de uma JVM, mas com o jboss web nativo ativado, o processamento passa da JVM pela interface JNI (interface para acesso de métodos nativos no Java) que invoca as implementações de métodos nativos nos binários da plataforma.


REFERÊNCIAS








segunda-feira, 11 de março de 2013

INSTALAÇÃO DO POSTGRESQL 9.2 E USO NO JBOSS AS 7.


INTRODUÇÃO

Nesse artigo vamos demostrar como instalar o banco de dados Postgresql versão 9.2 e configurar o servidor de aplicações JBOSS AS 7 para ter acesso a esse banco de dados.


INSTALAÇÃO DO POSTGRESQL NO UBUNTU

1 – Fazer o download do postgresql nesse site:

Nesse site temos o instalador gráfico que será usado nesse artigo, mas pode-se baixar o PostgreSQL
nesse site também:


2 – Execute os seguintes comandos:

// Dando permissão para o arquivo poder ser executado.
chmod a+x postgresql-9.2.3-1-linux.run

// Executando o arquivo de instalação.
sudo ./postgresql-9.2.3-1-linux.run

Depois, será aberto um instalador gráfico no estilo “wizard” (assistente) que guiará o processo de instalação do postgresql. Veja nas figuras a seguir esse processo.







































CONFIGURAÇÃO DO POSTGRESQL

Nessa seção, vamos criar o banco de dados e algumas tabelas.
Para isso, vamos usar a ferramenta “pgAdmin III”.
Nas figuras a seguir, será ilustrado o processo de criação do banco de dados dentro do Postgresql.




















CRIAÇÃO DE TABELAS

Vamos criar tabelas através de uma ferramenta gráfica para criação de script dentro desse gerenciador gráfico. Para isso, veja nas figuras a seguir.












SCRIPTS SQL USADOS NAS FIGURAS

DROP TABLE IF EXISTS USUARIO;
CREATE TABLE IF NOT EXISTS USUARIO (
id integer,
roleId integer,
nome varchar(80),
PRIMARY KEY (id)
);

DROP TABLE IF EXISTS ROLE;
CREATE TABLE IF NOT EXISTS ROLE (
id integer,
nome varchar(80),
PRIMARY KEY(id)
);

ALTER TABLE USUARIO ADD FOREIGN KEY (roleId) REFERENCES ROLE(id);

INSERT INTO ROLE (id, nome) values (1,'ADMIN');
INSERT INTO ROLE (id, nome) values (2, 'CONVIDADO');

INSERT INTO USUARIO (id, roleId, nome) values (1, 1, 'ADMINSTRADOR_SISTEMA');
INSERT INTO USUARIO (id, roleId, nome) values (2, 2, 'CONVIDADO');
INSERT INTO USUARIO (id, roleId, nome) values (3, 1, 'OUTRO_ADMIN');

Na figura a seguir, será mostrado o uso do comando select para verificar tabelas criadas.






CONFIGURAÇÃO NO JBOSS AS 7


Até agora configuramos o banco de dados PostgreSQL, agora precisamos configurar o servidor JBOSS AS 7 para usar esse banco de dados. Primeiramente, na instalação do PostgreSQL, escolhermos instalar uma extensão adicional que o driver JDBC do PostgreSQL. Esse driver está localizado dentro do diretório “pgJDBC” dentro do diretório home do PostgreSQL. Nessa instalação, o PostgreSQL ficou instalado no diretório “/usr/local/PostgreSQL”. Com esse driver, vamos criar um módulo dentro do JBoss AS 7 para que o driver fique disponível para ser usado por todo o servidor.

Crie as pastas:

$JBOSS_HOME/modules/org/postgresql
$JBOSS_HOME/modules/org/postgresql/jdbc
$JBOSS_HOME/modules/org/postgresql/jdbc/main

Copie o driver (postgresql-9.1.901.jdbc4.jar) para a pasta “main”.

Crie um arquivo chamado “module.xml” dentro da pasta “main” e com o seguinte conteúdo.



<module xmlns="urn:jboss:module:1.1" name="org.postgresql.jdbc">

    <resources>
        <resource-root path="postgresql-9.1-901.jdbc4.jar"/>
        <!-- Insert resources here -->
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
     </dependencies>
</module>



Esse arquivo configura o módulo do JBoss AS 7, nesse arquivo podemos configurar as dependências entre módulos, exclusões de pacotes, etc. Note que informamos o jar do driver nesse arquivo e definimos o nome do módulo (org.postgresql.jdbc) que será usado dentro do arquivo standalone.xml para configurar o servidor JBoss AS 7 para usar esse módulo. E também, o nome definido no módulo deve seguir o caminho do diretório do módulo. Isto é, “org.postgresql.jdbc” indica módulo dentro da pasta “main” (padrão e obrigatório e não dá para alterar o nome dessa pasta, senão, o módulo não é carregado) que por sua vez está dentro da pasta “jdbc” que está dentro da pasta “postgresql” e que está dentro da pasta “org”. Ou seja, a nomenclatura dos módulos do JBoss AS 7 é análoga a nomenclatura de pacotes na linguagem Java, sempre associando os nomes entre pontos (“.”) com diretórios.

Depois disso, precisamos incluir essa informação “services/java.sql.Driver” no jar, para isso, execute o seguinte comando.

jar -uf postgresql-9.1-901.jdbc4.jar META-INF/services/java.sql.Driver

Pronto, o novo módulo do driver JDBC do PostgreSQL foi criado dentro do JBoss AS 7, só executar o servidor, se existir erros, o log do servidor reportará.

Altere o arquivo standalone.xml para criar drivers e datasources apartir do driver JDBC do postgresql instalado dentro do JBoss AS 7 na forma de módulos. Altere as seguintes linhas:


<subsystem xmlns="urn:jboss:domain:datasources:1.1">
            <datasources>
               <datasource jndi-name="java:jboss/postgresDS" pool-name="postgresDS" jta="false" enabled="true" use-java-context="true" use-ccm="false">
<connection-url>jdbc:postgresql://127.0.0.1:5432/mybd</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<driver>postgresql-driver</driver>
<pool>
    <min-pool-size>2</min-pool-size>
    <max-pool-size>50</max-pool-size>
</pool>
<security>
            <user-name>postgres</user-name>
             <password>postgresql</password>
</security>
<validation>
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
<background-validation-millis></background-validation-millis>
</validation>
<statement>
<prepared-statement-cache-size>0</prepared-statement-cache-size>
<share-prepared-statements>false</share-prepared-statements>
</statement>

</datasource>
     <drivers>
        <driver name="postgresql-driver" module="org.postgresql.jdbc">
<xa-datasource-class>org.postgresql.xa.PGXADatasource</xa-datasource-class>
   </driver>
</drivers>
</datasources>
</subsystem>


Depois de iniciar o servidor JBOSS AS 7, entre no console do servidor:


Se não tiver usuário cadastrado no JBoss AS 7, terá que rodar o script “addUser” que está dentro da pasta $JBOSS_HOME/bin. Nesse script adicionamos os usuários com suas respectivas senhas para poder acessar o console do servidor JBoss.

Nas figuras a seguir, serão mostrados os passos para entrar no console, acessar datasources e testá-los.












CONCLUSÃO

Nesse artigo mostramos como configurar o acesso do JBoss AS 7 ao banco de dados PostgreSQL. Com isso, podemos usar esse datasource para configurações de segurança, uso em arquivos implantados como EAR, WAR, etc.



REFERÊNCIAS