Windows Azure AppFabric – połączenia bezpośrednie

Udostępnij na: Facebook

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.