Versão 3 – fevereiro/2014
Tecgraf PUC-RioFevereiro de 2014
SDK OpenBus
Versão 3 – fevereiro/2014
OpenBus
• O OpenBus oferece:• Barramento de Integração• Controle de Acesso (autenticação e
identificação)• Serviços de Apoio à Integração• SDK
• Biblioteca de Acesso• Demos• Documentação• Utilitários
Versão 3 – fevereiro/2014
Visão de uma Integração
Versão 3 – fevereiro/2014
Visão de uma Integração
Versão 3 – fevereiro/2014
Visão de uma Integração
Versão 3 – fevereiro/2014
Visão de uma Integração
Versão 3 – fevereiro/2014
Visão de uma Integração
Versão 3 – fevereiro/2014
Visão da Arquitetura
Versão 3 – fevereiro/2014
Controle de Acesso
Cliente
Controle de Acesso
• Ponto de entrada no barramento • sua localização (referência) é conhecida por todos
login• Realiza uma autenticação•Gera um identificador de login •Login possui uma validade
Autenticação com usuário / senha
• Autentica os componentes que querem fazer parte do barramento
LDAP
Versão 3 – fevereiro/2014
• A autenticação no barramento pode ser feita por:• usuário e senha• certificado digital
Controle de Acesso - Autenticação
Versão 3 – fevereiro/2014
Autenticação por usuário e senha
• Requer a configuração de um servidor LDAP
• Normalmente, aplicações cliente (stand-alone) se autenticam no barramento usando usuário e senha
Versão 3 – fevereiro/2014
Autenticação por certificado
• Baseia-se em um par de chaves: pública e privada
• Um certificado digital normalmente é usado para ligar uma entidade a uma chave pública• Assinado digitalmente• Emitido e assinado por uma Autoridade
Certificadora• O padrão adotado é o X.509• A validação de certificados digitais é feita
usando um modelo desafio-resposta
Versão 3 – fevereiro/2014
Autenticação por certificado
• O OpenBus possui instalado os certificados públicos de todas as entidades que precisam se conectar a ele
• Apenas a entidade que se conecta ao barramento guarda a chave privada que é par da chave pública do certificado
• Para a autenticação, um desafio é gerado pelo barramento utilizando a chave pública da entidade
• A entidade decifra o desafio utilizando a sua chave privada
• A chave pública do barramento é usada para gerar a resposta a partir do desafio fornecido
Versão 3 – fevereiro/2014
• Autenticação e Identificação• Login
• Identificador único• Nome da entidade proprietária
• Cadeia de chamadas• Barramento responsável
• Lease de login• Um login é válido por um tempo
determinado• É renovado de tempos em tempos
Controle de Acesso
Versão 3 – fevereiro/2014
• Representa a identificação de todos os acessos ao barramento que originaram uma chamada recebida
• Contém as informações de login dos processos que originaram cada uma das chamadas aninhadas
• Útil para aplicações implementarem regras próprias de permissionamento
Controle de Acesso – Cadeia de chamadas
Versão 3 – fevereiro/2014
Registro de Ofertas
• Permite a oferta e a descoberta de serviços• Observação de ofertas e registros de ofertas• Sua referência é obtida através do
barramento• O mecanismo de govenança é usado para
garantir que apenas entidades autorizadas possam publicar serviços no barramento
Versão 3 – fevereiro/2014
• Descrição de oferta de serviço• Referência para a faceta IComponent do
serviço• Lista de propriedades descritivas
• Especificadas no ato do registro• Automáticas
• Referência para a oferta de serviço propriamente dita• Objeto CORBA que permite a alteração da oferta
pela entidade que a registrou ou usuários administradores
Registro de Ofertas
Versão 3 – fevereiro/2014
• Propriedades automáticas• Descritas na IDL do registro de ofertas
/** * openbus.offer.id: Ident. único da oferta. * openbus.offer.login: Ident. do login com que a oferta foi registrada. * openbus.offer.entity: Ident. da entidade que registrou a oferta. * openbus.offer.timestamp: Número indicando o momento do registro da oferta. * openbus.offer.year: Ano em que a oferta foi registrada. * openbus.offer.month: Número do mês em que a oferta foi registrada. * openbus.offer.day: Dia do mês que a oferta foi registrada. * openbus.offer.hour: Hora do dia em que a oferta foi registrada. * openbus.offer.minute: Minuto do dia em que a oferta foi registrada. * openbus.offer.second: Segundo do dia em que a oferta foi registrada. * openbus.component.name: Nome do componente SCS que implementa o serviço. * openbus.component.version.major: Versão maior do componente SCS que implementa o serviço. * openbus.component.version.minor: Versão menor do componente SCS que implementa o serviço. * openbus.component.version.patch: Versão de correção do componente SCS que implementa o serviço. * openbus.component.facet: Nome de faceta oferecida pelo component SCS que implementa o serviço. * openbus.component.interface: RepID de interface implementada por faceta do component SCS que implementa o serviço. */
Registro de Ofertas
Versão 3 – fevereiro/2014
Registro de Ofertas
Versão 3 – fevereiro/2014
Registro de Ofertas
Versão 3 – fevereiro/2014
Serviços Adicionais
• Atuais• Serviço de Colaboração• Serviço de Dados
• Não são parte do núcleo do barramento• Ou seja, não é obrigatória a presença desses
serviços em uma instância de barramento• Acrescentam funcionalidades para auxiliar
a integração entre serviços e aplicações
Versão 3 – fevereiro/2014
Serviço de Colaboração
• Permite criar e compartilhar uma sessão de colaboração entre serviços• Fornece mecanismo de notificação para adição
e exclusão de membros
• Oferece um canal de comunicação para o envio de eventos
Versão 3 – fevereiro/2014
SDK OpenBus
• Biblioteca que implementa o protocolo• Também dá suporte ao protocolo da
versão anterior do barramento, para que seja possível manter a integração com clientes legados
• Assistente (utilitário)• Documentação• Demos
Versão 3 – fevereiro/2014
API da Biblioteca
• Os principais conceitos são representados da seguinte forma:
• ORBInitializer• Connection• CallerChain• OpenBusContext
Versão 3 – fevereiro/2014
API - ORBInitializer
• Inicializador de ORBs para acesso a barramentos OpenBus
• Inicializa ORB de uso exclusivo para chamadas através do barramento• Chamadas fora do barramento devem ser feitas
em outro ORB• Abstrai a operação CORBA::ORB_init• Cada ORB inicializado através dessa classe
possui um OpenBusContext associado
Versão 3 – fevereiro/2014
API - ORBInitializer
// inicialização e configuração do ORBORB orb = ORBInitializer.initORB();// obtenção do gerente de contexto de chamadas associado a// esse ORBOpenBusContext context = (OpenBusContext) orb.resolve_initial_references(“OpenBusContext”);
• Exemplo:
Versão 3 – fevereiro/2014
API - Connection
• Representa um ponto de acesso ao barramento, que é usado tanto para realizar como para receber chamadas através do barramento
Versão 3 – fevereiro/2014
API - Connection
// criação de conexão (não lança exceções)Connection connection = context.createConnection(host,port);
• Exemplo:
Versão 3 – fevereiro/2014
API - Connection
• Utilizada para realizar acessos identificados ao barramento
• Deve ter um login associado• Atualmente duas formas de autenticação
são possíveis:• Por senha: loginByPassword• Por certificado digital: loginByCertificate
• É possível também obter um login através de uma autenticação prévia
Versão 3 – fevereiro/2014
API - Connection
// autenticaçãotry {
// por login e senhaconnection.loginByPassword(entity,
password.getBytes());// por certificadoconnection.loginByCertificate(entity, privateKey);// logoutconnection.logout();
}catch(…) { …}
• Exemplo:
Versão 3 – fevereiro/2014
API - Connection
• O resultado da autenticação é um login com tempo de validade (Lease)
• Cada conexão possui uma thread de renovação automática da validade do login
• Caso o login seja invalidado, é necessário re-autenticar e, no caso de serviços, reofertar suas ofertas no barramento• Para isso, deve-se implementar uma callback
Versão 3 – fevereiro/2014
API - Connection
// callback de renovação de login e ofertasConnection.onInvalidLoginCallback(
new InvalidLoginCallback() {public void invalidLogin(Connection conn,
LoginInfo login){ //1. autenticar no barramento //2. republicar ofertas se necessário //é necessário o tratamento de concorrência}
});
• Exemplo:
Versão 3 – fevereiro/2014
API - Connection
• Multiplexação• Possibilidade de assumir múltiplas identidades
através de múltiplas conexões
• Utiliza-se o OpenBusContext para criar e definir as conexões que serão utilizadas pelo ORB
Versão 3 – fevereiro/2014
API - CallerChain
• Representa a identificação de todos os acessos ao barramento que originaram uma chamada recebida
• Úteis para aplicações implementarem regras próprias de permissionamento
• São obtidas através do OpenBusContext
Versão 3 – fevereiro/2014
API - CallerChain
// obtenção da cadeia da requisiçãopublic void myServantMethod() {
CallerChain callerChain = context.getCallerChain();LoginInfo caller = callerChain.caller();System.out.println(caller.entity + “ called me.”);// unindo-se a uma cadeia de chamadascontext.joinChain(callerChain);someService.someMethod();context.exitChain();
}
• Exemplo:
Versão 3 – fevereiro/2014
API - OpenBusContext
• Permite controlar o contexto de chamadas de um ORB para acessar informações que as identificam
• O contexto representa a linha de execução atual do programa em relação a um ORB, o que tipicamente é a thread corrente (mais especificamente o CORBA::PICurrent do padrão CORBA)
Versão 3 – fevereiro/2014
API - OpenBusContext
• Que informações identificam as chamadas?• Conexão• Cadeia de chamadas
• O contexto:• Cria conexões• Manipula informações de contexto
• Qual conexão realiza a chamada• Qual cadeia está associada à chamada• Qual conexão recebe (atende) uma chamada
Versão 3 – fevereiro/2014
API - OpenBusContext
// configuração da conexão padrãocontext.setDefaultConnection(connection);// recuperação da conexão padrãoConnection conn = context.getDefaultConnection();
• Exemplo:
Versão 3 – fevereiro/2014
API - OpenBusContext
• O contexto também fornece a referência para serviços-núcleo:• Registro de ofertas
OfferRegistry offerRegistry = context.getOfferRegistry();
Versão 3 – fevereiro/2014
API - Publicação de Ofertas
try { // registro de um serviço no barramento ServiceProperty[] properties = new ServiceProperty[] { new ServiceProperty(“my property”, “my property value”)}; context.getOfferRegistry().registerService(iComponent, properties);}catch (…) {…}
Versão 3 – fevereiro/2014
API - Busca e Utilização de Ofertas
ServiceOfferDesc[] offers;try { // busca por serviço ServiceProperty[] properties = new ServiceProperty[1]; properties[0] = new ServiceProperty(“my property”, “my property value”)}; offers = context.getOfferRegistry().findServices(properties);}catch (…) {…}
Versão 3 – fevereiro/2014
API - Busca e Utilização de Ofertas
// análise das ofertas encontradasfor(ServiceOfferDesc offerDesc : offers) { try { org.omg.CORBA.Object serviceObj = offerDesc.service_ref.getFacet(ServiceHelper.id()); if (serviceObj == null) { continue; } Service service = ServiceHelper.narrow(serviceObj); service.someMethod(); } catch (…) { … }}
Versão 3 – fevereiro/2014
Assistente
• Abstração sobre a biblioteca de acesso cujo objetivo é atuar como um utilitário que atende a cenários de uso mais comuns
• Auxilia na autenticação com o barramento• Auxilia no registro e busca de ofertas• Permite a configuração de número de tentativas• Permite configurar callbacks de falhas• Limitação de um assistente por ORB
Versão 3 – fevereiro/2014
Assistente
• Cenários recomendados:• Comunicação com um único barramento• Necessidade de apenas uma autenticação
• Cenários não recomendados:• Comunicação com mais de um barramento• Necessidade de múltiplas autenticações, com
um ou mais barramentos
Versão 3 – fevereiro/2014
Assistente
• Principais vantagens:• Auxílio na autenticação com o
barramento• Implementa a callback onInvalidLogin para o
usuário• Ofertas de serviços são mantidas
automaticamente caso a autenticação seja refeita
Versão 3 – fevereiro/2014
Assistente - Login
// Criação de um assistente – tentará realizar o login em uma// nova thread, até conseguir
// por login e senhaAssistant assistant = Assistant.createWithPassword(host, port, entity, password.getBytes());
// por certificadoAssistant assistant = Assistant.createWithPrivateKey(host, port, entity, privateKey);
• Exemplo:
Versão 3 – fevereiro/2014
Assistente – Publicação de Oferta
// registro de um serviço no barramento - tentará realizar o// registro em uma nova thread, até conseguir
ServiceProperty[] properties = new ServiceProperty[]{ new ServiceProperty(“my property”, “my property value”)};assistant.registerService(iComponent, properties);
• Exemplo:
Versão 3 – fevereiro/2014
Assistente – Busca por Oferta
// busca por serviçoServiceProperty[] properties = new ServiceProperty[1];properties[0] = new ServiceProperty(“my property”, “my property value”)};ServiceOfferDesc[] offers;try { // O segundo parâmetro define o número de tentativas. // -1 significa tentar indefinidamente até conseguir. // Pode-se configurar o tempo entre as tentativas. offers = assistant.findServices(properties, -1);}catch (…) {…}
• Exemplo:
Versão 3 – fevereiro/2014
Boas Práticas
• Ambiente distribuído• Sempre pode haver falhas de acesso a
objetos remotos• Exceções sempre devem ser tratadas
para garantir a robustez
Versão 3 – fevereiro/2014
Tratamento de Exceções
• OpenBus• CORBA::NoPermission
• NoLogin – caso alguma operação que dependa de login seja feita e não haja um login no momento
• InvalidChain – cadeia inválida enviada• UnknownBus – barramento não conhecido pelo
serviço que se está tentando utilizar• UnverifiedLogin – o serviço que se está tentanto
utilizar não conseguiu verificar seu login no barramento
• InvalidRemote – protocolos de versão incompatíveis
• ServiceFailure – falha interna em um serviço
Versão 3 – fevereiro/2014
Tratamento de Exceções
• CORBA• CORBA::TRANSIENT
• Ocorreu um erro na comunicação, mas pode ser possível tentar novamente (ex: não foi possível contactar o servidor)
• CORBA::COMM_FAILURE• Erro de comunicação durante o atendimento de
uma chamada (ex: falta de recursos no servidor)• CORBA::OBJECT_NOT_EXISTS
• O objeto requisitado no servidor não existe
Versão 3 – fevereiro/2014
Detalhes e Outras Funcionalidades
• Veremos agora:
• Comunicação detalhada• Multiplexação• Compartilhamento de autenticação
Versão 3 – fevereiro/2014
Comunicação Detalhada
Versão 3 – fevereiro/2014
Comunicação Detalhada
Versão 3 – fevereiro/2014
Multiplexação
• OpenBusContext• Representa dois contextos diferentes
• Contexto de Requisição (realização de chamadas)
• Contexto de Despacho (recebimento de chamadas)
• Define conexão padrão• A ser utilizada tanto em Requisição como em
Despacho, caso não sejam especificadas
Versão 3 – fevereiro/2014
Multiplexação – Contexto de Request
// configuração da conexão padrãocontext.setDefaultConnection(connection);
• Exemplo:
Versão 3 – fevereiro/2014
Multiplexação
• OpenBusContext• Como Contexto de Requisição
• Define conexão corrente• Permite configurar a cadeia de chamadas
associada à requisição• Métodos joinChain, exitChain, getJoinedChain
Versão 3 – fevereiro/2014
Multiplexação – Contexto de Request
// configuração da conexão de requisição (requester)context.setCurrentConnection(connection);
// junta-se a uma cadeia específicacontext.joinChain(some_chain);realiza_chamada_remota();
// deixa de usar essa cadeia para as próximas requisiçõescontext.exitChain();
// volta a usar a conexão padrãocontext.setCurrentConnection(null);
• Exemplo:
Versão 3 – fevereiro/2014
Multiplexação
• OpenBusContext• Como Contexto de Despacho
• Define conexão de despacho• E callback onCallDispatch para a escolha dessa
conexão• Permite consultar a cadeia de chamadas
associada à chamada recebida• Método getCallerChain
Versão 3 – fevereiro/2014
Multiplexação – Contexto de Dispatch
// configuração da conexão de despacho (dispatcher)context.onCallDispatch( new CallDispatchCallback() { @Override public Connection Dispatch(OpenBusContext context, String busid, String loginId, byte[] object_id, String operation){ // cabe ao código da aplicação escolher a conexão return some_connection; } });
• Exemplo:
Versão 3 – fevereiro/2014
Multiplexação
• OpenBusContext• Método context.getCurrentConnection()
• Contexto de Requisição:• Obtém a conexão corrente do contexto ou a
padrão• Contexto de Despacho
• Obtém a conexão que atende à requisição
Versão 3 – fevereiro/2014
Compartilhamento de Autenticação
try { OctetSeqHolder secret = new OctetSeqHolder(); // compartilhamento de autenticação LoginProcess login = connection.startSharedAuth(secret); // passa login e secret para outra aplicação de alguma forma // segura …}catch (…) {…}
• Serviço autenticado (API padrão):
Versão 3 – fevereiro/2014
Compartilhamento de Autenticação
try { // Recebe informações de login e segredo de alguma forma // segura LoginProcess login = …; byte[] secret = …; // Utiliza dados recebidos para realizar login Connection connection = context.createConnection(host,port); connection.loginBySharedAuth(login, secret.value); …}catch (…) {…}
• Serviço se autenticando (API padrão):
Versão 3 – fevereiro/2014
Compartilhamento de Autenticação
Assistant assistant = new Assistant(host, port) { @Override public AuthArgs onLoginAuthentication() { try { // Recebe informações de login e segredo de alguma forma // segura return new AuthArgs(login, secret); } catch (…) { … } return null; }};
• Serviço se autenticando (Assistente):