Windows Azure AppFabric – połączenia bezpośrednie
Pobierz i uruchom |
Autor: Piotr Zieliński
Opublikowano: 2011-03-28
Wprowadzenie
Service Bus umożliwia wyeksponowanie usługi, która znajduje się za firewallem lub NAT. Domyślny tryb Relay polega na przekazywaniu danych klientowi przez publicznie dostępny Service Bus:
Klient, zamiast bezpośrednio łączyć się z usługą WCF, łączy się przez Service Bus – taka architektura powinna być już znana.
Windows Azure AppFabric umożliwia jednak połączenia hybrydowe, w których najpierw nawiązywane jest standardowe połączenie przez Service Bus, a następnie, jeśli tylko to możliwe, połączenie bezpośrednie między klientem a WCF.
Dzięki więc Service Bus mamy do dyspozycji katalog usług, mechanizm wymiany komunikatów kontrolnych oraz zabezpieczenie komunikacji dzięki integracji z ACS, ale same pakiety z danymi fizycznie nie opuszczają sieci lokalnej.
Połączenia bezpośrednie są z reguły szybsze i dlatego warto rozważyć w swoich rozwiązaniach tryb hybrydowy.
Konfiguracja trybu hybrydowego
Azure AppFabric wyręcza programistów z implementacji połączeń hybrydowych i stworzenie usługi sprowadza się wyłącznie do zmiany konfiguracji w stosunku do WCF opartej na trybie Relay. W artykule przyjęto, że dysponujemy już klientem oraz usługą WCF skonfigurowaną w trybie Relay (patrz poprzednie artykuły z cyklu AppFabric). Będziemy skupiać się więc wyłącznie na zmianach w stosunku do trybu Relay.
Zmiany po stronie klienta:
1. Otwieramy plik konfiguracyjny app.config. Musimy nadpisać domyślną konfigurację wiązania, dodając następujący kod:
<system.serviceModel>
<bindings>
<netTcpRelayBinding>
<binding name="hybrid" connectionMode="Hybrid">
<security mode="None" />
</binding>
</netTcpRelayBinding>
</bindings>
...
</system.serviceModel>
Domyślna konfiguracja netTcpRelayBinding działa w trybie Relay, dlatego musieliśmy ustawić connectionMode na Hybrid.
1. W tej samej sekcji (system.serviceModel) ustawiamy bindingConfiguration:
<system.serviceModel>
...
<client>
<endpoint name="RelayEndpoint"
contract="EchoProject.IEchoService"
bindingConfiguration="hybrid"
binding="netTcpRelayBinding"/>
</client>
</system.serviceModel>
Cały plik konfiguracyjny powinien zatem wyglądać następująco:
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<system.serviceModel>
<bindings>
<netTcpRelayBinding>
<binding name="hybrid" connectionMode="Hybrid">
<security mode="None" />
</binding>
</netTcpRelayBinding>
</bindings>
<client>
<endpoint name="RelayEndpoint"
contract="EchoProject.IEchoService"
bindingConfiguration="hybrid"
binding="netTcpRelayBinding"/>
</client>
</system.serviceModel>
</configuration>
3. Do celów testowych podpinamy zdarzenie wywoływane po zmianie stanu połączenia (umożliwi to późniejszą weryfikację połączenia bezpośredniego):
IHybridConnectionStatus hybridConnectionStatus =
((System.ServiceModel.Channels.IChannel)channel).GetProperty<IHybridConnectionStatus>();
if (hybridConnectionStatus != null)
{
hybridConnectionStatus.ConnectionStateChanged += (o, e) =>
{
Console.WriteLine("Zmiana stanu połączenia: {0}.", e.ConnectionState);
};
}
Kod najlepiej wstawić po otworzeniu kanału (channel.Open()).
Zmiany po stronie usługi (serwera):
Podobnie jak w przypadku klienta, nadpisujemy konfigurację wiązania:
<system.serviceModel>
<bindings>
<netTcpRelayBinding>
<binding name="hybrid" connectionMode="Hybrid">
<security mode="None" />
</binding>
</netTcpRelayBinding>
</bindings>
<services>
<service name="EchoProject.EchoService">
<endpoint bindingConfiguration="hybrid" address="" binding="netTcpRelayBinding" contract="EchoProject.IEchoService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Po uruchomieniu aplikacji hostującej i klienckiej przekonamy się, że stan zostanie zmieniony na tryb bezpośredni:
Początkowo włącza się tryb Relay – wysyłamy komunikat do usługi, aby sprawdzić, czy faktycznie działa. Następnie nawiązywane jest już bezpośrednie połączenie i ponownie wysyłamy komunikat do usługi. W artykule wykorzystano WCF, który zwraca po prostu wartość przekazaną w parametrze wejściowym (echo).
Zakończenie
Wykorzystanie połączeń hybrydowych jest bardzo łatwe w przypadku AppFabric i sprowadza się do zmiany jednego tylko atrybutu w pliku konfiguracyjnym. Jeśli w naszej architekturze istnieje możliwość nawiązania połączenia bezpośredniego, należy rozważyć wprowadzenie trybu hybrydowego, ponieważ jest po prostu szybszy.