Desenvolvimento de aplicações para
a Cloud
Enterprise Service Bus
Cátia Vaz 2011/2012 2
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
APPFabric Service Bus
Cátia Vaz 2011/2012 3
Segurança: integração ACS
Cátia Vaz 2011/2012 4
Tipo de Autenticação do cliente
Cátia Vaz 2011/2012 5<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
Segurança da mensagem
Cátia Vaz 2011/2012 6
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
Naming Service
Cátia Vaz 2011/2012 7
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.
Service Registry
Cátia Vaz 2011/2012 8
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();
}}
Messaging Fabric
Cátia Vaz 2011/2012 9
O Windows Azure Service Bus fornece duas soluções de
messaging:
Relayed Messaging
Brokered Messaging
Service Bus
Queue
Relay
Relayed Messaging
Cátia Vaz 2011/2012 10
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
…
Relayed Message pattern
Cátia Vaz 2011/2012 11
Exemplos de App Service Bus Bindings
Cátia Vaz 2011/2012 12
Bindings
Descrição
BasicHttpRelayBinding
Utiliza HTTP para o transporte
WebHttpRelayBinding
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
Service Bus Relay Service
Cátia Vaz 2011/2012 13
Utilização do Service Bus Relay
Cátia Vaz 2011/2012 14
É 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
Exemplo: IProblemSolver
Cátia Vaz 2011/2012 15using 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;
}
}
System.ServiceModel.ServiceHost
Cátia Vaz 2011/2012 16
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();
Ou configurando o ficheiro App.config
Cátia Vaz 2011/2012 17
<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>
Configurar o cliente programaticamente
Cátia Vaz 2011/2012 18
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));
}
Configurar o cliente com ficheiro de
configuração
Cátia Vaz 2011/2012 19 <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>Brokered Messaging
Cátia Vaz 2011/2012 20
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
Service Bus Queues
Cátia Vaz 2011/2012 21
Aplicações das Service Bus Queues
Cátia Vaz 2011/2012 22
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
Criação de uma Service Bus Queue
Cátia Vaz 2011/2012 23
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
3. Configurar a aplicação para utilizar o
Service Bus
Cátia Vaz 2011/2012 24
Adicionar a referência Microsoft.ServiceBus.dll
Importar os seguintes namespaces:
using Microsoft.ServiceBus
4. Criar um security token provider
Cátia Vaz 2011/2012 25
string issuer=“<obtido do portal>”:
string key=“<obtido do portal>”
TokenProvider tP=
TokenProvider.CreateSharedSecretTokenProvider(issue,key);
Criar uma queue
Cátia Vaz 2011/2012 26
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);
Enviar mensagem a uma queue
Cátia Vaz 2011/2012 27
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);
Receber mensagens de uma queue
Cátia Vaz 2011/2012 28
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(); } }
Sessões
Cátia Vaz 2011/2012 29
// 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();
}
Windows Azure Queues e Service Bus
Queues
Cátia Vaz 2011/2012 30
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 Sim (especificar o Message Count) Sim (permitir a propriedade pre-fetch ou utilizar transacções)
Windows Azure Queues e Service Bus
Queues -Cotas
Cátia Vaz 2011/2012 31
Critério Windows Azure Queues Service Bus Queues
Tamanho máximo da mensagem 64KB (48KB se é utilizado a codificação Base64) 256KB Tamanho máximo da queue 100 TB 1,2,3,4 ou 5 GB
TTL da mensagem máximo 7 dias Ilimitado Número máximo de queues Ilimitado 10 000 Número máximo de clientes concorrentes Ilimitado Ilimitado
Topics/Subscriptions
Cátia Vaz 2011/2012 32
Criação de um Service Bus Topic
Cátia Vaz 2011/2012 33
É 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
Criar um topic
Cátia Vaz 2011/2012 34
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);
Criar um subscription
Cátia Vaz 2011/2012 35
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);
Enviar mensagens a um topic
Cátia Vaz 2011/2012 36
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);
Receber mensagens de uma subscrição
Cátia Vaz 2011/2012 37
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(); } }
Eliminar Tópicos e Subscrições
Cátia Vaz 2011/2012 38
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”);
Rules / Actions
Cátia Vaz 2011/2012 39
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
Exemplo
Cátia Vaz 2011/2012 40
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");
Cátia Vaz 2011/2012 41