创建 Web 服务
本页介绍了如何使用 Golang 编写的 Gin Web 框架在虚拟机中创建 Web 服务。您可以选择在要使用的任何其他框架中创建 Web 服务。
- 如需在虚拟机中下载 Go 软件包,请在虚拟机中运行以下命令:
wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
- 在虚拟机中安装 Go。如需了解详情,请参阅安装 Go。
- 如需为 Web 服务创建新目录,请运行以下命令:
mkdir SERVICE_REPO cd SERVICE_REPO
其他注意事项
创建 Web 服务时,您必须注意以下事项:
- 您在创建虚拟机期间需要的输入可作为环境变量提供,并且具有以下前缀:
CONNECTOR_ENV_
。 - 设置 Web 服务时,请使用环境变量读取此类值。
- 在创建虚拟机期间,必须仅将设置 Web 服务所需的值作为输入。
- 必须从 CONNECTOR_ENV_PORT 变量中获取服务的端口作为输入。
- 使用其他环境变量作为可选输入。
- 您还可以在创建连接期间获取输入。您可以在创建自定义连接器时定义这些字段,并在每次 API 调用中将其作为路径、查询或标头传递。
- 确保服务器在 localhost 上运行。
日志记录
记录所需信息并将日志推送到 Cloud Logging。这有助于连接器使用方跟踪和调试故障。如需将日志发布到 Cloud Logging,您可以使用 Go 中提供的以下 Cloud Logging 客户端:https://pkg.go.dev/cloud.google.com/go/logging#NewClient
您必须在 main 中初始化日志记录器,并在 Gin 中添加中间件来跟踪所有传入请求。您必须跟踪请求的方法、路径、状态和延迟时间。如需过滤日志,请在记录日志时使用适当的严重级别。在 Web 服务中,从环境变量读取日志级别。日志级别在创建虚拟机期间作为可选输入。默认情况下,可以使用 Info 日志。日志级别如下:
- DEBUG:记录请求的每个部分,包括 HTTP 请求/响应轨迹。
- INFO:记录服务启动、服务关闭、请求和其他信息。
- ERROR:记录请求失败、格式异常和其他错误。
关停提醒
设置服务器以正常关闭并处理正在处理的请求。如需了解如何优雅重启或停止服务器,请参阅优雅重启或停止。
并发
Gin 服务器固有地支持使用 Go 协程处理并发请求。默认情况下,Go 例程允许处理不确定数量的请求。不过,在某些情况下,如果请求预计会占用大量资源,请使用工作器池来限制和缓冲服务器上的请求。如需了解详情,请参阅工作器池示例。
测试并构建二进制文件
- 使用以下命令设置端口并运行服务器:
- 如需验证服务器,请在虚拟机上运行以下 curl 命令:
curl -X POST -H "Content-Type: application/json" -H "X-Custom-Header: MyValue" -d '{"name": "Alice", "address": "123 Main St", "gender": "F"}' http://localhost:8081/postData/456
curl -v http://localhost:8081/getData -H "TestKey: MyValue"
- 使用以下命令创建二进制文件并将其用作虚拟机映像:
go build -o SERVICE_NAME
- 使用以下命令将二进制文件移至根文件夹:
sudo cp SERVICE_NAME /opt
- 使用以下命令再次运行服务,以验证二进制文件是否按预期运行:
sudo chmod +x SERVICE_NAME ./SERVICE_NAME
EXPORT CONNECTOR_ENV_PORT = 8081 go get . go run .
这些命令会打包所需的库并运行服务器。
将应用容器化
- 安装 Docker。如需了解详情,请参阅安装 Docker。
- 创建一个 Docker 文件以运行二进制文件。
FROM alpine:latest WORKDIR /opt COPY . . CMD ["./SERVICE_NAME"]
- 使用以下命令构建连接器容器:
sudo docker build -t connector-container .
- 运行 Docker 容器。设置
--restart=unless-stopped
以在发生意外失败时重启服务。
容器级任务
在运行 Docker 容器时,您可以使用 gcplogs 日志驱动程序将标准输出中的所有日志路由到 Cloud Logging。这有助于跟踪服务的启动、意外失败或关闭情况。
如需将日志路由到 Cloud Logging,请运行以下命令:sudo docker run --name connector-service -e CONNECTOR_ENV_PORT=$CONNECTOR_ENV_PORT -p $CONNECTOR_ENV_PORT:$CONNECTOR_ENV_PORT --restart=unless-stopped ----log-driver=gcplogs connector-container