练习 - 使用自定义处理程序构建应用

已完成

在本练习中,你将通过使用“Go”构建和运行无服务器应用。

构架应用

通过构架应用开始,方法是使用 Visual Studio Code 中的 Azure Functions 扩展。

  1. 选择“查看”>“命令面板” 。
  2. 选择“Azure Functions:创建新项目”。
  3. 选择一个文件夹,通常选择的是你的当前文件夹。
  4. 在“选择语言”中,选择“自定义处理程序”。
  5. 在“为第一个函数选择模板”中,选择“HttpTrigger”。
  6. 为应用命名,如“hello”
  7. 选择“匿名”的授权级别。 以后可以根据需要对其进行更改。

你的项目现如下所示:

hello/
  function.json
.funcignore
.gitignore
host.json
local.settings.json
proxies.json

创建应用

接下来的一系列步骤是创建可响应 HTTP 触发器的应用。

  1. 在项目根目录下创建一个名为“server.go”的文件。

  2. 为“server.go”提供以下内容:

    package main
    
    import (
     "fmt"
     "io/ioutil"
     "log"
     "net/http"
     "os"
    )
    

    前面的代码将导入生成 HTTP 应用和查找环境变量所需的所有库。

  3. 在导入语句后面添加以下代码:

    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      // mux.HandleFunc("/api/hello", helloHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    main() 函数由自身调用。 代码的第一行指出了它将如何从 FUNCTIONS_CUSTOM_HANDLER_PORT 环境变量读取:

    customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
    

    接下来,该函数会检查端口是否存在。 如果不存在,则为该函数分配端口 8080:

    if !exists {
      customHandlerPort = "8080"
    }
    

    下一个代码会实例化 HTTP 服务器实例:

    mux := http.NewServeMux()
    

    最后一行的重要性在于使用方法 ListenAndServe() 开始侦听特定端口并标志已准备好接收请求:

    log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    
  4. 让我们添加剩下的代码。 首先,本地化以下行并取消注释:

    // mux.HandleFunc("/api/hello", helloHandler)
    
  5. 在导入语句和 main() 函数之间,添加以下代码:

    func helloHandler(w http.ResponseWriter, r *http.Request) {
      w.Header().Set("Content-Type", "application/json")
      if r.Method == "GET" {
        w.Write([]byte("hello world"))
      } else {
        body, _ := ioutil.ReadAll(r.Body)
        w.Write(body)
      }
    }
    

    helloHandler() 函数将内容类型设置为 application/json。 它响应的是“hello world”或发布的正文(如果有)。

运行应用

此时,你已完成代码编写,但需要进行一些配置才能使此方案正常运行。 需要指出可执行文件的位置,以便 Function 主机可以找到它。 还需要配置路由并说明此应用处理 HTTP 触发器而不是其他类型的绑定。

  1. 在终端中,在项目根目录下运行 go build server.go

    go build server.go
    

    此步骤会创建一个在 macOS 和 Linux 上称为“server”,或在 Windows OS 上称为“server.exe”的可执行文件。

  2. 打开“host.json”,然后在 defaultExecutablePath 文件中找到 customHandler 元素。 在 macOS 和 Linux 上指定 ./server,或在 Windows OS 上指定 .\server.exe

  3. customHandler 元素下,添加 enableForwardingHttpRequest 元素并赋予其值 truecustomHandler 元素现在应如下所示:

    "customHandler": {
     "description": {
       "defaultExecutablePath": "./server",
       "workingDirectory": "",
       "arguments": []
     },
     "enableForwardingHttpRequest" : true
    }
    
  4. 在终端中,在项目根目录下运行 func start。 这样做将启动 Functions 应用。

    func start
    

    在输出的末尾,你将看到类似于以下内容的输出:

    Functions:
    
         hello: [GET,POST] http://localhost:7071/api/hello
    
  5. 在浏览器中转到 http://localhost:7071/api/hello。 你应会看到输出:“hello world”。

祝贺你! 你已使用 Go 开发出无服务器应用。