Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• Java SE x Java EE
• Containers Web, EJB e de Aplicação
• Servlets, JSP, JSTL e JSF
• Frameworks Struts, Hibernate e outros
• O formato War e deployment
descriptions
Java SE x Java EE
• Java SE ou JSE Java Standard Edition (Antigo
J2SE)
– Fornece a JVM (Maquina Virtual java) e as APIS
essenciais para coleções, E/S , reflexão,
serialização, XML, interfaces gráficas e redes.
APIs do Java EE
JVM
Container Web
Aplicação 1 Aplicação 2
O formato WAR e deployment
descriptor
• Pré-requisitos
• Versões do Tomcat
• Onde e como baixar
• Principais Arquivos e diretórios do
Tomcat
• Startup e shutdown do tomcat
Pré-requisitos do Tomcat
• Necessitamos de um ambiente de
desenvolvimento Java 1.4 ou superior
devidamente configurado para uso pela linha de
comando
• Acesse http://curso:8080/tomcat
• Copie o arquvo oi.java para a pasta /home/aluno
• Compile uma classe java com o comando javac
– javac oi.java
Pré-Requisitos
• Tomcat 5.0.x e anteriores
– JDK 1.3 ou superior
– O Tomcat necessita do computador Java fornecido
pelo JDK para compilar os servlets gerados pelo
processamento de páginas JSP
• Tomcat 5.5.x
– JRE 1.5.0 ou superior
– JRE 1.4.2 com biblioteca de compatibilidade
– O tomcat passou a incluir o compilador Java do
Eclipse de modo que basta um JRE
Como e Onde Baixar
• Visite http://tomcat.apache.org e siga o link
para download da versão desejada
• Baixe a distribuição Core, em formato zip
• A versão em formato “Windows Executable”
cria atalhos no menu iniciar e configura o
Tomcat para execução como serviço do
Windows
• A criação dos atalhos e serviço também pode
ser feito manualmente pela versão zip, que
inclui ainda os scripts para execução em
Linux e Unix
Instalação em Linux
• Descompacte o zip do Tomcat no seu
diretório home, preservando os
subdiretórios contidos no zip
– unzip apache-tomcat-5.5.16.zip
• Entre na pasta bin e dê permissão de
execução para todos os shell scripts
cd apache-tomcat-*/bin
chmod a+x *.sh
Principais arquivos e Diretórios
• Jakarta-tomcat-versão até a versão 5.0
• Apache-tomcat-versao (5.5.0 em diante)
• bin (scripts de inicialização e shutdown)
• conf (arquivos de configuração)
• webapps (aplicações e WARs)
• server (classes internas do servidor)
• common (classes usadas tanto pelo servidor quanto
por aplicações, como API de servlets)
• shared (classes compartilhadas por várias aplicações
, como drivers JDBC)
• logs,temp e work (arquivos voláteis)
Startup e Shutdown
• Dentro da pasta bin, os scripts startup e shutdown
(em versões .sh Linux e .bat em windows) são
usados, respectivamente para iniciar e parar o
servidor.
• Há ainda executáveis (.exe) para atalhos e serviços
Windows
• Scripts de início e término no padrão System V
(/etc/init.d) não fornecidos, devem ser criados pelo
administrador.
• A configuração padrão do tomcat escuta as portas
8080 (web), 8009 (AJP) e 8085 shutdown.
Configurando o JAVA_HOME 1/2
Configurações de Segurança
• Introdução à segurança declarativa do Java EE
• Autenticação HTTP BASIC e DIGEST
• Usuários, roles e resource-collecions do Java
EE
• Encriptação de senhas
• Autenticação Form-based
Introdução a segurança declarativa do
Java EE
• A idéia é que o desenvolvedor escreva o mínimo
possível do código para autenticar usuários e
autorizar o acesso às páginas da aplicação
• Este controle deve ser delegado para o servidor
de aplicações, que poderá fazê-lo de forma mais
flexível e segura
• A configuração é feita em duas partes:
– No descritor da aplicação (web.xml) são definidas
regras de controle de acesso
– Na configuração do servidor (server.xml ou
context.xml) são definidos os bancos de dados de
usuários e roles
Autenticação HTTP BASIC e DIGEST
• O protocolo HTTP prevê três mecanismos de
autenticação
• BASIC envia a senha do usuário em texto
(codificada em UUENCODE)
• DIGEST envia um hash da senha
• CLIENT-CERT exige a instalação de um
certificado digital X-400 no navegador do cliente,
devidamente assinado por uma CA
• A senha fornecida pelo usuário no BASIC ou
DIGEST é mantida em memória pelo navegador,
que a retransmite a cada página requisitada
Qual mecanismo escolher?
• O BASIC é o único obrigatório, e é seguro apenas
se usado em conjunto com SSL / TLS
• Versões recentes do Firefox e IE suportam DIGEST,
que é seguro por si só
• O CLIENT-CERT é pouco usado na prática pelas
dificuldades logísticas de distribuição dos
certificados digitais para os usuários
• Em nenhum destes mecanismos a aplicação tem
controle sobre a aparência da janela de login exibida
pelo navegador
• Não existe um logout devido a natureza stateless do
HTTP
Usuários, roles e resource-
collections do Java EE
• No descritor da aplicação, é definido qual
o método de autenticação a ser utilizado
• Além disso, padrões de URLs são
agrupadas e são definidos os usuários e
roles (grupo de usuários) com acesso ao
conjunto de URLs
• Podem haver páginas públicas e restritas
na mesma aplicação
Definição do Mecanismo
• Não são especificados os usuários individuais, e sim
as roles as quais eles devem pertencer
<security-role>
<role-name>usuario</role-name>
</security-role>
<security-role>
<role-name>administrador</role-name>
</security-role>
• O web.xml também indica o mecanismo de
autenticação para a aplicação
<login-config>
<auth-method>BASIC</auth-method>
<relm-name>Exemplo de segurança</realm-name>
</login-config>
Páginas Protegidas
• Então um conjunto de <url-pattern> é vinculado a um ou mais
<role-name> dentro de um <security-constraint>, criando uma
área de páginas protegidas dentro da aplicação
• <security-constraint>
• <web-resource-collection>
• <web-resource-name>
• Paginas do usuário
• </web-resouce-name>
• <url-pattern>/usuarios/*</url-pattern>
• </web-resource-collection>
• <auth-constraint>
• <role-name>usuario</role-name>
• </auth-constraint>
• </security-constraint>
Exemplo de segurança BASIC
<Realm debug=“0”
className=“org.apache.catalina.realm.DataSourc
eRealm”
dataSourceName=“jdbc/Contatos”
Digest=“MD5”
userTable=“usuarios”
userNameCol=“login” userCredCol=“senha”
userRoleTable=“grupos”
roleNameCol=“role”/>
Navegador
Web Catalina
Coyote (Container Web)
(Conector HTTP)
Servidor
Web
Jasper
JK (Compilador de JSP)
mod_jk (Conector AJP)
Conectores HTTP e AJP
• Os conectores são os componentes do Tomcat
responsáveis por receber conexões de redes e
repassar os comandos recebidos para o
container web (Catalina)
• O Tomcat pode ser utilizado diretamente como
um servidor web apenas porque ele possui um
conector que entende diretamente o protocolo
HTTP
• Quando existe outro servidor web entre o
Tomcat e o navegador do usuário, o Conector
JK permite comunicação otimizada usando o
protocolo AJP
O mod_jk
• É um plug-in de servidor web que acrescenta o
suporte ao protocolo AJP
• Há versões para Apache, ISAPI e NSAPI
• Deve ser compilado em relação à versão
específica e plataforma do servidor web
• Com sorte, poderá ser encontrado um binário
pré-compilado para o seu servidor (mas
verifique a versão)
• Daqui em diante assume-se que o servidor
web é o Apache 2.x fornecido com sua
distribuição do Linux
Instalando o mod_jk
• Há três formas de se obter e instalar o mod_jk
em Linux
1. Utilizando um pacote fornecido pela sua
distribuição
2. Utilizando binários pré-compilados fornecidos pela
ASF
3. Compilando você mesmo à partir dos fontes
• Com o Fedora 6, teremos que usar a opção
(3), mas versões posteriores da ditribuição
voltaram a trazer pacotes do mod_jk
Instalando o Pacote 1/2
• Neste exemplo, considera-se o uso da
distribuição Fedora Core 4
• Visite
http://download.fedora.redhat.com/pub/fedora/lin
ux
• Entre na pasta core/4/i386/os/Fedora/RPMS/
• Baixe os arquivos mod_jk-1.2.6-
3jpp_4fc.i386.rpm e mod_jk-manual-1.2.6-
3jpp_4fc.i386.rpm para sua pasta home
• Como root (su), instale os pacotes
– # rpm –ivh mod_jk*
Instalando o Pacote 2/2
• Opcionalmente, baixe os pacotes na pasta de
atualizações, visitando o mesmo servidor mas
entrando na pasta core/updates/4/i386/
• Instale então os pacotes encontrados, mas
poderá ser necessário instalar também outras
atualizações
• Ou então, utilize o Yum, que instala
automaticamente dependências e atualizações:
– # yum install mod_jk mod_jk-manual
• Prossiga para a configuração do mod_jk
Instalando binários pré-
compilados 1/2
• Verifique a versão do Apache instalada em sua
distribuição
– # apachectl status
– # rpm –q httpd
• Visite http://www.apache.org/dist/tomcat-
connectors/jk/binaries/ e procure pelo binário
específico para a sua plataforma e versão do
Apache
• Por exemplo, para o Fedora Core 2 em
processador Intel, temos o arquivo jakarta-
tomcat-connectors-jk-1.2.6-linux-fc2-i386-
apache-2.0.50.so
Instalando binários pré-
compilados 2/2
• Como root, copie o arquivo para a pasta
de módulos de extensão da sua instalação
do Apache
• No Fedora Core, a pasta é
/usr/lib/httpd/modules
• Prossiga para a configuração do mod_jk
Compilando o mod_jk 1/2
• Visite http://www.apache.org/dist/tomcat/tomcat-
connectors/jk/source e localize o arquivo
contendo os fontes da versão mais recente
• Por exemplo , tomcat-connctors-1.2.23-src.tar.gz
• Descompacte em sua pasta home
• Localize o executável apxs, que é parte do
Apache: tome nota do caminho
• Na maioria das distribuições do Linux, será
necessário instalar o pacote httpd-devel ou
similar
Compilando o mod_jk 2/2
• Uma vez que o comando apxs esteja disponível,
entre na pasta onde foram compactados os
fontes do mod_jk e prossiga com a compilação
$ cd $HOME/tomcat-connectors-*-src
$ cd native
$ ./configure –with-apxs=/usr/sbin/apxs
$ make
$ su
# make install
Balanceador ou
Distribuidor
Container Container
Web 1 Web 2
Balanceador ou Distribuidor
• É o componente que recebe as requisições do
navegador e as encaminha para um dos nós do
cluster
• Cria para o usuário no navegador a ilusão de
que existe apenas um único servidor em vez de
vários containers web independentes
• Há várias estratégias para sua implementação:
– Switches e roteadores especializados – “layer 7”
– Múltiplos endereços IP para um mesmo nome DNS
(DNS round-robin)
– Proxy reverso ou servidor front-end
Distribuição de Carga x
Tolerância a Falhas
• O cluster pode se limitar a distribuir a carga entre os
vários nós
• Por exemplo, um servidor atingiu o limite de sua
capacidade, então acrescenta-se um segundo servidor
• Ou então o cluster pode fornecer também a tolerância a
falhas
• Neste caso, os usuários que eram atendidos por um nó
falho serão automaticamente redirecionados para um
dos nós sobreviventes
• Não é trivial oferecer a tolerância a falhas sem perder
atividades “em progresso”
Estado da Aplicação no HTTP
• O HTTP é um protocolo sem estado, então
qualquer requisição poderia ser entregue a
qualquer nó do cluster
• Um mesmo usuário poderia ser a cada página
atendido por um servidor diferente
• Entretanto, aplicações web reais utilizam
artifícios como cookies e sessões HTTP para
manter o estado de um usuário particular (por
exemplo, uma cesta de compras)
• Este estado tem que ser replicado entre os nós
do cluster para que haja tolerância a falhas
Arquitetura de clustering do
Tomcat 5
• Sessões HTTP são implementadas por meio de
um cookie “identificador de sessão” conforme
manda a especificação JavaEE
• Para que um usuário possa recuperar as
informações armazenadas na sua sessão ele
deve ser atendido sempre pelo mesmo servidor
• Então o balanceador tem que reconhecer o
cookie um identificador do nó
• A arquitetura para tolerância a falhas será
apresentada na Aula 6
Clusters para balanceamento de
carga
• O mod_jk do Apache pode ser configurado para
atuar como um balanceador de carga entre
vários servidores Tomcat
• Ele inclusive é capaz de lidar com servidores de
capacidades diferentes e distribuir a carga
(usuários / sessões HTTP) proporcionalmente
• Os servidores não precisam nem mesmo usar o
mesmo SO!
Instalando os Nós do Cluster 1/3
• Para simular um cluster em um único computador,
precisamos de duas instalações do Tomcat
• Crie em sua pasta home o diretório cluster
– $mkdir $HOME/cluster
• Descompacte o Tomcat dentro desta pasta
– $ cd $HOME/cluster
$ unzip ../apache-tomcat*.zip
• Renomeie a primeira instalação para o no0 e
descompacte novamente o Tomcat
– $ mv apache-tomcat-* no0
$ unzip ../apache-tomcat*.zip
$ mv apache-tomcat-* no0
Instalando os Nós do Cluster 2/3
• Edite o conf/server.xml do segundo Tomcat (no1) para
mudar as portas TCP, evitando o conflito com o no0
<Server port=“8105” shutdown=“SHUTDOWN”>
...
<Connector port=“8180”
...
<Connector port=“8109”
...
• Nas duas instalações do Tomcat (no0 e no1), edite o
arquivo conf/tomcat-users.xml para permitir o uso do
Manager:
<user username=“tomcat” password=“tomcat”
roles=“admin,manager”/>
Instalando os Nós do Cluster 3/3
• Garanta que não haja nenhum outro Tomcat em
execução, e inicie cada um dos dois nós do cluster
$ cd no0/bin ; chmod a+x *.sh ; ./startup.sh
$ cd ../no1/bin ; chmod a+x *.sh ; .startup.sh
• Acesse a aplicação Manager em cada em cada nó,
confirmando que as duas instalações do Tomcat estão
funcionando
– http://127.0.0.1:8080/manager/html (no0)
– http://127.0.0.1:8180/manager/html (no1)
Exemplo de Teste dos Nós do
Cluster 1/4
• O instrutor irá fornecer o arquivo exemplo5.2.zip, que é
uma aplicação simples criada para testar o cluster
• Descompacte o zip dentro da pasta webapps do
primeiro nó do cluster
$ cd $HOME/cluster/no0/webapps
$ unzip $HOME/exemplo5.2.zip
• Compile as classes Java do exemplo, como visto na
Aula 1
$ cd exemplo5.2/WEB-INF/classes
$ export
CLASSPATH=$CLASSPATH:$HOME/cluster/no0/common/lib/se
rvlet-api.jar
$ javac exemplo/*.java
Exemplo de Teste dos Nós do
Cluster 2/4
• Copie a aplicação para o segundo nó
$ cd ../../..
$ cp –rf exemplo5.2 ../../no1/webapps
<Cluster className=“org.apache.catalina.cluster.tcp.SimpleTcpCluster”
managerClassName=“org.apache.catalina.cluster.session.DeltaManager”
expireSessionsOnShutDown=“false”
useDirtyFlag=“true”>
<Membership className=“org.apache.catalina.cluster.
mcast.McastService”
mcastAddr=“228.0.0.4”
mcastPort=“45564”
mcastFrequency=“500”
mcastDropTime=“3000” />
<Valve
className=“org.apache.catalina.cluster.tcp.ReplicationValve”
filter=“.*\.gif;.*\.js;.*\.swf”/>
</Cluster>
<ClusterListener
className=“org.apache.catalina.cluster.session.ClusterSess
ionListener”/>
...
</Cluster>
Exercício 2/5
• Não esqueça de ajustar os caminhos absolutos
(/home/fernando) ao seu próprio diretório home
• O watchDir poderia ser qualquer coisa, mas o
deployDir tem que ser o webapps do servidor,
ou qualquer que esteja configurado para o
<Host> desejado
• Somente um nó pode ter o watchEnabled com
o valor true
• O no1 recebe as mesmas alterações, com os
caminhos devidamente ajustados, exceto pelo
watchEnabled com o valor false
Exercício 3/5
• O instrutor fornecerá o arquivo exemplo6.1.zip
que contém uma pequena variação do exemplo
5.2
• Compile as classes e empacote o exemplo no
arquivo exemplo6.1.war
• Edite o mod_jk.conf para acrescentar o
mapeamento para a nova aplicação (o
FarmDeployer não afeta as configurações do
Apache)
JkMount /exemplo6.1 cluster
JkMount /exemplo6.1/* cluster
Exercício 4/5
• Termine ambos os nós, limpe suas pastas work
e reinicie ambos
• Reinicie também o Apache
• Verifique que ambos os nós individuais estão
funcionando pelo acesso aos respectivos
Manager, e que o cluster também está ok,
acessando o exemplo 5.2
• Copie o pacote WAR exemplo6.1.war para a
pasta watchDir do no0, ou seja,
$HOME/cluster/no0/war-listen
Exercício 5/5
• Acesse o Manager em cada nó, e confirme que
a nova aplicação foi acrescentada (pode
demorar alguns segundos)
• Acesse o exemplo 6.1 pelo cluster
http://127.0.0.1/exemplo6.1
• Acesse o exemplo 6.1 diretamente por cada nó,
comprovando que o FarmWarDeployer fez a
cópia do no0 para o no1
http://127.0.0.1:8080/exemplo6.1
http://127.0.0.1:8180/exemplo6.1
Tunning e Monitoração de
Performance
Server Information
Tomcat Version JVM Version JVM Vendor OS Name
JVM
Free memory: 1.09 MB Total memory: 5.73 MB Max memory: 254.06 MB
http-8080
Parâmetros de memória da JVM 1/2
<Valve
className=“org.apache.catalina.cluster.top.R
eplicationValve”
filter=“.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.h
tm; .*\.html; .*\.css; .*\.txt; .*\.swf;”
Tunning do cluster 2/3
<Receiver
className=“org.apache.catalina.cluster.top
.ReplicationListener”
tcpListenAddress=“auto”
tcpListenPort=“4000”
tcpSelectorTimeOut=“100”
tcpThreadCount=“8”/>
Tunning do cluster 3/3
• Por padrão, o envio de modificações nas sessões de um
nó assíncrono, o que gera um pequeno risco de perda
das últimas modificações das sessões em caso de pane
• Mudar para envio síncrono evita este risco às custas de
maior consumo de processador, memória e rede
< Sender
className=“org.apache.catalina.cluster.top
.ReplicationTransmitter”
replicationMode=“synchronous”
ackTimeout=“15000”/>
Introdução ao JMX
• Especificação da plataforma Java que permite a
qualquer aplicação fornecer “objetos gerenciados”, os
MBeans
• Define também uma forma de se localizar e obter
informações de MBeans, ou até de executar ações
sobre eles
• É obrigatório em versões mais novas do JavaEE, que
também define conjuntos de MBeans padrão para os
servidores de aplicações
• O marcado oferece vários consoles para gerenciamento
e monitoração JMX, similar aos consoles SNMP
Monitoração do Tomcat via JMX