• Nenhum resultado encontrado

Desenvolvimento de aplicações para a Cloud. AppServiceBus

N/A
N/A
Protected

Academic year: 2021

Share "Desenvolvimento de aplicações para a Cloud. AppServiceBus"

Copied!
41
0
0

Texto

(1)

Desenvolvimento de aplicações para

a Cloud

(2)

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

(3)

APPFabric Service Bus

Cátia Vaz 2011/2012 3

(4)

Segurança: integração ACS

Cátia Vaz 2011/2012 4

(5)

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

(6)

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

(7)

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.

(8)

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();

}}

(9)

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

(10)

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

(11)

Relayed Message pattern

Cátia Vaz 2011/2012 11

(12)

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

(13)

Service Bus Relay Service

Cátia Vaz 2011/2012 13

(14)

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

(15)

Exemplo: IProblemSolver

Cátia Vaz 2011/2012 15

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;

}

}

(16)

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();

(17)

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>

(18)

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));

}

(19)

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>

(20)

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

(21)

Service Bus Queues

Cátia Vaz 2011/2012 21

(22)

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

(23)

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

(24)

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

(25)

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);

(26)

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);

(27)

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);

(28)

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(); } }

(29)

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();

}

(30)

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)

(31)

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

(32)

Topics/Subscriptions

Cátia Vaz 2011/2012 32

(33)

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

(34)

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);

(35)

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);

(36)

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);

(37)

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(); } }

(38)

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”);

(39)

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

(40)

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");

(41)

Cátia Vaz 2011/2012 41

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);

Referências

Documentos relacionados