Desenvolvimento de aplicações para a Cloud AppServiceBus
Enterprise Service Bus Um enterprise service bus (ESB) é um modelo arquitectural de software utilizado para desenhar e implementar a interacção e a comunicação entre aplicações de software que interagem numa arquitetura orientada aos serviços. O desenho e a implementação dos ESBs variam nas diferentes organizações. 2
APPFabric Service Bus 3
Segurança: integração ACS 4
Tipo de Autenticação do cliente <binding name="default"> <security relayclientauthenticationtype="none" /> </binding> Os serviços e os clientes podem escolher autenticar-se por uns dos tipos já configurados: Saml SharedSecret SimpleWebToken Unauthenticated 5
Segurança da mensagem Refere-se à segurança da mensagem que utiliza o AppFabric Service Bus para chegar ao seu destino. O AppFabricServiceBus oferece 4 opções para a segurança de mensagens entre clientes e serviços A enumeração Microsoft.ServiceBus.EndToEndSecurityMode define 4 modos de segurança None Transport Message TransportWithMessageCredential 6
Naming Service O service Bus AppFabric oference um sistema de nomeação DNS-compatible para atribuir um único Internet URIs aos serviços. O AppFabric Service Bus define um root domain name que pode ser resolvido através de Internet DNS, mas oferece um serviço baseado nos namespaces para nomear a hierarquia sob a raíz. [scheme]://[solution-name].servicebus.windows.net/[name]/[name]/ 7
Service Registry O AppFabric Service Bus fornece um serviço de registo e descoberta para os endpoints do serviço, designado por Service Registry. O Service Registry oferece uma solução Atom feed para cada solução. class Program{ static void Main(string[] args){ ServiceHost host = new ServiceHost(typeof(MyService)); ServiceRegistrySettings settings = new ServiceRegistrySettings(); settings.discoverymode = DiscoveryType.Public; foreach(serviceendpoint s in host.description.endpoints) s.behaviors.add(settings); host.open(); Console.WriteLine("Press [Enter] to exit"); Console.ReadLine(); host.close(); }} http://proazure.servicebus.windows.net/ 8
Messaging Fabric O Windows Azure Service Bus fornece duas soluções de messaging: Relayed Messaging Service Bus Brokered Messaging Queue Relay Aplicação Aplicação 9
Relayed Messaging O relay service suporta o modelo de comunicação Relayed Messaging. É uma componente do Service Bus centralizada Suporta diferentes protocolos de transporte e stardards dos Web Services Suporta os seguintes tipos de comunicação entre clientes e serviços: One-Way messaging Request-Response messaging Peer to peer messaging Conecções directas entre clientes e serviços 10
Relayed Message pattern 11
Exemplos de App Service Bus Bindings Bindings BasicHttpRelayBinding WebHttpRelayBinding Descrição Utiliza HTTP para o transporte Suporta HTTP, XML... Utilizado normalmente em interfaces REST WSHttpRelayContextBinding Suporta binding de contexto entre o serviço e o relay service. NetTcpRelayBinding Utiliza TCP para o transporte. NetTcpRelayContextBinding Suporta binding de contexto entre o serviço e o relay service. Utiliza TCP para o transporte NetOneWayRelayBinding Suporta mensagens one-way entre o serviço e o relay service. 12
Service Bus Relay Service 13
Utilização do Service Bus Relay É necessário: 1. Criar um service namespace Fornece um contentor de contexto para endereçar os recursos do Service Bus no contexto da nossa aplicação É realizado no Management Portal 2. Obter as credenciais de gestão para o namespace São obtidas através do Management Portal 3. Configurar a aplicação para utilizar o Service Bus 4. Criar um Security Token Provider 14
Exemplo: IProblemSolver using System.ServiceModel; [ServiceContract(Namespace = "urn:ps")] interface IProblemSolver { [OperationContract] int AddNumbers(int a, int b); } interface IProblemSolverChannel : IProblemSolver, IClientChannel {} class ProblemSolver : IProblemSolver { public int AddNumbers(int a, int b) { return a + b; } } 15
System.ServiceModel.ServiceHost ServiceHost sh = new ServiceHost(typeof(ProblemSolver)); sh.addserviceendpoint( typeof (IProblemSolver), new NetTcpBinding(), "net.tcp://localhost:9358/solver ); ServiceEndpoint se= sh.addserviceendpoint( typeof(iproblemsolver), new NetTcpRelayBinding(), ServiceBusEnvironment. CreateServiceUri("sb", "**namespace**", "solver") ); se.behaviors.add(new TransportClientEndpointBehavior { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("owner", "**key**")} ); sh.open(); Console.WriteLine("Press ENTER to close"); Console.ReadLine(); sh.close(); 16
Ou configurando o ficheiro App.config <services> <service name="service.problemsolver"> <endpoint contract="service.iproblemsolver binding="nettcpbinding" address="net.tcp://localhost:9358/solver"/> <endpoint contract="service.iproblemsolver" binding="nettcprelaybinding" address="sb://**namespace**.servicebus.windows.net/solver" behaviorconfiguration="sbtokenprovider"/> </service> </services> <behaviors> <endpointbehaviors> <behavior name="sbtokenprovider"> <transportclientendpointbehavior> <tokenprovider> <sharedsecret issuername="owner" issuersecret="**key**" /> </tokenprovider> </transportclientendpointbehavior> </behavior> </endpointbehaviors> </behaviors> 17
Configurar o cliente programaticamente var cf = new ChannelFactory<IProblemSolverChannel>( new NetTcpRelayBinding(), new EndpointAddress(ServiceBusEnvironment. CreateServiceUri("sb", "**namespace**", "solver")) ); cf.endpoint.behaviors.add( new TransportClientEndpointBehavior { ); } TokenProvider = TokenProvider. CreateSharedSecretTokenProvider("owner","**key**") using (var ch = cf.createchannel()) { Console.WriteLine(ch.AddNumbers(4, 5)); } 18
Configurar o cliente com ficheiro de configuração <client> <endpoint name="solver" contract="myservice.iproblemsolver" binding="nettcprelaybinding" address="sb://**namespace**.servicebus.windows.net/solver" behaviorconfiguration="sbtokenprovider"/> </client> <behaviors> <endpointbehaviors> <behavior name="sbtokenprovider"> <transportclientendpointbehavior> <tokenprovider> <sharedsecret issuername="owner" issuersecret="**key**" /> </tokenprovider> </transportclientendpointbehavior> </behavior> </endpointbehaviors> </behaviors> 19
Brokered Messaging O modelo de comunicação Brokered Messaging fornece capacidade de comunicação assíncrona ou desacoplada que suportacenários de publish/subscribe, desacoplamento temporal e load balancing. Existem 3 padrões de messaging para este modelo: Queues; Topics/Subscriptions Rules/Actions 20
Service Bus Queues 21
Aplicações das Service Bus Queues Comunicação entre web e worker roles numa aplicação Windows Azure multi-tier Comunicações entre aplicações que não estejam na cloud e aplicações que estejam alojadas na cloud Comunicação entre componentes de uma aplicação distribuída que esteja alojada em organizações diferentes. 22
Criação de uma Service Bus Queue Criar uma queue é um processo multi-passo. É necessário 1. Criar um service namespace Fornece um contentor de contexto para endereçar os recursos do Service Bus no contexto da nossa aplicação É realizado no Management Portal 2. Obter as credenciais de gestão para o namespace São obtidas através do Management Portal 3. Configurar a aplicação para utilizar o Service Bus 4. Criar um Security Token Provider 5. Criar uma Queue 23
3. Configurar a aplicação para utilizar o Service Bus Adicionar a referência Microsoft.ServiceBus.dll Importar os seguintes namespaces: using Microsoft.ServiceBus using Microsoft.ServiceBus.Messaging; 24
4. Criar um security token provider string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); TokenProvider 25
Criar uma queue string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); NameSpaceManager manager= new NameSpaceManager(uri,tP); manager.createqueue( MyQueue ); QueueDescription qd= new QueueDescription( MyQueue ); qd.maxsizeinmegabytes=5120; qd.defaultmessagetimetolive = new TimeSpan(0,1,0): manager.createqueue(qd); 26
Enviar mensagem a uma queue string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); MessagingFactory factory = MessagingFactory.Create(uri, tp); MessageSender myqueue = factory.createmessagesender( MyQueue"); for (int i=0; i<5; i++) { } BrokeredMessage message = new BrokeredMessage("Test message " + i); myqueue.send(message); 27
Receber mensagens de uma queue string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); MessagingFactory factory = MessagingFactory.Create(uri, tp); MessageReceiver myqueue = factory.createmessagereceiver( MyQueue"); while (true) { BrokeredMessage message = myqueue.receive(); if (message!= null) { try { Console.WriteLine("Body: " + message.getbody<string>()); Console.WriteLine("MessageID: " + message.messageid); message.complete(); } catch (Exception) {message.abandon(); } } } 28
Sessões // Create a SessionReceiver to get next available session SessionReceiver sr = myqueue.acceptsessionreceiver(receivemode.peeklock); BrokeredMessage message = sr.receive(); try { ProcessMessage(message); message.complete(); } catch (Exception) { message.abandon(); } 29
Windows Azure Queues e Service Bus Queues Critério Windows Azure Queues Service Bus Queues Garantia na ordem Não Sim (FIFO) (através do uso de sessões) Garantia na entrega At-Least-Once At-Least-Once/At-Most-Once Suporte nas transacções Não Sim (utilização de transacções locais) Comportamento de recepção Não bloqueante Bloqueante com ou sem timeout Modo de recepção Peek & Lease Peek & Lock Receive & Delete Modo de acesso exclusivo Lease-Based Lock-Based Duração do Lease/Lock 30 s (omissão) /7 d (máximo) 60 s (omissão) /5 m (máximo) Granularidade do Lease/Lock Ao nível da mensagem Ao nível da queue Recepção em lote 30 Sim (especificar o Message Count) Sim (permitir a propriedade prefetch ou utilizar transacções) Envio em lote Não Sim (com transacções)
Windows Azure Queues e Service Bus Queues -Cotas Critério Windows Azure Queues Service Bus Queues Tamanho máximo da mensagem Tamanho máximo da queue TTL da mensagem máximo 7 dias 64KB (48KB se é utilizado a codificação Base64) 256KB 100 TB 1,2,3,4 ou 5 GB Ilimitado Número máximo de queues Ilimitado 10 000 Número máximo de clientes concorrentes Ilimitado Ilimitado Comparação entre Windows Azure Queues e Service Bus Queues 31
Topics/Subscriptions 32
Criação de um Service Bus Topic É necessário 1. Criar um service namespace Fornece um contentor de contexto para endereçar os recursos do Service Bus no contexto da nossa aplicação É realizado no Management Portal 2. Obter as credenciais de gestão para o namespace São obtidas através do Management Portal 3. Configurar a aplicação para utilizar o Service Bus 4. Criar um Security Token Provider 5. Criar um Topic 33
Criar um topic string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); NameSpaceManager manager= new NameSpaceManager(uri,tP); manager.createtopic( MyTopic ); TopicDescription td = new TopicDescription("TestTopic"); td.maxsizeinmegabytes = 5120; td.defaultmessagetimetolive = new TimeSpan(0, 1, 0); manager.createtopic(td); 34
Criar um subscription string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); NameSpaceManager manager= new NameSpaceManager(uri,tP); manager.createsubscription( MyTopic, AllMessages ); 35
Enviar mensagens a um topic string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); MessagingFactory factory = MessagingFactory.Create(uri, tp); MessageSender mytopic = factory.createmessagesender( MyTopic"); for (int i=0; i<5; i++) { BrokeredMessage message = new BrokeredMessage("Test message " + i); mytopic.send(message); } 36
Receber mensagens de uma subscrição string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); MessagingFactory factory = MessagingFactory.Create(uri, tp); MessageReceiver mytopic= factory.createmessagereceiver( MyTopic/subscriptions/AllMessages ); while (true) { BrokeredMessage message = myqueue.receive(); if (message!= null) { try { Console.WriteLine("Body: " + message.getbody<string>()); Console.WriteLine("MessageID: " + message.messageid); message.complete(); } catch (Exception) {message.abandon(); } } } 37
Eliminar Tópicos e Subscrições string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); NameSpaceManager manager= new NameSpaceManager(uri,tP); manager.deletetopic( MyTopic ); manager.deletesubscription( MyTopic, AllMessages ); 38
Rules / Actions Podem criar subscrições com filtros para restringir que mensagens, enviadas a um determinado tópico, devem surgir no contexto de uma subscrição a esse mesmo tópico São criados através de Subscription Filters Os filtros são aplicados sobre as propriedades das mensagens (quer as de aplicação, quer as de sistema) Filter FalseFilter sem mensagens TrueFilter todas as mensagens (por omissão) SqlFilter sintaxe SQL92 SqlRuleAction São compostar por filtros e acções As acções usam sintaxe SQL92 para modificar o conjunto de propriedades de uma subscrição. 39
Exemplo string issuer= <obtido do portal> : string key= <obtido do portal> TokenProvider tp= TokenProvider.CreateSharedSecretTokenProvider(issue,key); Uri uri = ServiceBusEnvironment. CreateServiceUri( sb, MyServiceNamespace, string.empty); NameSpaceManager manager= new NameSpaceManager(uri,tP); SqlFilter highmessages = new SqlFilter("MessageNumber > 3"); manager.createsubscription( MyTopic", "HighMessages", highmessages); 40
RuleDescription summerrule = new RuleDescription(){ Action = new SqlRuleAction( SET HavingFun = Yes ), Filter = new SqlFilter( Month = June OR Month = July OR [Month] = August ), Name = SummerRule }; TopicDescription topicdescription = manager.createtopic( WeatherTopic ); manager.createsubscription( WeatherTopic, WeatherSubscription, summerrule); 41