Azure 网站

混合连接:使用 PortBridge 将 Azure 网站连接到 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 和建筑物中的设备中运行。

Service Bus Relay Scenario at a Utility Company
图 1 服务总线继电器场景在一家公用事业公司

控制网关是一个设备在建筑物中运行,它负责控制电的装置。 每个控制网关有一个全局唯一标识符服务总线注册处注册一个 WCF 终结点。 每当头端的服务,运行中 Azure 计算服务之一,想要传达的特定控制网关,它将在服务总线中打开一个连接到全局唯一的终结点,并开始发送或检索消息或从控制网关。 通常情况下,控制网关所在大楼的防火墙后面。 但如果你有一个非 WCF 服务 (如 SQL Server 数据库) 运行的上-处所的您想要连接从 Azure 网站吗?

介绍 PortBridge

PortBridge 是一个实用程序,建立在服务总线 API,它允许您的沟通运行房地上任何基于 TCP 的服务终结点之间和在 Azure 上。 PortBridge 与原型的核心概念由克莱门斯 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 的 Web 站点和在您的本地计算机上运行的 SQL Server 数据库之间的通信。

一个混合解决方案

蔚蓝的 Web 站点通常形式的 Web 前端或 Web 服务的应用层。 但在许多情况下,不能迁移的数据源的一些那种力量的 Web 站点到 Azure。 在这种情况下,PortBridge 是一个理想的解决方案,用于连接到数据库运行在处所 Azure 的 Web 站点。 蔚蓝的 Web 站点通信与 PortBridge 代理,反过来与 PortBridge 服务,通过服务总线进行通信。 PortBridge 服务然后转发到目标数据库调用。 图 3 说明我在这篇文章将构建和显示 PortBridge (或服务总线继电器) 的环境中的典型的消息交换的混合 Web 站点的体系结构:

PortBridge Sample Architecture
图 3 PortBridge 示例体系结构

  1. 对处所 PortBridge 控制台应用程序 (或 Windows 服务) 内唯一的 URI 与服务总线命名注册表注册数据库的 TCP 端点 (1433 SQL 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.NET Web 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 数据库中的国家数据库表。

Countries Database Table
图 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

Creating the Service Bus Namespace
图 8 创建服务总线 Namespace

中的国家命名空间图 8 是全球唯一和将用于创建一个全局唯一的服务端点。 一旦您已经创建的命名空间,点击连接信息按钮底部的页后,可以看到该命名空间的访问信息­畅通。 您将需要默认发行人和默认密钥来访问命名空间中,所示图 9,所以请记下这些。

Service Bus Namespace Credentials
图 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

PortBridge Application Running
图 10 PortBridge 运行应用程序时

PortBridge 应用程序创建的国家命名空间上的出站连接的服务总线中继服务和创建一个唯一的名称与格式 PortBridge / [目标主机],[目标主机] 在哪里 PortBridge 应用程序的配置文件中的 targetHost 参数中所示图 11

Service Bus Relay Connection
图 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

Apps for Azure for Deploying the PortBridge Agent
图 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 代理及到达通过 PortBridge 应用程序的 SQL Server 数据库。 将从您的本地计算机 (或数据中心) 上运行的数据库中检索数据。

性能注意事项

因为 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 产品管理团队