调用旧版代码

您希望将应用迁移到 App Engine,但面临着一个问题:服务器端代码与特定操作系统绑定,无法轻松移植。也许您正在使用用 C++ 或 Visual Basic 编写的陈旧 COM 对象;或者更糟糕的是,您的源代码已不存在,只剩下可执行二进制文件。

本教程介绍使用 App Engine、Compute Engine 和 Cloud Pub/Sub 调用旧版代码的架构模式,并提供了该模式的示例实现。虽然示例实现重点介绍特定于 Windows 的代码,但您可以将此处介绍的模式重用于任何旧版代码。

目标

  • 了解在 Google Cloud Platform (GCP) 上调用旧版代码的简单架构模式。
  • 下载并部署架构模式的示例实现。

用于调用旧版代码的架构模式

下图演示了可用于从 App Engine 应用调用旧版代码的架构模式。

用于调用旧版代码的架构模式
图 1:用于调用旧版代码的架构模式

该架构的工作原理如下:

  1. 网络客户端向 App Engine 应用发送请求,该应用将请求写入 Cloud Pub/Sub 主题。

  2. 代码封装容器从主题中提取请求。

  3. 代码封装容器调用旧版代码。

  4. 旧版代码将结果返回给封装容器。封装容器随后将结果返回给 App Engine 应用,该应用将此结果返回给网络客户端。

模式的示例实现

您可以在 GitHub 上找到上述模式的实现。此示例应用将字符串作为输入,使用模式中概述的组件处理字符串,并返回全部大写的版本。应用代码包含两个主要组成部分:

  • App Engine 应用,它将传入的请求发布到 Cloud Pub/Sub 主题。
  • 代码封装容器,它订阅 Cloud Pub/Sub 主题,并在收到请求时将请求发送到某些基于 Windows 的旧版代码。

在此实现中,封装容器是用 C# 编写的 Windows 服务。此封装容器服务配置为在实例启动时运行,可以调用可从 C# 调用的任何脚本或二进制文件。封装容器服务和调用的二进制文件都驻留在运行 Windows Server 2012 R2 的 Compute Engine 实例上。

该应用的界面类似于:

Shout 应用界面
图 2:Shout 应用界面

如果键入单词“mars”并点击提交,其结果如下:

Shout 应用结果
图 3:Shout 应用结果

本教程使用 Google Cloud Platform 的以下收费组件:

  • 具有 Windows Server 2012 许可证的 Compute Engine 实例
  • Cloud Pub/Sub 服务

您可使用价格计算器根据您的预计使用情况来估算费用。GCP 新用户可能有资格免费试用

前提条件

此示例应用假定以下内容:

获取源代码

下载此处的示例代码并解压缩。如果您愿意,可以通过运行以下命令来克隆 GitHub 项目代码库:

C:\> git clone https://github.com/GoogleCloudPlatform/pubsub-shout-csharp.git

安装依赖项

在命令行终端中,导航到 pubsub-shout-csharp 代码库的本地副本的 appengine-python-flask 文件夹,然后运行以下命令:

C:\> pip install -r requirements.txt -t lib

创建 Compute Engine 实例

创建将运行代码封装容器和旧版代码的 Compute Engine 实例:

  1. 在 GCP Console 中,转到“创建新实例”页面

  2. 启动磁盘部分中,点击更改

  3. 从预配置的映像列表中,选择 Windows Server 2012 R2 Datacenter Edition,然后点击选择

  4. 防火墙部分中,允许传输 HTTP 和 HTTPS 流量。

  5. 项目访问部分中,授予对项目中所有 GCP 服务的完整 API 访问权限。

  6. 要显示高级选项,请点击管理、安全、磁盘、网络、单独租用,然后点击网络标签。

  7. 网络标记部分中,添加标记 rdp-tag。在本教程的后面,您将创建一个防火墙规则,允许外部 RDP 访问带有此标记的所有实例。

  8. 要开始创建新实例,请点击创建

创建该实例后,将默认 Windows 用户添加到该实例中:

  1. 在 GCP Console 中,转到虚拟机实例页面。

  2. 点击新部署的实例的名称。

  3. 在“实例详情”页面上,点击设置 Windows 密码按钮。

  4. 要在实例上创建用户帐号,请在设置新 Windows 密码对话框中添加用户名,然后点击设置

  5. 记下提供的密码,然后关闭对话框。

接下来,创建一条防火墙规则以启用对您实例的 RDP 访问:

  1. 在 GCP Console 中,转到“创建防火墙规则”页面

  2. 在表单中填写如下内容:

    • 名称:rdp-rule
    • 来源 IP 地址范围:0.0.0.0/0
    • 允许的协议和端口:tcp:3389
    • 目标标记:rdp-tag
  3. 要创建防火墙规则,请点击创建

构建和部署代码封装容器

要构建代码封装容器服务,请执行以下操作:

  1. 在 GCP Console 中,转到“凭据”页面

  2. 点击新建凭据,然后选择服务帐号密钥

  3. 创建服务帐号密钥页面上,在表单中填写如下内容:

    • 服务帐号:新服务帐号
    • 名称:您选择的名称。
    • 服务帐号 ID:您选择的 ID。
    • 密钥类型:JSON
  4. 点击创建。几秒钟后,一个 JSON 密钥文件将下载到您的本地计算机。

  5. 在本地计算机上创建一个新环境变量,将其命名为 GOOGLE_APPLICATION_CREDENTIALS,并将其设置为该 JSON 密钥文件的绝对路径。

  6. 转到 pubsub-shout-csharp 存储库的本地副本中的 windows-csharp 文件夹。

  7. 在 Visual Studio 2012 或更高版本中打开 ShoutService.sln

  8. 修改 ShoutLib/Constants.cs,将变量 ProjectId 设置为您的 https://console.cloud.google.com/ 项目 ID 并保存。

  9. Build 菜单中,点击 Build Solution 以构建应用。

构建代码包装函数服务后,将其复制到 Compute Engine 实例:

  1. 建立与本教程前面创建的实例的远程桌面连接。

  2. 在本地计算机上的 Windows 资源管理器中,转到 windows-csharp 文件夹下的 ShoutService\bin 文件夹。

  3. 从 Windows 资源管理器中复制 Release 文件夹,然后将其粘贴到远程连接窗口中,以将该文件夹复制到您的实例中。Release 文件夹包含封装容器和 Shout 服务。

接下来,允许 Windows 服务控制管理器通过向服务控制管理器使用的预定义 Windows 用户帐号 LOCAL SERVICE 授予适当权限来启动、停止和以其他方式与您的服务交互:

  1. 在 Windows 资源管理器中,转到 Release 文件夹。

  2. 右键点击该文件夹打开上下文菜单,然后点击属性

  3. 发布属性对话框中,点击安全标签。

  4. 点击修改

  5. 发布权限对话框中,点击添加

  6. 选择用户或组对话框的输入对象名称来选择下,输入 LOCAL SERVICE,然后点击确定

  7. 发布权限对话框中,点击本地服务

  8. 本地服务的权限下,确保启用以下权限:

    • 读取和执行
    • 列出文件夹内容
    • 读取
  9. 点击确定

最后,安装代码封装容器服务:

  1. 在远程计算机上,以管理员身份打开命令行终端,然后导航到 Release 文件夹。

  2. 安装代码封装容器服务:

    C:\> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe ShoutService.exe
    

部署 App Engine 应用

要部署 App Engine 应用,请执行以下操作:

  1. 在本地计算机上的命令行终端中,导航到 pubsub-shout-csharp 代码库的本地副本的 appengine-python-flask 文件夹。

  2. 部署应用。

    C:\> appcfg.py -A <your_project_id> -V 1 --oauth2 update .
  3. 在出现提示时验证应用。

  4. 启用Cloud Pub/SubAPI。

    启用 API

  5. 要初始化应用,请在网络浏览器中访问以下网址:

    https://<your_project_id>.appspot.com/init

    当您访问此网址时,App Engine 应用会创建一个 Cloud Pub/Sub 主题,然后将代码封装容器服务订阅到该主题。

恭喜!您的应用现已激活。访问 <your_project_id>.appspot.com 查看该应用的实际效果。

清理

完成“调用旧版代码”教程后,您可以清理在 GCP 上创建的资源,避免这些资源占用配额,日后产生费用。以下部分介绍如何删除或关闭这些资源。

删除您的 GCP 项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 GCP Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete。
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除您的 Compute Engine 实例

要删除 Compute Engine 实例,请运行以下命令:

  1. 在 GCP Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 点击您要删除的实例。
  3. 点击删除 delete 以删除映像。

后续步骤

  • 试用其他 Google Cloud Platform 功能。查阅我们的教程