本文章是由機器翻譯。

Azure 網站

混合式連線:將 Azure 網站連接至使用 PortBridge 的 LOB 應用程式

Tejaswi Redkar

下載代碼示例

與普遍的信仰,不一切到雲,至少不還。正如所有的汽車都還不混合大多數家電仍未和能源效率,大量的軟體將仍在運行房地上幾年來。深投資是很難放棄,和大多數公司需要重大的業務理由為現代化一個現有的應用程式。你在你的房子有太陽能電池板嗎?儘管長期的能源節省和稅收優惠,人們不願在他們投資因為前期投入的成本。它不是有什麼不同組織遷移到雲的時候。

然而,幸運的是,混合連接允許您使您的應用程式現代化通過強大的雲,同時仍然插入現有的軟體服務,在您的資料中心中運行房地上挖掘。在這篇文章,看看你如何建立一個 Web 網站,利用 Azure 服務匯流排用於連接到非 Azure 資料中心中運行的軟體服務。而不是直接使用服務匯流排 API,我將使用一個稱為 PortBridge 的最受歡迎的實用程式來連接 Azure Web 網站與房地上服務。

在 Azure 中混合連接

Azure 包括大量的服務,用於構建混合應用程式。用於混合連接的兩個最常用的是 Azure 虛擬網路和 Azure 服務匯流排。蔚藍色的虛擬網路允許您將您的處所上網路擴展到 Azure,從而雕刻出 Azure 和資料中心之間的私人混合網路。Azure 和您的資料中心之間擴展發生在網路層,而不是在服務匯流排的應用層。因為這篇文章是關於應用程式使用服務匯流排的連接,在這裡我不會覆蓋 Azure 虛擬網路。更多的資訊,請訪問 bit.ly/QAODgX

服務匯流排中繼服務可讓您連接駐留在防火牆後面的兩個應用程式。應用程式可以居住在 Azure 和/或您的資料中心。服務匯流排繼電器使你能夠進中 Azure 資料中心的服務匯流排註冊表註冊您的應用程式的 Windows 通信基礎 (WCF) 終結點。方法調用可以在用戶端和服務匯流排基礎設施內的伺服器之間安全地交換,然後可以再傳達給各自的應用程式在您的資料中心中運行。這是理想的例如,對於一個場景,在其中一家公用事業公司需要訪問暖通空調或功率計來收集資料和從中央伺服器運行在 Azure 將重要事件發送到這些設備。圖 1 說明了此示例中,公用事業公司有頭端在 Azure 和建築物中的設備中運行。


圖 1 服務匯流排繼電器場景在一家公用事業公司

控制閘道是一個設備在建築物中運行,它負責控制電的裝置。每個控制閘道有一個全域唯一識別碼服務匯流排註冊處註冊一個 WCF 終結點。每當頭端的服務,運行中 Azure 計算服務之一,想要傳達的特定控制閘道,它將在服務匯流排中打開一個連接到全域唯一的終結點,並開始發送或檢索消息或從控制閘道。通常情況下,控制閘道所在大樓的防火牆後面。但如果你有非 WCF 服務 (如SQL Server資料庫) 運行的上-處所的您想要連接從 Azure 網站嗎?

介紹 PortBridge

PortBridge 是一個實用程式,建立在服務匯流排 API,它允許您的溝通運行房地上任何基於 TCP 的服務終結點之間和在 Azure 上。PortBridge 與原型的核心概念由Clemens Vasters(bit.ly/SI93GM)。我為這篇文章有點修改它,它最近的版本編譯的服務匯流排 SDK。當你為構建應用程式的服務匯流排繼電器時,你不得不建立一個 WCF 介面為你想要在雲計算中暴露的所有有關終結點。當你有大量的終結點或通用平臺的終結點,如資料庫和搜尋引擎的時候,這可以帶來不便和繁瑣。添加另一個 WCF 抽象在這些服務上沒有任何意義。相反,您可以使用 PortBridge 來公開非 WCF TCP 的服務匯流排繼電器連接的終結點。前端應用程式像是 Azure 網站然後可以連接到任何居住在您的資料中心防火牆後面的 TCP 資料來源的利用。從概念上講,PortBridge 創建一個泛型的 WCF 介面中所示圖 2

圖 2 通用 PortBridge Windows 通信基礎介面

namespace Microsoft.Samples.ServiceBus.Connections
{
  using System;
  using System.ServiceModel;
  [ServiceContract(Namespace="n:",
    Name="idx", CallbackContract=typeof(IDataExchange),
    SessionMode=SessionMode.Required)]
  public interface IDataExchange
  {
    [OperationContract(Action="c", 
      IsOneWay = true, IsInitiating=true)]
    void Connect(string i);
    [OperationContract(Action = "w", IsOneWay = true)]
    void Write(TransferBuffer d);
    [OperationContract(Action = "d", 
      IsOneWay = true, IsTerminating = true)]
    void Disconnect();
  }
  public interface IDataExchangeChannel : 
    IDataExchange, IClientChannel { }
}

與只是三個泛型方法,PortBridge 作為之間的用戶端和伺服器的終結點的代理,在服務匯流排中繼轉發到指定的伺服器的所有 TCP 調用。使用 PortBridge 的最大好處是你不必建立一個 WCF 介面為您想要啟用混合連接每個處所上端點。

PortBridge 是由兩個部分組成:

  1. 運行代理程式更緊密到用戶端應用程式,或在虛擬機器 (VM) 中 Azure 基礎設施即服務 (IaaS)。
  2. Windows 服務 (或一個主控台應用程式),運行在處所和作為在相同的環境中運行的服務終結點的代理行為。

PortBridge 的一些常見的使用情形是:

  • 連接到任何基於 TCP 的資料存儲對房地
  • 連接到無法遷移到 Azure 的協力廠商 Web 服務
  • 遠端桌面連線

在本文中,您將學習如何部署和配置 PortBridge,使 Azure 網站與在本地電腦上運行的SQL Server資料庫之間的通信。

一個混合解決方案

蔚藍的 Web 網站通常形式的 Web 前端或 Web 服務的應用層。但在許多情況下,不能遷移的資料來源的一些那種力量的 Web 網站到 Azure。在這種情況下,PortBridge 是一個理想的解決方案,用於連接到資料庫運行在處所 Azure 的 Web 網站。蔚藍的 Web 網站通信與 PortBridge 代理,反過來與 PortBridge 服務,通過服務匯流排進行通信。PortBridge 服務然後轉發到目標資料庫調用。圖 3 說明我在這篇文章將構建和顯示 PortBridge (或服務匯流排繼電器) 的環境中的典型的消息交換的混合 Web 網站的體系結構:


圖 3 PortBridge 示例體系結構

  1. 對處所 PortBridge 主控台應用程式 (或 Windows 服務) 內唯一的 URI 與服務匯流排命名註冊表註冊資料庫的 TCP 端點 (1433SQL Server伺服器)。服務匯流排繼電器與主控台應用程式打開出站的雙向連接。
  2. 當一個 HTTP 或 HTTPS 請求時到 Azure 的 Web 網站時,打開該網站的資料庫連接和往常一樣,但與 PortBridge 代理虛擬機器的 IP 位址相反。
  3. PortBridge 代理 VM 充當資料庫代理在雲計算中,具有兩個通信介面 — — 用於接收 TCP 請求和用於連接到 PortBridge 主控台服務匯流排繼電器終結點。
  4. PortBridge 代理將資料庫請求路由到服務匯流排中繼服務。美麗是解決方案的為 Azure 網站,這是解決方案的生意和往常一樣。到資料庫的 API 並沒有改變,唯一的 IP 位址。
  5. 服務匯流排中繼路由到您的本地主機 (或資料中心) 上運行的 PortBridge 應用程式調用。
  6. 最後,調用到達資料庫中,並使用相同的連接檢索資料。

請注意有一些元件參與溝通 PortBridge,和你需要額外的虛擬機器可能不需要如果直接使用服務匯流排。正如我剛才所說,這裡的優勢是揭露任何 TCP 端點的概括 — — 您可以重複使用相同的 PortBridge 代理 VM 運行在不同地點的多個資料來源連接。現在,我已經展示你的解決方案體系結構,我將開始構建它。

創建一個 rest 風格的 Web 服務

為了保持簡單的這篇文章,我會設計一個 rest 風格ASP.NETWeb API 服務稱為國家,從SQL Server的資料庫表中檢索所有國家的清單。在發展過程中,總是建議構建和部署到雲計算之前進行本地測試。圖 4 顯示國家 Web 服務的代碼。

圖 4 國 Web 服務

public class CountriesController : ApiController
{
  private string DatabaseConnectionString { get; set; }
  public CountriesController()
  {
    try
    {
      DatabaseConnectionString =
        ConfigurationManager.
ConnectionStrings["DatabaseConnectionString"].
ConnectionString;
      }catch(Exception ex)
      {
        Trace.TraceError(ex.Message);
      }
  }
  // GET: api/Countries
  public IEnumerable<Country> Get()
  {
    return CountryService.GetCountries(DatabaseConnectionString);
  }
  // GET: api/Countries/AD
  public Country Get(string id)
  {
    return CountryService.GetCountry(DatabaseConnectionString, id);
  }
}

Web 服務有只有兩個方法 — — 變,變 (字串 id)。Get 方法從資料庫表中檢索所有的國家和 Get(id) 方法檢索國家物件的國家代碼。圖 5 說明了當地的SQL Server資料庫中的國家資料庫表。


圖 5 國家資料庫表

圖 6 顯示的 CountryService 類的從資料庫中檢索資料,並返回物件的國家。

資料庫和 Web 服務準備就緒後,您可以快速測試本地通過按 F5 來運行它從Visual Studio的 Web 服務。如果一切順利,你有一個 Web 服務,本地的工作。現在你想要將它移動到雲,但是你不能將資料庫移轉到雲因為它共用與其他應用程式仍在運行的處所。PortBridge 非常適合在此場景中,很少或沒有的代碼更改為您的 Web 服務。

圖 6 CountryService 類

public class CountryService
{
  public static IEnumerable<Country> GetCountries(string connectionString)
  {
    IList<Country> countries = new List<Country>();
    using (IDataReader reader = 
      SqlHelper.ExecuteReader(connectionString,
      System.Data.CommandType.Text, "SELECT CountryId, CountryName,
      CountryCode FROM Country"))
    {
      while(reader.Read())
      {
        Country c = new Country()
        {
          CountryId = Convert.ToInt32(reader["CountryId"]),
          CountryCode = Convert.ToString(reader["CountryCode"]),
          CountryName = Convert.ToString(reader["CountryName"]),
        };
        countries.Add(c);
      }
    }
    return countries;
  }
  public static Country GetCountry(string connectionString, 
    string countryCode)
  {
    Country c = new Country();
    using (IDataReader reader = 
      SqlHelper.ExecuteReader(connectionString,
      System.Data.CommandType.Text,
      "SELECT CountryId, CountryName, CountryCode FROM Country WHERE
      CountryCode=@countryCode",
      new SqlParameter("@countryCode", countryCode)))
    {
      if (reader.Read())
      {
        c.CountryId = Convert.ToInt32(reader["CountryId"]);
        c.CountryCode = Convert.ToString(reader["CountryCode"]);
        c.CountryName = Convert.ToString(reader["CountryName"]);
      }
    }
    return c;
  }
}
  [DataContract]
    public class Country
    {
      [DataMember]
      public int CountryId { get; set; }
      [DataMember]
      public string CountryName { get; set; }
      [DataMember]
      public string CountryCode { get; set; }
}

設置 PortBridge

在到雲計算的 Web 服務之前,您需要配置和測試 PortBridge。因為在體系結構中有多個層,它是重要的是在開始時得到的所有元件的配置正確。我通常創建一個列出為每個元件的輸入和輸出端點的表格 (見圖 7)。

圖 7 端點和位置

解決方案元件 輸入終結點 輸出端點 輸出端點
國家的 Web 服務 80   蔚藍的 Web 網站
PortBridge 代理 1433 1433 蔚藍色的虛擬機器
PortBridge 1433 1433 蔚藍色的虛擬機器
SQL Server 文件 1433   蔚藍色的虛擬機器

此表在這種情況下,可能看起來微不足道,但對於與數以百計的終結點的應用程式,像這樣的表將説明您正確地佈建服務。正如前面討論的 PortBridge 代理駐留在虛擬機器中,有兩個端點介面 — — 中的輸入輸出與應用到服務匯流排繼電器終結點。同樣,在您的本地電腦上運行的 PortBridge 服務有兩個端點 — — 輸入從服務匯流排繼電器和輸出到SQL Server資料庫。一旦你有記下來的配置參數,你可以開始部署過程。

創建服務匯流排 Namespace

因為這種解決方案的通信骨幹是服務匯流排繼電器,我不得不首先從 Azure 門戶創建一個服務匯流排命名空間 (manage.windowsazure.com) 所示,在 圖 8


圖 8 創建服務匯流排 Namespace

中的國家命名空間圖 8 是全球唯一和將用於創建一個全域唯一的服務端點。一旦您已經創建的命名空間,點擊連接資訊按鈕底部的頁後,可以看到該命名空間的訪問資訊­暢通。您將需要預設發行人和預設金鑰來訪問命名空間中,所示圖 9,所以請記下這些。


圖 9 服務匯流排 Namespace 憑據

PortBridge 代理和 PortBridge 應用程式都需要這些憑據用於連接到命名空間。

配置 PortBridge 應用程式

PortBridge 應用程式具有一個自訂配置節:

<portBridge serviceBusNamespace="countries" 
  serviceBusIssuerName="owner"
  serviceBusIssuerSecret="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX">
  <hostMappings>
   <!-- Open HTTP, SQL Server, RDP and ElasticSearch ports-->
     <add targetHost="TREDKAR-W530" allowedPorts="1433" />
  </hostMappings>
</portBridge>

連接到前面創建的服務匯流排繼電器命名空間需命名空間、 頒發者名稱和的秘密。主機映射部分列出的目標服務主機。在我的示例中,它是在本機和 1433年埠。您可以為外部化同一主機上的多個終結點添加逗號分隔的埠。您還可以添加多個目標主機,只要他們是從 PortBridge 應用機可到達。一旦配置完成,啟動 PortBridge 應用程式在您的本地機器上。如果一切如預期的那樣,您應該看到類似于中的一個螢幕圖 10


圖 10 PortBridge 運行應用程式時

PortBridge 應用程式創建的國家命名空間上的出站連接的服務匯流排中繼服務和創建一個唯一的名稱與格式 PortBridge / [目標主機],[目標主機] 在哪裡 PortBridge 應用程式的設定檔中的 targetHost 參數中所示圖 11


圖 11 服務匯流排中繼連接

PortBridge 部分名稱是硬編碼,而目標主機更改主機數目而定,您已經創建。它是重要的是注意到要保持獨特的名稱的命名空間內,每個目標主機會有只有一個條目在設定檔的 hostMappings 節。此外請注意如果你不正確地配置 targetHost 參數,創建的端點將不匹配你要代表的服務和通信將會失敗。

在服務匯流排中繼綁定所需的出站埠上的資訊,請訪問 bit.ly/1l8lncx

配置 PortBridge 代理

PortBridge 應用程式一樣,PortBridge 代理也有一個自訂配置節:

<portBridgeAgent serviceBusNamespace="countries" 
  serviceBusIssuerName="owner"
  serviceBusIssuerSecret=" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ">
<portMappings>
<port localTcpPort="1433" targetHost="TREDKAR-W530" 
      remoteTcpPort="1433">
<firewallRules>
  <rule source="127.0.0.1"/>
  <rule sourceRangeBegin="208.0.0.0" 
        sourceRangeEnd="208.255.255.255"/>
...
</firewallRules>
</port>
</portMappings>

PortBridge 代理到服務匯流排繼電器端點埠 (remoteTcpPort) 有在哪裡您映射每個輸入的端點埠 (localTcpPort) 一個埠映射部分。目標主機值必須與您早些時候在 PortBridge 應用程式佈建中創建的目標主機值相匹配。此值用於連接到相應的服務匯流排命名空間端點。如果這兩個值不匹配,應用程式將不會工作。

在防火牆規則部分,您可以顯式地列出 PortBridge 代理將接受請求的機器的 IP 的位址。因為我 PortBridge 代理將接受請求從 Azure 網站,我需要將 Azure 資料中心的 ip 位址範圍添加到防火牆規則。您可以下載的 Azure 資料中心 ip 位址範圍從 bit.ly/1l8yDxV

要部署 PortBridge 代理在 Azure 中,導航到 Azure 門戶、 創建新的 Windows 虛擬機器、 PortBridge 代理檔案複製和運行 PortBridgeAgent.exe。當您創建虛擬機器,請確保你打開外部訪問的 1433年終結點,所以 Azure Web 網站可以訪問 PortBridge 代理 VM 上的該埠。

部署 PortBridge 代理的另一個選擇是通過 azure,簡單的方法來部署 Windows 商店應用程式的應用程式。Azure 應用程式是一個免費的軟體,與預先包裝 Vm 現成的部署,和它有一個預先包裝好的 PortBridge 虛擬機器,如中所示圖 12。你可以安裝應用程式從 azure appsforazure.com


圖 12 azure 為部署 PortBridge 代理的應用程式

預先包裝的 PortBridge 代理 VM 在預設情況下打開 1433年和 80 端點埠進行通信。如果你想自訂配置 PortBridge 代理,您需要修改的 C:\ddapplications 資料夾中的 PortBridgeAgent.exe.config 檔。在設定檔之後, 你就會有重新開機動態­DeployInitService Windows 服務。

測試和部署國家 Web 服務

一旦 PortBridge 元件都已安裝並且正在運行,您需要修改該 Web 服務的資料庫連接字串以指向 PortBridge 代理虛擬機器:

<add name="DatabaseConnectionString"
  connectionString=
  "Server=tejaswisvm1.cloudapp.
net;
  Database=cf10292013;
  Trusted_Connection=True;"/>

請注意主機名稱字,所有其他參數保持不變。 與此配置更改,您就會直接指向到 PortBridge 代理虛擬機器而不是資料庫。 下一步,發佈國家 Web API 服務到 Azure Web 網站並測試它通過導航到以下 Uri:

  1. HTTP://[Azure Web 網站的主機] / api/國家,用於檢索所有的國家。
  2. HTTP://[Azure Web 網站的主機] / api 國家 / [國家代碼],為檢索一個特定國家的國家代碼。

如果端到端通信正常工作,這兩個 Uri 將返回 JSON 物件的方法調用。 您現在可以從任何設備調用國家 Web 服務和調用將遍歷從 Azure 網站到 PortBridge 代理,到達SQL Server資料庫通過 PortBridge 應用程式。 將從您的本地電腦 (或資料中心) 上運行的資料庫中檢索資料。

效能考量

因為 PortBridge 是一個間接層,它會導致延遲時相比,涉及直接資料庫通信或混合的虛擬網路連接的體系結構。 PortBridge 建議只在虛擬網路和直接的通信並不可行的方案。 在寫這篇文章的時候,Azure 的 Web 網站不支援虛擬網路和,因此,服務匯流排是建築混合連接的唯一選擇。 我在測試期間,我看到延遲 50ms年至 300ms 為國家 Web 服務。 對於某些情況下,我建議緩存中雲計算的資料,只有定期伸出到遠端資料中心中運行的服務。

安全性考量

PortBridge 依賴于服務匯流排中繼的安全功能。 預設情況下,PortBridge 使用連接安全要連接到的服務匯流排命名空間,但它不會利用運輸或消息加密功能。 PortBridge 代理提供一個自訂的 IP 位址過濾機制,但這不應作為內置的安全機制的 Azure 服務匯流排一樣健壯。 我建議執行詳細的執行緒建模在部署的解決方案在生產之前。

外擴 PortBridge

從建築的圖 3,它看起來像 PortBridge 代理是一個單點故障。 但是,您可以擴展 PortBridge Agent 通過向虛擬機器添加一個負載平衡的端點並創建 PortBridge 代理虛擬機器的多個實例。 來電、 來從 Azure 網站將是負載平衡的多個 PortBridge 代理。 即使你可以放大 PortBridge 代理,應設計最終目的地端點 (資料庫) 來處理這個規模了。 你不想要擴展 Web 和中介層,但在資料層上失敗。 你的設計應該是所有的方式通過彈性。

在現實世界中的 PortBridge

在過去的幾年,基於幾個客戶的要求,我們的團隊建造在雲彩中 Azure 服務與集成協力廠商應用程式的消息傳遞集線器。 目標是容易插即用-為創建模型從不同的資料來源中收集資料,然後在最終使用者在大小不同的設備表面的聚合的資料。 團隊決定使用 PortBridge 作為骨幹的創建此插即用-模型,因為它提供了必不可少的抽象中 Azure 運行應用程式和連接的非 WCF 服務。 我們修改為更好地診斷、 性能和緩存的 PortBridge 代碼。 一些我們成功實施的方案是:

  1. 創建集成 19 不同資料來源的財富 50 公司統一的郵件服務,為客戶的外地員工提供在職的上下文資料混搭。 對必要資訊的快速訪問­在該欄位中的資訊是此解決方案的主要目標。
  2. 從數以千計的應用程式實例用於商用車庫存管理和將資料存儲在雲計算中的中央資料存儲庫中檢索資料。 捕獲的資料用於預測性維護和學習的買方行為。 如果沒有服務匯流排 (和 PortBridge),這樣的應用程式會花 10 倍的成本和精力。
  3. 向數以千計的律師在任何地方其行動裝置上提供案件資訊和時程表管理。 之前此應用程式中,律師們不得不旅行回到辦公室後每個法院個案,登錄他們的時間。 與手機的應用程式,他們可以直接從法院大樓登錄他們的條目。

總結

蔚藍的 Web 網站和服務匯流排相互補充的混合 Web 應用程式的構建。 PortBridge 為方便地暴露在雲計算中的非 WCF 終結點是只服務匯流排繼電器的抽象層。 我已處理了幾個場景,需要構建 mashup 聚合在哪裡從運行于不同地點的多個 Web 服務檢索資料的 Web 網站。 通過使用 PortBridge,這些應用程式可以設計、 測試和構建無顯著變化的原始的應用程式代碼。 一旦初始的 PortBridge 配置進行了測試,連通性始終如一地工作,只要服務匯流排和 Web 服務可用。 即使 PortBridge 允許您快速構建混合應用程式,請記住它,並引入延遲你的服務電話。 如果您的應用程式對回應時間敏感,PortBridge 可能不是正確的選擇,您應該評估 Azure 的虛擬網路或遷移到雲上樓宇服務。 走了以後通過這篇文章中概述的解決方案,你應該舒適到 Azure 的外部化任何處所上的終結點,然後再調用它從 Azure 網站。 PortBridge 和伴隨國家 Web 服務的原始程式碼是在 GitHub 上可用 github.com/dynamicdeploy/portbridge

Tejaswi Redkar 是一個作者和軟體發展商。他目前作為應用程式的平臺戰略和社區主任為微軟工作。他的書,"Windows Azure 的 Web 網站:建設速度快的 Web 應用程式"(動態部署 LLC,2013年),是最全面和最暢銷的主題。Redkar 也是創造者 appsforazure.comdynamicdeploy.com,在那裡他經驗雲中的第一手運行生產應用。你可以給他在伸出 tejaswi_redkar@hotmail.com 和跟著他在 Twitter 上 twitter.com/tejaswiredkar

感謝以下技術專家對本文的審閱:微軟 Azure 產品管理團隊