Modularidade na Web com Java:
  Desenvolvimento OSGI Web
       com Eclipse Virgo
Regis Machado
Equipe de Software – Líder Técnico
regis.neves@gestum.com.br
•   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;
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?

Modularidade na Web com Java: Desenvolvimento OSGI Web com Eclipse Virgo

  • 1.
    Modularidade na Webcom Java: Desenvolvimento OSGI Web com Eclipse Virgo Regis Machado Equipe de Software – Líder Técnico regis.neves@gestum.com.br
  • 2.
    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;
  • 3.
  • 4.
    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.
  • 5.
    Os problemas atuaisno 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
  • 6.
    Então... O quealguns professores não nos dizem na faculdade é que alguns sistemas podem ser um pouco complexos, por exemplo..
  • 8.
    Os problemas atuaisno desenvolvimento. • Atualmente desenvolvedores passam mais tempo adaptando funcionalidades existentes para rodar/atender à novas plataformas/serviços; - OSGI Alliance – www.osgi.org
  • 9.
    Então... Um exemplo dacriatividade do ser humano quando está sobre pressão e tem que adaptar algo para uma nova função/serviço.
  • 11.
    Os problemas atuaisno 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
  • 12.
    Então... Mesmo a maissimples das aplicações pode ter uma dezena ou mais de bibliotecas...
  • 13.
    ? ? ? ? ? ? ? ? ?
  • 14.
  • 15.
    Depois de todosesses 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...
  • 16.
    Depois de todosesses 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...
  • 17.
    E para ocliente...
  • 19.
    Depois disso tenteexplicar... • 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..
  • 21.
    OSGI • Especificação quedefine 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.
  • 22.
    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;
  • 23.
    Ainda não estáconvencido??
  • 24.
    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;
  • 25.
  • 26.
    Módulos • O FrameworkOSGi 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
  • 27.
    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)"
  • 28.
    Arquitetura de ClassLoaders • 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;
  • 29.
  • 30.
  • 32.
    • Projeto mantidopela 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;
  • 34.
    • Bundles continuamsendo 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.
  • 35.
    Exemplo, bean springdeclarado: <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>
  • 36.
    Exemplo, serviço OSGIreferenciando 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>
  • 37.
    Virgo Snaps • Possibilitaverificar se um Bundle está disponível a partir da view. • Usa Bundles web, conhecidos como WAB. • Um dos WAB deve ser o host principal.
  • 38.
    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>
  • 39.
    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.
  • 40.
    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>
  • 41.