Modularidade na Web com Java: Desenvolvimento OSGI Web
com Eclipse VirgoRegis MachadoEquipe de Software – Líder Técnico [email protected]
• Régis Machado;• Formado em Análise e
desenvolvimento de Sistemas, Faculdade Senac;
• Líder Técnico na Gestum;• Mais de 3 anos trabalhando com
JavaEE;
Formada em Pelotas;
Especializada em educação corporativa;
Entre os 5 maiores players do seguimento;
Bases em três estados: SP, RJ e RS;
Tecnologias
OSGI? O quê é isso?
• Open Services Gateway Initiative, termo obsoleto.
• Especificação criada e mantida pela OSGI Alliance;
• OSGI Alliance foi fundada em 1999, por empresas como IBM, SUN, MOTOROLA, entre outras;
• Atualmente empresas como Adobe, Mitsubishi Electric, Telefônica, Red Hat, Siemmens, Oracle, VMWare e dezenas de outras empresas apóiam o desenvolvimento e evolução da plataforma OSGI;
• A primeira especificação foi lançada no ano de 2000, e atualmente está na versão 4.3.
• É usado em automóveis, mobiles, servidores, automação industrial, etc.
Os problemas atuais no desenvolvimento.
• Softwares cada vez mais complexos, devido a pequenos ciclos de novas implementações que elevam cada vez mais o custo de se trabalhar no Software;
- OSGI Alliance – www.osgi.org
Então...
O que alguns professores não nos dizem na faculdade é que alguns sistemas podem ser um
pouco complexos, por exemplo..
Os problemas atuais no desenvolvimento.
• Atualmente desenvolvedores passam mais tempo adaptando funcionalidades existentes para rodar/atender à novas plataformas/serviços;
- OSGI Alliance – www.osgi.org
Então...
Um exemplo da criatividade do ser humano quando está sobre pressão e tem que adaptar
algo para uma nova função/serviço.
Os problemas atuais no desenvolvimento.
• Um grande número de bibliotecas prontas existem o que tornou complexo a tarefa de gerenciar estas várias dependências que as vezes causam incompatibilidades.
• - OSGI Alliance – www.osgi.org
Então...
Mesmo a mais simples das aplicações pode ter uma dezena ou mais de bibliotecas...
??
?
?
??
?
?
?
Várias bibliotecas..
Sérios problemas de Jar Hell..
Depois de todos esses problemas, o resultado interno...
• Falta de qualidade, devido a complexidade, altos acoplamentos, estrutura engessada.
• Problemas com clientes, perda de confiança, prejuízos, cobranças de melhora;
• Perda de produtividade e motivação nas equipes.
• Então...
Depois de todos esses problemas internos, o resultado externo...
• Após entender as complexidades e fazer as adaptações, adicionar ou atualizar as bibliotecas necessárias fazer as validações e verificações, é só avisar o cliente que você atualizou o ambiente dele.
• Sorte que as vezes o cliente pode ter só algumas centenas de usuários online...
• Então...
E para o cliente...
Depois disso tente explicar...
• Que por causa do sistema ter ficado 15 minutos fora do ar com 1000-1500 pessoas online e acabou impossibilitando ele de ter 2 ou 3 vendas...
• E que na próxima atualização serão mais 15 minutos se tudo correr bem.
• Uma atualização por semana...
• 60 minutos, algo como 8 a 12 vendas a menos no fim do mês...
• Talvez R$ 1.000 de prejuízo para o cliente ou bem mais..
• Só nas atualizações o teu cliente poderia estar te pagando um pouco mais por esse beneficio de atualizar sem reiniciar..
OSGI
• Especificação que define como componentes devem ser instalados e gerenciados.
• Os componentes são chamados de Bundles;
• A especificação cria uma camada chamada de Ambiente OSGI, e possibilita de maneira transparente o acesso ao ambiente.
Será que OSGI é a solução?
• Reduz a complexidade
• Bundles independentes; Esconde as parte Interna; Expõe interface de serviços bem definida;
• Reuso
• Fácil implantação
• Define o padrão dos Bundles, como devem ser gerenciados e instalados;
• Dinâmico
• Podem ser instalados, iniciados, parados, atualizados e desinstalados sem precisar para toda a aplicação;
Ainda não está convencido??
Outras vantagens
• Seguro, construído sobre a arquitetura de segurança do Java;
• Adaptabilidade, os componentes podem ver os serviços disponíveis e se adaptarem a isso;
• Controle de versões, adeus “Jar Hell”;
• Simples, API com menos de 30 classes/interfaces;
• Pequeno, implementado em um Jar com menos de 300kb;
• Rápido, levanta os bundles e carrega as classes necessários de acordo com as dependências;
• Não intrusivo, os bundles podem ser POJOS;
O Framework
Módulos
• O Framework OSGi providencia uma solução padronizada para modularização em java;
• Uma unidade modular (componente) é conhecida como Bundle;
• Bundles são Java Archives (Jar), para diferenciar de um jar comum, é usado o tipo MIME:
• application/vnd.osgi.bundle
• Um Bundle pode conter, classes java, html, imagens, um bundle pode ter outros jar que podem ser disponibilizados como recursos ou classes, porém isso não é recursivo.
• Um Bundle possui um manifest com um cabeçalho que define diversas informações como os pacotes importados e exportados, capacidades, informações dos fornecedores, nome, versão, i18n, licença, requisitos. Este manifest fica em localizado em:
• META-INF/MANIFEST.MF
Módulos
Manifest-Version: 1.0
Export-Package: greenpages;version="2.3.0"
Bundle-Vendor: SpringSource Inc.
Bundle-Version: 2.4.0
Tool: Bundlor 1.0.0.RELEASE
Bundle-Name: GreenPages Service
Bundle-ManifestVersion: 2
Bundle-SymbolicName: greenpages
Import-Package: org.springframework.stereotype;version="[3.0, 3.1)"
Arquitetura de Class Loaders
• Class path de inicialização – contém o pacote java.* e os seus pacotes de implementação.
• Framework class path – O Framework normalmente tem um class loader para as classes de implementação e as interfaces dos principais serviços;
• Bundle Space – O bundle space consiste do arquivo JAR associado ao bundle, mais JAR adicionais que estão muito ligados ao bundle;
Arquitetura de Class Loaders
Ciclo de vida
• Projeto mantido pela Fundação Eclipse e apoiado pela SpringSource (VMWare);
• Usa o framework OSGI Equinox e integra as funcionalidades OSGI com o Spring Framework, tornando o Spring um “First Citizen class” Framework no ambiente de execução OSGI;
• Pronto para ser usado em produção, kernel integrado com o Tomcat ou Jetty;
• Logs coordenado e gerenciado pelo Framework LogBack;
• Bundles continuam sendo POJOS;
• Todo o poder dos header OSGI declarados no META-INF/MANIFEST.MF;
• Beans Spring podem ser exportados como serviços OSGI facilmente.
• Simples de migrar aplicações web não OSGI para OSGI.
Exemplo, bean spring declarado:<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id=“UserService" class=“br.com.gestum.souwebpel.evento.exemplo.UserService"/>
</beans>
Exemplo, serviço OSGI referenciando um bean spring:<beans:beans xmlns="http://www.springframework.org/schema/osgi"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
<service ref=“UserService" interface=“br.com.gestum.souwebpel.evento.exemplo.UserService"/>
</beans:beans>
Virgo Snaps
• Possibilita verificar se um Bundle está disponível a partir da view.
• Usa Bundles web, conhecidos como WAB.
• Um dos WAB deve ser o host principal.
Virgo Snaps – Configurando o web.xml do WAB HOST
<filter>
<filter-name>host-filter-name</filter-name>
<filter-class>org.eclipse.virgo.snaps.core.SnapHostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>host-filter-name</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Virgo Snaps – Configurando o header dos WAB
Snap-Host: br.com.gestum.souwebpel.event.wabhost;version="${version:[=.=.=, =.+1)}"
Snap-ContextPath: /dog
{....} No arquivo META-INF/snap.properties
Podem ser colocadas as propriedades que desejar.
Virgo Snaps – Usando a taglib
<%@ taglib prefix="snaps" uri="http://www.eclipse.org/virgo/snaps" %>.
{... Seu código aqui}
<!– Procurando por todos os WAB instalados usando o Snaps-->
<snaps:snaps var="snaps">
<c:forEach var="snap" items="${snaps}">
<a href="<c:url value="${snap.contextPath}${snap.properties['link.path']}"/>">
${snap.properties['link.text']}</a>
</c:forEach>
</snaps:snaps>
Obrigado!!!
Dúvidas?