通过云端增强教会敬拜
想象一下,将教会的敬拜参与者与实时内容联系起来。
本文的网站 URL 可以在 http://churchworship.azurewebsites.net 找到。
开发者挑战
简介
Windows Azure 是一个非常灵活且强大的平台,可用于创建各种云解决方案。 它提供了易于使用的工具和资源。 灵活(按使用量付费)的成本结构也使其对从博主到企业公司的每个人都很有吸引力。 Windows Azure 也是一个非常可扩展的解决方案,可以从小规模解决方案一直增长到大型、高流量和容错的解决方案。 教会敬拜也类似,因为教会以各种形式或风格(传统、现代、混合)举行礼拜,并且面向各种规模(从几十人到几千人)的会众。 随着当今敬拜参与者拥有的技术以及教会中日益增长的技术应用,有机会利用 Windows Azure 平台来增强敬拜体验。 我甚至见过在教会敬拜中使用各种设备(智能手机、平板电脑等)。 然而,这些设备主要用于通过下载的应用程序和网站引用圣经。 我认为这些设备可以在教会敬拜期间用于更多方面来增强体验。
背景
在教会的礼拜仪式中,会提供相当多的内容。 有要唱的歌曲,有歌词和音乐。 创作现代歌曲的艺术家可能有包含这些歌曲的专辑。 在礼拜仪式中会阅读和引用圣经。 公告会鼓励和吸引敬拜参与者参与教会生活。 而传道人所讲的敬拜信息是基督教教义,可以应用于日常生活。
有些教会使用投影仪和屏幕向敬拜参与者提供部分内容。 传道人可能会讲授或展示教学要点或简短句子来强化信息。 但是,仍然有很多内容可能只是被说出,然后很快被敬拜参与者遗忘。 试图在投影屏幕上显示所有内容会因需要刷新速度过快而难以阅读和理解。 传统的教会可能不希望使用投影仪和屏幕,因为这可能会分散他们的敬拜体验。 较小的教会可能无法负担其礼拜仪式中使用投影仪和屏幕。 敬拜参与者可能会使用可用的纸张随意记笔记或重要的要点以备日后参考。
目前,敬拜参与者在参加礼拜时收到的主要有形沟通形式通常称为“公告”。 公告可能是一页或几页纸,上面载有内容,用于告知敬拜参与者上述事项(崇拜流程、公告、教学要点和笔记等)。 但是,公告的内容受到纸张容量的限制。 您可能会看到敬拜参与者在纸张空白处做笔记,以提醒他们某个活动或事件,或者笔记可能是传道人引用的圣经经文。
想象一下,礼拜仪式中的所有内容都实时推送到敬拜参与者那里。 想象一下,敬拜参与者可以保存这些内容以供将来参考。 这可以真正将敬拜参与者与教会联系起来,让他们更加了解情况。 Windows Azure 及其工具和资源可以提供这种连接。
本文将介绍一种方法的设计和开发,该方法利用 Windows Azure 以及可用的工具和技术,将敬拜参与者及其设备(智能手机、平板电脑等)连接起来。 利用 Microsoft Web 堆栈中 Windows Azure 的各种工具,可以创建一个引人注目的解决方案,任何规模和敬拜风格的教会都可以使用。 现在是时候使用正确的工具,将敬拜参与者提升到一个全新的水平了。
设计
设计的目标是简单。 任何人都可以轻松访问此解决方案。 用户分为两类:敬拜管理员和敬拜参与者。 敬拜管理员将使用该解决方案来协调内容创建和实时交付给敬拜参与者。 敬拜参与者将是内容的消费者。 他们将在设备(智能手机、平板电脑等)上实时接收内容。 该解决方案将是一对一通信(从敬拜管理员到敬拜参与者)。 此外,敬拜参与者将能够使用各种服务保存内容。
Windows Azure 的优势
Windows Azure 将提供一个可扩展的平台,可以随着用户和教会数量的增长而增长。 Windows Azure 提供的工具和技术使您能够为正确的工作使用正确的工具。
创建 Azure 网站
我想做的第一件事是在 Azure 中创建网站容器。 此容器将托管敬拜管理员和敬拜参与者登录以发送和接收内容的网站。 鉴于我以前从未做过这件事,我想创建一个空白网站开始,看看它是如何工作的。
因此,我登录到我的 Azure 帐户,进入门户页面来创建一个新网站,网址为 https://manage.windowsazure.com。 当我选择“网站”时,出现的页面如下:
我选择了创建新网站的按钮,并输入了一个 URL。 URL 必须与其他所有 URL 唯一。 Azure 会告诉你 URL 是否已经被占用。 Azure 创建网站后,您会在列表中看到该网站:
当您访问网站 URL 时,会显示默认页面,说明网站已成功创建。 现在,我可以创建 Visual Studio 网站项目来开始开发了。
创建 Visual Studio 项目
我想做的下一步是创建将存储代码的 Visual Studio 项目。 可以使用多种项目模板。 对于这个网站,我决定使用 MVC 4 Internet Application 模板。 从 Visual Studio 开始页,我选择了“新建项目”:
接下来,我选择了 ASP.NET MVC 4 Web Application:
然后,我选择了 Internet Application:
现在,在 Visual Studio 的解决方案资源管理器中,项目已创建:
发布网站到 Azure
现在,有了 Visual Studio 项目,我就可以直接开始编写代码了。 但是,我决定尝试设置将项目发布到我的 Azure 网站。 事实证明这非常流畅。 我真的很喜欢不需要在配置文件 XML 文件和项目属性中摸索。 Azure 提供了导出发布设置并将其导入 Visual Studio 项目的功能。 右键单击项目节点会显示一个弹出菜单,我在其中选择了“发布”:
出现了“发布 Web”对话框,我注意到有一个链接可以下载发布配置文件。 所以,我决定点击该链接:
然后我被带到了 Azure 网站配置文件页面,该页面显示了一个下载发布配置文件的链接。
文件下载后,我回到“发布 Web”对话框,单击“导入”按钮,选择下载的文件,然后继续成功发布项目。 然后我注意到 Visual Studio 项目的“属性”->“PublishProfiles”文件夹下添加了两个文件:
最后,我将浏览器定向到网站,看到 Visual Studio 项目已成功发布。 接下来,我想在 SQL Azure 上创建数据库。
创建 SQL Azure 数据库
我选择了 MVC 4 Internet Application 项目模板,因为我想使用该模板提供的窗体身份验证。 当你使用此模板创建新项目时,会创建一个 SQL Server 2012 LocalDB 来存储用户配置文件和成员资格数据。 SQL Server 2012 LocalDB 是一种执行模式数据库引擎,当进程尝试进行数据库连接时加载。 LocalDB 是一个出色的本地开发数据库引擎,作为 SQL Server 2012 Express Edition 的替代品。 您可以在以下链接找到有关 SQL Server 2012 LocalDB 的信息:http://msdn.microsoft.com/en-us/library/hh510202.aspx。
因此,我的下一步是创建 Azure 上的数据库容器,并将 Visual Studio 网站项目中的本地数据库发布到云端。 我回到了我的 Azure 门户和 SQL 数据库管理页面:
我点击了“创建 SQL 数据库”链接
然后我填写了表格来指定数据库设置。 指定了数据库名称、版本和数据库大小限制设置:
数据库成功创建后,数据库显示在数据库列表中:
将 SQL 数据库发布到 Azure
在深入研究网站功能的硬核开发之前,我想先确保我能够将 Visual Studio 网站项目中的本地 SQL 数据库部署到 Azure。 在上一个部分,我逐步介绍了创建用于容纳数据库对象的 SQL 数据库容器。 现在,我想用 MVC 4 Internet Application 模板创建的用户配置文件和成员资格数据库填充 SQL 数据库容器。
在 Visual Studio 项目中创建的数据库是存储在 App_Data 目录中的本地数据库。 Visual Studio 不提供任何开箱即用的导出数据库、生成数据库脚本或发布数据库的功能。
查看数据库设置页面,我看到有安装 Microsoft SQL Server Data Tools 和下载 SQL 数据库入门项目的选项。 我曾使用 SQL Server Data Tools (SSDT) 进行本地和服务器的开发和部署。 因此,我决定尝试这些选项。 SSDT 使用 Visual Studio 环境提供易于使用的数据库开发功能,如源代码组织和管理、架构比较和数据库部署。 对于数据库部署,SSDT 提供的功能与 .NET 开发人员部署网站和应用程序的功能非常相似。
我的目标是在本地计算机上进行数据库设计和开发,然后轻松地将数据库部署到 Azure。 我不想手动创建 Transact-SQL 脚本并在 Azure 上运行它们。 我希望使用一个工具来比较数据库架构并自动无缝地发布更改。
因此,我将浏览器导航到 SQL 数据库设置页面:
然后我点击了“安装 Microsoft SQL Server Data Tools”链接并安装了软件。 然后我点击了“下载 SQL 数据库入门项目”链接。 我将压缩文件 (SQLDatabaseProj.zip) 解压到一个文件夹中,并启动了 SQL Server Data Tools (SSDT),打开了下载的入门项目。 SSDT 加载了入门项目。 通过查看解决方案资源管理器,我很快注意到入门项目包含了什么:
我打开了 SQLDatabaseProj.publish.xml 文件,注意到数据库连接设置已经用我 Azure SQL 数据库的值填好了。 数据库项目没有任何数据库对象脚本,正如我所料,因为 Azure 中的数据库是空的。
现在我想将 Visual Studio 网站项目中的数据库与 SSDT 入门数据库项目同步。 然后,我想将 SSDT 数据库项目发布到我的 Azure SQL 数据库。 架构比较能够比较数据库、SSDT 数据库项目和数据库应用程序包(DACPAC 文件)并同步数据库对象。
在 SSDT 中,在 SQL Server 对象资源管理器中,我右键单击 SQLDatabaseProj 的根节点并选择了“架构比较”:
在“架构比较”选项卡中,我点击了“切换源和目标”按钮,该按钮位于两个下拉列表之间(按钮上有两个指向左和右的箭头)。 我点击了“选择源”下拉列表的向下箭头,然后选择了“选择源”:
我选中了“数据库”单选按钮,然后点击了“新建连接”按钮:
在“连接属性”对话框中,我输入了我的 LocalDB 数据库实例的服务器名称 ((LocalDb)\v11.0)。 我选中了“使用 Windows 身份验证”进行服务器登录。 然后,我选中了“选择或输入数据库名称”,并选择了位于 Visual Studio 网站项目 App_Data 目录中的本地数据库名称。 最后,我测试了我的连接,连接成功,然后点击了“确定”按钮:
回到“选择目标架构”对话框,我点击了“确定”。 在“架构比较”选项卡中,Visual Studio 网站项目 LocalDB 数据库是源。 目前,LocalDB 数据库包含了我想要同步到入门数据库项目的数据库表。 入门数据库项目是目标,因为它为空,并且最终将与 Azure SQL 数据库同步。 然后我点击了工具栏中的“比较”按钮,并列出了架构比较结果:
然后我点击了“更新”按钮。 入门数据库项目被修改。 当解决方案资源管理器刷新时,出现了数据库表脚本:
我保存了“架构比较”文件,以便以后数据库架构更改时可以使用。 接下来,我右键单击入门数据库项目中的根节点,然后点击了“发布”:
Azure SQL 数据库设置已经填好,我点击了“发布”按钮。 数据库然后部署到 Azure。 我修改了 Visual Studio 项目中的 app.config 文件,将数据库连接字符串更改为使用 Azure SQL 数据库,然后将网站发布到 Azure。 为了测试,我登录到我的网站(http://churchworship.azurewebsites.net)。 我点击了右上角的“注册”链接。 然后我创建了一个新用户,并使用用户名和密码登录:
总之,使用 SQL Server Data Tools (SSDT) 极大地节省了在 Visual Studio 网站项目和 Azure SQL 数据库之间同步数据库的时间和精力。 现在,我准备进行一些真正的开发了。
利用虚拟机快速搭建
我们现在在 Azure 中拥有了一个网站和一个 SQL 数据库。 一切可能都运行良好。 但是,假设我们开始看到流量大幅增加,我们需要增加 Web 服务器的数量。 也许,我们现在想在多 Web 服务器环境中使用负载均衡器进行测试。 使用虚拟机可以很快实现这一点。
本节将介绍创建多个虚拟机的过程。 将有两个 Web 服务器。 Azure 负载均衡器将用于在 Web 服务器之间分发 Web 流量。 将有一个数据库服务器来维护 SQL Server 中的数据。
现在,我们可以使用 Azure 门户中的向导来创建这些虚拟机。 但是,我们将使用 Windows Azure PowerShell Cmdlets 来创建所有内容。 Windows Azure PowerShell Cmdlets 将使我们能够脚本化虚拟机的创建并设置负载均衡器。 我们可以利用能够通过 PowerShell 脚本中的命令在将来重新创建类似环境的能力。 让我们来享受 PowerShell 脚本的乐趣吧!!!
收集信息
我们的第一步是从我们的帐户和 Azure 环境中收集几条信息,并将它们存储在变量中。 创建一个文件夹来存储我们需要的文件(例如 C:\VM)。 我们需要下载并安装 Windows Azure PowerShell 工具。 转到 http://www.windowsazure.com/en-us/downloads。 在“命令行工具”部分的“Windows 下载”下,单击“Windows Azure PowerShell”链接。 运行下载的文件 (WindowsAzurePowerShell.3f.3f.3fnew.exe) 来安装 Windows Azure PowerShell。 此文件将安装执行 Azure PowerShell 命令所需的库。
接下来,运行 Windows Azure PowerShell 快捷方式,并以管理员身份运行它。 在浏览器中登录到 Azure 门户,然后转到 https://windows.azure.com/download/publishprofile.aspx。 此页面将下载您的帐户的发布配置文件。 当您创建 Azure 服务时,必须设置要使用的发布设置。 Azure 将使用此设置将您的 Azure 服务关联起来以进行计费。 将下载的文件放入我们之前创建的文件夹中(例如 C:\VM)。
我们现在将在 PowerShell 会话中导入我们的发布设置文件。 转到 PowerShell 窗口并输入
PS C:\>Import-AzurePublishSettingsFile 'C:\VM\[Publish Profile filename]-credentials.publishsettings'
为了确保发布配置文件设置已导入,请输入:
PS C:\>Get-AzureSubscription
我们应该会看到我们的订阅名称、ID 和订阅信息。 此外,在您的计算机的用户漫游应用程序数据文件夹(C:\Users\[Username]\AppData\Roaming\Windows Azure Powershell)中将持久化几个文件。 这些文件使我们现在可以使用 Select-AzureSubscription cmdlet 选择我们的订阅,而无需每次都导入发布设置。 如果您有多个订阅,Select-AzureSubscription cmdlet 可以设置要使用的订阅。 现在,让我们创建一个变量,并用我们将要使用的订阅 ID 设置其值:
PS C:\>$subscriptionid = '[Subscription ID]'
接下来,我们要使用 Get-AzureStorageAccount cmdlet 选择一个存储帐户,或使用 New-AzureStorageAccount cmdlet 创建一个新的存储帐户。 让我们创建一个名为 churchworshipvm1 的新存储帐户。 我们需要选择一个位置让存储帐户驻留在 Azure 内。 在 PowerShell 窗口中,输入:
PS C:\>Get-AzureLocation
我们将选择美国东部位置。 让我们用此值设置另一个变量,并为存储帐户名称设置另一个变量。 存储帐户名称必须是 3 到 24 个字符,包含小写字母和至少一个数字。 然后,我们将创建存储帐户。
PS C:\>$location = 'East US'
<span style="font-size: 9pt;">PS C:\>$storageaccount = 'churchworshipvm1'</span>
PS C:\>New-AzureStorageAccount -StorageAccountName $storageaccount -Location $location
您现在可以转到 Azure 门户中的“存储”页面,查看我们刚刚创建的存储帐户条目。
现在,我们将选择存储帐户来在创建虚拟机时使用:
PS C:\>Set-AzureSubscription -SubscriptionName $subscriptionid -CurrentStorageAccount $storageaccount
接下来,我们将创建云服务。 云服务名称必须在所有云服务中是唯一的。 让我们设置一个变量并测试该云服务名称是否已存在
PS C:\>$cloudservice = 'churchworship'
PS C:\>Test-AzureName -Service $cloudservice
如果返回“False”值,则表示云服务不存在。 当我们创建虚拟机时,云服务将被创建。
创建虚拟机
我们可以使用两个 cmdlet 来创建虚拟机。 New-AzureQuickVM 具有最少的参数,可以快速创建虚拟机。 但是,我们要配置多个设置。 因此,我们将使用几个 cmdlet,首先是 New-AzureVMConfig。
我们需要选择一个虚拟机映像来创建 Web 服务器和数据库服务器。 在 PowerShell 窗口中输入以下内容:
PS C:\>Get-AzureVMImage | select ImageName
这将列出可用的各种映像。 “select ImageName”命令仅显示虚拟机映像的名称。 我们只需要使用映像名称设置变量。 我们将创建两个使用 Windows 2012 的 Web 服务器和一个使用 SQL Server 2012 SP1 Standard Edition 的数据库服务器:
PS C:\>$web1image = 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012-x64-iis8-v13.4.12.2'
PS C:\>$web2image = 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012-x64-iis8-v13.4.12.2'
PS C:\>$sqlimage = 'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Standard-CY13SU04-SQL2012-SP1-11.0.3350.0-Win2012'
让我们为服务器计算机名称和管理员密码创建变量:
PS C:\>$web1name = 'churchweb1'
PS C:\>$web2name = 'churchweb2'
PS C:\>$sqlname = 'churchsql'
<span style="font-size: 9pt;">PS C:\>$adminpassword = 'churchadmin1!' </span>
现在,我们将创建配置第一个 Web 服务器的命令。 但是,它还不会创建虚拟机:
PS C:\>$webvm1 = New-AzureVMConfig -Name $web1name -InstanceSize ExtraSmall -ImageName $web1image | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' -LBSetName 'lbchurchworshipweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'
这个长命令创建了一个新的虚拟机,基于一个映像。 该命令将服务器配置为 Windows 服务器,并设置管理员密码。 它还添加了一个端点,公开端口 80,并与负载均衡器一起使用该端口。 让我们配置第二个 Web 服务器和数据库服务器:
PS C:\>$webvm2 = New-AzureVMConfig -Name $web2name -InstanceSize ExtraSmall -ImageName $web2image | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' -LBSetName 'lbchurchworshipweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/'
PS C:\>$sqlvm = New-AzureVMConfig -Name $sqlname -InstanceSize ExtraSmall -ImageName $sqlimage | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 1433 -PublicPort 1433 -Name 'sql'
数据库服务器的区别在于,我们公开端口 1433 用于数据库流量,并且服务器将不属于负载均衡器。
最后,让我们创建服务器。 New-AzureVM cmdlet 将用于在一个命令中创建所有三个服务器。 服务器不会同时创建。 但是,该 cmdlet 只调用一次。 不幸的是,这不会节省创建所有服务器的时间。
PS C:\>New-AzureVM -ServiceName $cloudservice -Location $location -VMs $webvm1,$webvm2,$sqlvm
现在,当您转到“虚拟机”门户页面时,将显示三个服务器。 我们可以将 Web 应用程序部署到每个 Web 服务器,并将数据库部署到数据库服务器。 应用程序现在应该可以像使用 Azure 网站和 SQL Azure 数据库一样运行。
经验教训
学习 Windows Azure PowerShell Cmdlets 很有趣。 有 cmdlet 可以创建我们需要的任何虚拟机。 还有自定义配置选项,可以精确地按照我们的意愿设置虚拟机,公开特定的端口,使用负载均衡器,添加数据磁盘以及其他各种选项。
我们可以创建一个 PowerShell 脚本文件(扩展名为 .ps1),其中包含我们刚刚使用的命令。 下次我们需要创建类似的环境时,我们可以修改必要的变量并执行脚本。 以下是脚本将包含的行:
$subscriptionid = '[Subscription ID]' $location = 'East US' $storageaccount = 'churchworshipvm1' New-AzureStorageAccount -StorageAccountName $storageaccount -Location $location Set-AzureSubscription -SubscriptionName $subscriptionid -CurrentStorageAccount $storageaccount $cloudservice = 'churchworship' $web1image = 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012-x64-iis8-v13.4.12.2' $web2image = 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012-x64-iis8-v13.4.12.2' $sqlimage = 'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Standard-CY13SU04-SQL2012-SP1-11.0.3350.0-Win2012' $web1name = 'churchweb1' $web2name = 'churchweb2' $sqlname = 'churchsql' $adminpassword = 'churchadmin1!' $webvm1 = New-AzureVMConfig -Name $web1name -InstanceSize ExtraSmall -ImageName $web1image | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' -LBSetName 'lbchurchworshipweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/' $webvm2 = New-AzureVMConfig -Name $web2name -InstanceSize ExtraSmall -ImageName $web2image | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 80 -PublicPort 80 -Name 'web' -LBSetName 'lbchurchworshipweb' -ProbePort 80 -ProbeProtocol http -ProbePath '/' $sqlvm = New-AzureVMConfig -Name $sqlname -InstanceSize ExtraSmall -ImageName $sqlimage | Add-AzureProvisioningConfig -Windows -Password $adminpassword | Add-AzureEndpoint -Protocol tcp -LocalPort 1433 -PublicPort 1433 -Name 'sql' New-AzureVM -ServiceName $cloudservice -Location $location -VMs $webvm1,$webvm2,$sqlvm
历史
- 2013/5/2 - 初始文章创建和提交。 第一个挑战可以在本文的“Windows Azure 优势”部分找到。
- 2013/5/26 - 添加了“创建 SQL Azure 数据库”和“将 SQL 数据库发布到 Azure”部分,用于第三个挑战。
- 2013/6/9 - 添加了“利用虚拟机快速搭建”部分,用于第四个挑战。