1 Simply connect. Jini™ Technology Tutorial Bruno Ferreira de Souza Java Technologist Sun Microsystems, Inc. 2 TECHNOLOGY SHOULD NOT REQUIRE A LEARNER’S PERMIT. You scratch your head. Bite your nails. Technology was supposed to make things easy. So why is figuring out how to use it so difficult? We see things from a different perspective. (And always have.) It’s called network computing. And that’s led us to break-through like our Java ™ technologies. Taking away the hurdles. Making computing more seamless, more transparent. So you can do exactly what you want to do. Without having to spend your life figuring out how. THE NETWORK IS THE COMPUTER™ . O Paradigma Atual • A indústria da informática evoluiu de forma inacreditável • Mas a estrutura dos computadores é a mesma… – CPU, memória, disco – instalar, executar aplicações, gerenciar recursos… – atividades que um administrador dos anos 50 entende bem… • Mudança em tamanho e velocidade não trouxe mudança significativa em como instalamos, administramos e utilizamos os computadores A História de Jini • Se mistura com a história de Java – Originalmente criada para desenvolver software para pequenos devices – em 94/95 - uso na web (HotJava) – Mas o uso original não foi esquecido… • Bill Joy - pre-95 – linguagem robusta para desenvolvimento de aplicações – “máquina virtual”para executar programas em qualquer processador para tirar proveito do novo mercado de processadores – sistema para interligar essas máquinas virtuais para suportar uma nova forma de sistema distribuido – Computadores continuarão existindo, mas o futuro esta nas “smart appliances” – Java, JVM, Jini • Bill Joy, Jim Waldo, Ann Wollrath, Ken Arnold, Bob Scheifler A Visão Jini • A arquitetura Jini foi desenhada para permitir a disponibilização e o uso de serviços na rede • Redes são dinamicas por natureza: – – – – novos sistemas são adcionados sistemas antigos são removidos sistemas existentes são atualizados partes da rede falham e são consertadas • Possuem problemas que não exsitem em sistemas locais (mesmo os multiprocessados) • Essas diferenças precisam ser tomadas em conta • Um sistema distribuido precisa se adaptar a essas modificações, porque a rede vai mudar • Jini foi desenhado para ser adaptável e flexível A Visão Jini • “unbiquitous computing” Mark Weiser (Xerox PARC) grandes quantidades de devices e serviços de software trabalhando juntos, facilmente e imediatamente utilizáveis • Essa visão traz problemas particulares – a infraestrutura de software precisa ser extremamente robusta – os devices precisam suportar verdadeiro “plug & work” - fáceis de usar - fáceis de administrar – software precisa ser capaz de evoluir – precisam formar comunidades espontâneas • Os mesmos problemas com grandes quantidades de devices são também problemas dos grandes sistemas corporativos - Jini não é só para pequenos devices... Sistemas Distribuidos • Todos nós conhecemos as mensagens: – NFS server not responding – unable to locate server – no route to host • Nossos sitemas são frágeis, mas parece que sistemas distribuídos são ainda mais frágeis • Desenvolver sistemas distribuídos é difícil Sitemas Distribuidos Tradicionais • Tentativas de fazer a rede “sumir” • Programadores aprenderam como desenvolver sistemas locais - incluir modelos específicos para tratar a rede causa problemas • Temas comuns: – Como mover dados para serem processados – O que fazer com os dados uma vez que foram movidos • Como mover dados para serem processados – não podemos assumir que o código necessário estará em todos os locais, então é mais fácil mover os dados – mover os dados também tem suas dificuldades... • O que fazer com os dados uma vez que foram movidos – Basicamente: RPC – CORBA e DCOM: RPC para objetos • Tudo isso para fazer a rede “sumir”... Mas a rede não é transparente… • Simplificar o problema dessa forma é supersimplificar… • Baseado na idéia de que a corretude de um programa não é afetada pela rede, apenas a performance • Centrado nos seguintes principios: – existe um modelo de objetos para a aplicação, independente do contexto de rede – questões de falha e performance estão ligados à implementação dos componentes e portanto devem estar fora do design inicial – a interface de um objeto é independente do contexto de rede • A parte difícil de um sistema distribuído não é o envio de dados e a chamada de procedimentos remotos • A parte difícil é lidar com falha parcial, falta de um gerenciador central de recursos, performance adequada e concorrência Diferenças entre Sistemas Locais e Distribuidos: Performance e Latencia • Esse é o problema mais perceptível • Mas ignorar as diferencas entre o acesso local e o remoto é basicamente garantir que haverá problemas de performance • Mas ainda que fosse resolvido, não é a diferença fundamental Diferenças entre Sistemas Locais e Distribuidos: Falha Parcial • Problema fundamental e menos óbvio • Tanto sistemas locais como sistemas distribuidos possuem componentes sujeitos a falhas • No sistema local: ou o sistema inteiro falha, ou o SO consegue detectar a causa da falha • No caso do sistema distribuido, um componente pode falhar enquanto outros continuam funcionando corretamente • Além disso, não existe um agente central capaz de avisar da falha. Uma falha no link da rede é indistinguivel de uma falha na aplicação ou de uma falha no processador, ou ainda de uma aplicação lenta • Se esses tipos de falhas não fazem parte do “contrato” (a interface) do componente, então os programadores podem ignorá-las... Diferenças entre Sistemas Locais e Distribuidos • No fundo, problemas de falhas parciais, concorrência e consitência, possuem soluções diversas para aplicações diversas • Devem ser tratados conscientemente pelo programador em um sistema distribuido • Não podem ser “escondidos” • É um engano tentar fazer o desenvolvimento distribuído como se fosse local (“sumir” com a rede) Java não tem alguns desses problemas... • Java não apresenta alguns dos problemas que se tenta resolver com outros sistemas distribuídos • Solução centrada em uma linguagem: todo o sistema assume objetos Java, o que simplifica diversos aspectos – – – – mover dados não é mais problema mover dados pode não ser nem mesmo necessário mobilidade de código segurança • Mas e os problemas fundamentais? Como java promove a distinção entre objetos locais e remotos? Java e Sistemas Distribuidos • Strong typing - no RMI os tipos Java (interfaces) são usadas para definir a interface para comunicação remota: public interface RemoteServer extends Remote { public int getLenth(String s) throws RemoteException; } • O tipo Java é o protocolo, e portanto, podemos manipular o tipo (extender, modificar) e estaremos alterando o protocolo • Todo o poder da orientação a objetos em um mundo distribuido • Polimorfismo poderoso. Por exemplo: public interface MatrixSolver extends Remote { public Matrix crossProduct (Matrix m1, Matrix m2) throws RemoteException; } Natureza distribuida do Objeto está na Interface • Diferença sutil, mas com grandes ramificações • Obriga ao desenvolvedor a considerar a distribuição desde o início, ao invés de pensar depois • java.rmi.Remote • java.rmi.RemoteException • Não vai fazer com que os problemas de sistemas distribuidos desapareçam, nem fazer sistemas distribuidos tão fáceis de serem desenvolvidos como sistemas locais • Faz uma distinção clara entre objetos distribuidos e locais (mas usando a mesma tipagem Java) • Obriga o desenvolvedor a tratar as falhas que podem ocorrer em um sistema distribuido Sistemas Distribuidos Dinâmicos • As facilidades de Java (codigo e data móveis e tipagem forte) possibilitam uma mudança para sistemas distribuídos dinâmicos • Sistema composto de várias componentes, ao contrário de sistemas atuais onde temos váriso sistemas conectados de forma relativamente estática • Características de sistemas dinâmicos: – precisam escalar para ptencialmente grande número de máquinas – para isso, código tem que estar disponível em todos os lugares, e para isso, precisa ser fácil de instalar – uma vez rodando, pode precisar ficar rodando por longos períodos, e portanto, precisa ser robusto e ser capaz de se auto-reparar – como terá que rodar por longos períodos, precisa ser capaz de evoluir • Jini é um sistema especificamente desenhado para suportar a criação de sistemas distribuidos verdadeiramente dinâmicos Jini Design • Java tem muito a agregar a sitemas distrbuidos, e Jini tem muito a agregar a Java. • A visão de Jini é voce ser capaz de conectar qualquer device “Jini enabled”, conectá-lo a uma rede, and ser automaticamente capaz de ver e utilizar outros devices e serviços existentes na rede. • Como se o seu device tivesse sido programado para usar esses outros servicos e devices Jini™ Architecture Infrastructure Java + Jini Base Java Programming Model Services Extended RMI Discovery Distributed Security Lookup Leasing Two Phase Commit Events JavaSpace Two Phase Commit Manager Java VM RMI Java Security Model Java APIs JavaBeans ... JNDI Enterprise Beans JTS Let objects find each other, and... … add simple APIs for Remote Objects and Basic Distributed Computing, and... … then everything else is a service. Jini Design • Jini foi desenvolvido procurando atender a um conjunto de prioridades: • Simplicidade • Confiabilidade • Escalabilidade • Independência de aparelhos Simplicidade • Bill Joy: “large sucessfull systems start out as small successfull systems” • Jim Waldo: “passei os ultimos 9 anos tentando fazer esse sistema simples” • Se você conhece Java, quase que já conhece Jini • Construido em sima dos conceitos de Java • Adciona apenas a camada necessária para permitir que devices e serviços trabalhem uns com os outros de forma fácil • Tudo são serviços: software, hardware Confiabilidade • Jini suporta interações entre serviços de forma a permitir que serviços apareçam e desapareçam facilmente • Partes interessadas podem ser notificadas quando o conjunto de serviços muda • Não requer nenhuma configuração estática ou administração: “spontaneous networking” • Comunidades Jini são basicamente “auto-reparaveis” Jini não assume que as redes são perfeitas ou que software não falha. Dado o devido tempo, o sistema se auto-repara • Suporte a redundância de forma natural • Essas propriedades garentem que um sistema Jini é basicamente livre de necessidade de administração Escalabilidade • Serviços Jini se agrupam e formam cominidades, mas quão escalável são essas comunidades? • Comunidades são do tamanho de um workgroup, ou seja, todos os devices e serviços para grupos de cerca de 10 e 100 pessoas • Em geral, pessoas tendem a colaborar com as que estão perto • Comunidades são formadas automaticamente dentro dos limites da rede • Jini permite juntar comunidades em “federações” • Federações são contruidas através da ligação dos “lookup services” • Permite uma topologia bastante dinâmica Independência de Aparelhos • Jini foi desenhado para suportar uma gigantesca gama de entidades • É indiferente se entidades são hardware, software ou uma combinação • Em geral, um usuário de um serviço não tem como saber (e nem se importa) • Jini é flexível para trabalhar com devices mesmo com limitadas capacidades • Não precisa nem mesmo ser capaz de processamento • Nem mesmo requer que entenda ou seja escrito em Java! O que Jini não é • Jini não é um servidor de nomes • Jini não é JavaBeans • Jini não é Enterprise JavaBeans • Jini não é RMI • Jini não é um sistema operacional distribuido Os 5 conceitos fundamentais • Simplicidade é um dos objetivos, e todas as facilidades que Jini oferece estão baseadas em apenas 5 conceitos. Se você souber os 5, sabe tudo sobre Jini • Discovery – encontrar e se juntar a comunidades - spontaneous comunity building • Lookup – procurar e encontrar serviços • Leasing – fornece a capacidade de auto-reparo • Remote Events – notificações de mudança de estado dos serviços • Transactions – `permite corrdenar ações entre multiplos serviços Architecture of Jini™ Technology discovery Network Services Jini { JavaSpaces™ { Other Services lookup The lookup service binds the federation together. Lookup leasing Leasing provides a method of managing resources in an environment where network failures can occur. Discovery / Join JAVA Discovery solves the problem of finding the place to start in an unknown network. JAVA events JAVA Events deal with the peculiarities of messages in the networked environment, such as latency and network failure. transactions Solaris Mac Windows SPARC PPC X86 Transactions allow distributed entities to cooperate in such a way that the changes to the group occur atomically or not at all. JavaSpace A space may be used to implement a large number of distributed computing patterns. Jini, como funciona? Service Request Ž Œ • Java Interface Code • Image Service • Java Interface Code Java Interface Code Jini Lookup Service Discovery • Serviços precisam se juntar a uma comunidade para poder ter acesso a serviços • Para isso, uma entidade procura os lookup services mantém a lista de recursos disponíveis • o processo de procurar e se registrar a um lookup service é chamado de discovery • o protocolo de discovery é usado para encontrar comunidades, e o protoloco join é usado para se registrar • lookup services podem prover serviço para uma ou mais comunidades, e cada comunidade pode ter um ou mais lookup services Protocolos de Discovery • Multicast Request Protocol – buscar lookup services ativos • Multicast Announcement Protocol – anunciar um lookup service • Unicast Discovery Protocol – acessar diretamente um lookup service – jini://jini.javaman.com.br • Alem desses, serviços que queiram se disponibilizar na rede utilizam o Join protocol para fazer isso • Comunidade e Grupos • Com o uso desses protocolos, a topologia de uma comunidade Jini é extremamente flexivel Lookup • uma vez usado discovery para encontrar um lookup service, o processo de lookup é o que podemos fazer com ele • o Lookup Service é uma espécie de name service - é um processo que mantém registros de todos os serviços que se juntaram a uma comunidade • as buscas em um lookup são feitas baseadas em tipos Java (normalmente interfaces) • depois que o discovery encontrou um Lookup Service, retorna uma referência a um objeto que implementa a interface de lookup ServiceRegistrar • Os detalhes da implemtação do lookup service são escondidos Publicando um Serviço • Cada lookup service mantém uma lista de “service itens”. Cada item contém um objeto (proxy) que pode ser usado para acessar o serviço, e uma lista de atributos que descrevem o serviço • O método ServiceRegistrar.register() é usado para registrar um serviço no lookup service encontrado, passando um “proxy”e uma série de parâmetros • O proxy (ou service proxy) é um objeto serializável arbitrário que será recebid por qualquer serviço ou aplicação que queira tirar proveito do seu serviço • o service proxy é que dá ao Jini a característica de se utilizar serviços sem nenhuma instalação de drivers ou configuração Service Proxy • pode ser considerado um device driver seguro e que é carregado sob demanda por clientes que precisarem utilizar o serviço • um cliente não precisa entender a forma como o service proxy é implementado e como ele se comunica (se é que se comunica) com o serviço • Pode ser implementado de diversas formas: – é o próprio serviço – apenas o RMI stub do serviço – é um proxy capaz de falar um protocolo específico - usado para serviços legados por exemplo Encontrando um Serviço • uma aplicação cliente pode procurar por um serviço através do lookup service • a busca pode ser feita pelo tipo do proxy, pelo identificador do serviço ou pelos atributos • ServiceRegistrar.lookup() • O valor retornado é um ou mais objetos proxy • Para se usar o proxy programaticamente, é necessário conhecer a interface, por isso o processo de definição de interfaces que está sendo realizado pela indústria nesse momento • O lookup utiliza esse mecanismo durante o processo de dicovery/join Leasing • O esquema de leasing permite que um sitema Jini seja estável, auto-reparável e resistente a falhas de rede, crash de máquinas e erros de software • Especialmente importante quando os sistemas são de longa duração (meses e ate mesmo anos) • Baseado na idéia de ao invés de se alocar recursos por períodos ilimitados, “empresta-se” o recurso por um periodo fixo de tempo • podem ser negadas, renovadas, canceladas, ou podem expirar normalmente, e podem ser negociadas • leases são usadas em todo o sistema Jini para garantir que o sistema se auto-recupere, e tambem que se torne basicamente livre de necessidade de administração • Leases podem também ser negociadas por terceiros Leasing • leases são fornecidas por um certa duração (1 minuto, 10 minutos) e o fornecedor pode decidir só garantir uma lease por um tempo menor do que o solicitado • quem receber a lease, se pretender renová-la, deverá manter a referência ao objeto recebido • leases são usadas para fornecer a capacidade de autorecuperação de um sistema Jini, portanto, quanto maior o tempo de lease, mais demorará para o sistema se recuperar Remote Events • Servicos Jini precisam ser ocasionalmente notificados de acontecimentos e mudanças de estado de outros serviços • Jini utiliza eventos distribuidos para fazer notificações assíncronas. Um evento é um objeto que contém informação sobre uma mudança de estado • Eventos Jini são diferentes de eventos Java, porque precisam levar em conta o fato de serem distribuidos – eventos não possuem ordem garantida – eventos pode não chegar ao destino devido a falhas parciais – envio de eventos é muito mais custoso (e portanto, menos eventos serão gerados) – o receptor do evento pode estar temporariamente desconectado ou incapz de receber o evento • Cada aplicação vai possuir seus próprios requerimentos em relação a seus eventos Remote Events • Exemplos: – lookup service gera eventos quando servicos aparecem, mudam ou desaparecem – um serviço de impressão poderia informar que um trabalho acabou de ser impresso • Eventos Jini são similares a eventos Java normais, mas possuem algumas diferencas: – existe um único tipo de evento RemoteEvent, e um único listener RemoteEventListener – isso permite se “delegar” o recebimento de eventos para terceiros – permite criar “chains” de filtros de eventos. Isso permite incluir objetos especializados em garantir “qualidade de serviço”para eventos (por exemplo, ordenar, garantir o recebimento, etc) – o interesse em um evento também utiliza leases Transactions • Jini transactions suportam 2-phase commit através de um trasaction manager e um conjunto de classes e interfaces • mas ao contrário de um banco de dados, Jini não define nenhuma semântica para a transação, apenas o processo é definido • cada serviço decide o que significa participar em uma transação para esse serviço em particular • qualquer número de serviços podem participar de uma determinada transação O que significa ser um serviço Jini • As necessidades de um device para participar de uma rede Jini são bastantes pequenas • o device - ou algum compoente de software em favor do device - precisa: – ser capaz de conectar em uma rede TCP/IP – participar no processo de discovery para encontrar pelo menos um lookup service – registrar junto ao lookup service, fornecendo um objeto proxy – garantir que os leases serão renovados durante todo o período de atividade do serviço • Outras possibilidades (não obrigatórias) – gerenciar os diversos lookup services – gerenciar leases e eventos O que significa ser um cliente Jini • Um cliente (que pode ser um serviço também, mas não necessariamente) precisa ser capaz de: – usar o protocolo de discovery para encontrar um ou mais lookup services – receber o proxy do serviço desejado – (opcional mas importante) registrar junto ao lookup para receber notificações sobre serviços registrados Jini em seus devices e serviços • Jini é desenhado para suportar o mais variado conjunto de devices • Para incluir Jini nos seus devices, é importante entender as possibilidades • Usar Jini em um computador de uso genérico – possui conexão com a rede (em geral por longos períodos) – capaz de rodar uma JVM • Usar Jini em um device com uma JVM embutida – menor poder de processamento – menor largura de banda na rede • Usar Jini para controlar um device sem JVM – nesse caso algum outro computador é usado para controlar esse devices que muitas vezes não tem nem poder de processamento Jini em um computador de uso genérico • A maior parte da mídia fala em Jini para pequenos devices, mas Jini é perfeitamente utilizável nos computadores atuais • Em casa – um PC possui um disco rígido, porque não diponibilizar esse disco para - cameras - telefones celulares - secretárias eletrônicas • Nas empresas – Jini pode rodar em grandes servidores, tornando redes corporativas extremamente robustas e resistentes a mudanças e problemas – facilitar o processo de administracão das redes corporativas Jini em um device com uma JVM embutida • Cada vez mais devices possuem uma JVM embutida e são capazes de executar aplicações Java • Similar ao caso anterior com as seguintes diferenças: – pequenos devices podem estar executando as edições mais simples da plataforma Java (J2ME por exemplo) – podem estar conectados de forma intermitente à rede – possuem menor poder de processamento • A limitação em relação a edição de Java pode significar um problema, em especial para serviços que requerem toda a capacidade da plataforma Java para executarem Jini para controlar um device sem JVM • Esse é o caminho que deve ser seguido pela maioria dos aparelhos • Nesse caso, uma máquina capaz de rodar uma JVM está de alguma forma conectada ao device, e faz o papel de Jini proxy para o device • O Jini proxy participa do processo de discovery e lookup, registra the service proxy, gerencia leases, tudo em prol do device • A conexão com o device acontece geralmente via RS232, USB, firewire, X10, ou outro meio físico qualquer (inclusive em alguns caso, a própria rede) • Esse Jini proxy poderia ser um computador genérico, ou algum device especializado para conectar algum tipo de aparelho Quando Jini é apropriado? • se existem ou irão existir servicos Jini que seu device ou aplicação poderão utilizar para ser mais efetivo • se seu device ou serviço puder fornecer valor para outros serviços ou devices • se seu device já possui uma JVM, ou é normalmente utilizado conectado a um computador genérico • se seu software está rodando em um computador capaz de rodar uma JVM • se seu software for facilmente separado em componentes, então talvez faça sentido separar cada um em um serviço Jini • se você está criando um device que será conectado a outros devices • se seu device puder tirar proveito de ser programável Quando Jini não é apropriado? • Dado que Jini foi desenhado para ser uma solução de uso genérico, são poucos os cenários onde Jini não se encaixa • se seu device é totalmente isolado • se seu device não possui, e não estará em nenhum lugar perto de um que possua, uma JVM Recursos: Jini: http://www.jini.net http://www.sun.com/jini Bruno Souza: [email protected] http://javaman.com.br SouJava http://soujava.org.br 8 Outras coisas a serem colocadas... • Licencimento SCSL • Empresas • Jini Comunity The Jini Community • Sun Community Source License (SCSL) model • Any Jini SCSL licensee is in the Jini community • Programs available for training, support, and marketing Sun Community Source License (SCSL) • New technology license ideas – – – – – “Open Source” flavor: Modifications given back to community Fewer restrictions: Compatibility through testing Easy access: Zero cost for non-commercial use Coexists with existing licenses Made generally available to licensee community • Compatibility – Technology Compatibility Kit – Upgrade tracking requirement for commercial products • No fee associated with the SCSL • Trademark license required for commercialization Jini Technology Available as Community Source • Research and education – Freely available, no restrictions • Internal use – Freely available, just pass compatibility test • Commercial use – Available with Jini Trademark/Branding Fee – Fee based license for commercial products sold for fee • Details – http://www.sun.com/jini