SDK OpenBus
Tecgraf PUC-Rio
Novembro de 2013
versão 1 - julho/2013
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 1 - julho/2013
Visão de uma Integração
versão 1 - julho/2013
Visão de uma Integração
versão 1 - julho/2013
Visão de uma Integração
versão 1 - julho/2013
Visão de uma Integração
versão 1 - julho/2013
Visão de uma Integração
versão 1 - julho/2013
Visão da Arquitetura
versão 1 - julho/2013
Controle de Acesso
•
Ponto de entrada no barramento
• sua localização (referência) é conhecida por todos
• Autentica os componentes que
querem fazer parte do
barramento
• Realiza uma autenticação
•Gera um identificador de login
•Login possui uma validade
versão 1 - julho/2013
LDAP
Controle de
Acesso
Autenticação com
usuário / senha
login
Cliente
Controle de Acesso - Autenticação
• A autenticação no barramento pode ser feita
por:
• usuário e senha
• certificado digital
versão 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
Controle de Acesso
• 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
versão 1 - julho/2013
Controle de Acesso – Cadeia de chamadas
• 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
versão 1 - julho/2013
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 1 - julho/2013
Registro de Ofertas
• 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
versão 1 - julho/2013
Registro de Ofertas
• 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.
*/
versão 1 - julho/2013
Registro de Ofertas
versão 1 - julho/2013
Registro de Ofertas
versão 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
API da Biblioteca
• Os principais conceitos são representados da
seguinte forma:
•
•
•
•
ORBInitializer
Connection
CallerChain
OpenBusContext
versão 1 - julho/2013
API - ORBInitializer
• Inicializador de ORBs para acesso a barramentos
OpenBus
– Mas IIOP.NET só permite uma instância de ORB
• Limita o ORB ao uso exclusivo para chamadas
através do barramento
• Chamadas fora do barramento deveriam ser feitas em
outro ORB, mas com o IIOP.NET não é possível
• Abstrai a operação CORBA::ORB_init
• O ORB passa a ter um OpenBusContext
associado
versão 1 - julho/2013
API - ORBInitializer
• Exemplo:
// inicialização e configuração do ORB e
// obtenção do gerente de contexto de chamadas associado
OpenBusContext context = ORBInitializer.Context;
versão 1 - julho/2013
API - Connection
• Representa um ponto de acesso ao
barramento, que é usado tanto para realizar
como para receber chamadas através do
barramento
versão 1 - julho/2013
API - Connection
• Exemplo:
// criação de conexão (não lança exceções)
// o terceiro parâmetro é um conjunto de propriedades
// opcionais, como suporte a clientes legados
Connection connection = context.createConnection(host, port,
null);
versão 1 - julho/2013
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 1 - julho/2013
API - Connection
• Exemplo:
// autenticação
try {
// por login e senha
connection.LoginByPassword(entity, password);
// por certificado
connection.LoginByCertificate(entity, privateKey);
// logout
connection.Logout();
}
catch(…) {
…
}
versão 1 - julho/2013
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 reautenticar e, no caso de serviços, reofertar suas
ofertas no barramento
• Para isso, deve-se implementar uma callback
versão 1 - julho/2013
API - Connection
• Exemplo:
// callback de renovação de login e ofertas
connection.OnInvalidLogin = InvalidLogin;
...
private void InvalidLogin(Connection conn, LoginInfo login){
//1. autenticar no barramento
//2. republicar ofertas se necessário
//é necessário o tratamento de concorrência
}
versão 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
API - CallerChain
• Exemplo:
// obtenção da cadeia da requisição
public void MyServantMethod() {
CallerChain callerChain =
ORBInitializer.Context.CallerChain;
LoginInfo caller = callerChain.Caller;
System.out.println(caller.entity + “ called me.”);
// unindo-se a uma cadeia de chamadas
context.JoinChain(callerChain);
someService.someMethod();
context.ExitChain();
}
versão 1 - julho/2013
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 ao ORB, o que
tipicamente é a thread corrente (mais
especificamente o CORBA::PICurrent do padrão
CORBA)
versão 1 - julho/2013
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 1 - julho/2013
API - OpenBusContext
• Exemplo:
// configuração da conexão padrão
context.SetDefaultConnection(connection);
// recuperação da conexão padrão
Connection conn = context.GetDefaultConnection();
versão 1 - julho/2013
API - OpenBusContext
• O contexto também fornece a referência para
serviços-núcleo:
• Registro de ofertas
OfferRegistry offerRegistry = context.OfferRegistry;
versão 1 - julho/2013
API - Publicação de Ofertas
try {
// registro de um serviço no barramento
ServiceProperty[] properties = new[] {
new ServiceProperty(“my property”, “my property value”)};
context.OfferRegistry.registerService(iComponent,
properties);
}
catch (…) {
…
}
versão 1 - julho/2013
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.OfferRegistry.findServices(properties);
}
catch (…) {
…
}
versão 1 - julho/2013
API - Busca e Utilização de Ofertas
// análise das ofertas encontradas
string serviceType = ...;
foreach(ServiceOfferDesc offerDesc in offers) {
try {
MarshalByRefObject serviceObj =
offerDesc.service_ref.getFacet(serviceType);
if (serviceObj == null) {
continue;
}
Service service = serviceObj as Service;
if (service == null) {...}
service.someMethod();
}
catch (…) {
…
}
}
versão 1 - julho/2013
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 1 - julho/2013
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
• Esses cenários são impossíveis com a versão atual do
IIOP.NET
versão 1 - julho/2013
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 1 - julho/2013
Assistente - Login
• Exemplo:
// Criação de um assistente – tentará realizar o login em uma
// nova thread, até conseguir
// por login e senha
Assistant assistant = new AssistantImpl(host, port,
new PasswordProperties(entity, password));
// por certificado
Assistant assistant = new AssistantImpl(host, port,
new PrivateKeyProperties(entity, privateKey));
versão 1 - julho/2013
Assistente – Publicação de Oferta
• Exemplo:
// registro de um serviço no barramento - tentará realizar o
// registro em uma nova thread, até conseguir
ServiceProperty[] properties = new[] {
new ServiceProperty(“my property”, “my property value”)};
assistant.RegisterService(iComponent, properties);
versão 1 - julho/2013
Assistente – Busca por Oferta
• Exemplo:
// busca por serviço
ServiceProperty[] properties = new[] {
new ServiceProperty(“my property”, “my property value”)};
ServiceOfferDesc[] offers = Utils.FilterWorkingOffers(
assistant.FindServices(properties, -1));
versão 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
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 1 - julho/2013
Detalhes e Outras Funcionalidades
• Veremos agora:
• Comunicação detalhada
• Multiplexação
• Compartilhamento de autenticação
versão 1 - julho/2013
Comunicação Detalhada
versão 1 - julho/2013
Comunicação Detalhada
versão 1 - julho/2013
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 1 - julho/2013
Multiplexação – Contexto de Request
• Exemplo:
// configuração da conexão padrão
context.SetDefaultConnection(connection);
versão 1 - julho/2013
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
• Propriedade JoinedChain
versão 1 - julho/2013
Multiplexação – Contexto de Request
• Exemplo:
// configuração da conexão de requisição (requester)
context.SetCurrentConnection(connection);
// junta-se a uma cadeia específica
context.JoinChain(some_chain);
realiza_chamada_remota();
// deixa de usar essa cadeia para as próximas requisições
context.ExitChain();
// volta a usar a conexão padrão
context.SetCurrentConnection(null);
versão 1 - julho/2013
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
• Propriedade CallerChain
versão 1 - julho/2013
Multiplexação – Contexto de Dispatch
• Exemplo:
// configuração da conexão de despacho (dispatcher)
context.OnCallDispatch = Dispatch;
...
public Connection Dispatch(OpenBusContext context, string
busid, string caller, string uri, string
operation){
// cabe ao código da aplicação escolher a conexão
return some_connection;
}
}
);
versão 1 - julho/2013
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 1 - julho/2013
Compartilhamento de Autenticação
• Serviço autenticado (API padrão):
try {
// compartilhamento de autenticação
byte[] secret;
LoginProcess login = connection.StartSharedAuth(out secret);
// passa login e secret para outra aplicação de alguma forma
// segura
…
}
catch (…) {
…
}
versão 1 - julho/2013
Compartilhamento de Autenticação
• Serviço se autenticando (API padrã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, null);
connection.LoginBySharedAuth(login, secret.value);
…
}
catch (…) {
…
}
versão 1 - julho/2013
Compartilhamento de Autenticação
• Serviço se autenticando (Assistente):
Assistant assistant = new AssistantImpl(host, port,
new SharedAuthProperties(SharedAuthObtainer));
...
private LoginProcess SharedAuthObtainer(out byte[] secret) {
LoginProcess login = …;
secret = …;
return login;
}
versão 1 - julho/2013
Download

SDK C# OpenBus - Tecgraf JIRA / Confluence - PUC-Rio