从 Go on AppEngine 中的 init() 函数获取 URL

2023-12-02

背景:我在 GAE 上运行 Go,并在我的路由器上使用 Mux。为了获取 URL,GAE 要求我使用其内置的 urlFetch 功能。我想让这个 URL 获取在我的模块 init() 期间发生,但据我所知,我只能在通过处理程序调用时使用 urlFetch。

func init() {
  r := mux.NewRouter()
  r.HandleFunc("/", homeHandler)
  r.HandleFunc("/about", anotherHandler)
  http.Handle("/", r)
}

GAE 建议使用以下代码来制作 urlFetch:

c := appengine.NewContext(r)
client := urlfetch.Client(c)

...但它的参数是一个 http 路由器,如果我通过我的 mux 路由器它就不想工作。所以我不知道如何让 urlFetch 在 URL 处理程序的范围之外发生。

传递 mux 路由器时出错:“无法在“appengine”.NewContext 的参数中使用 r(类型 *mux.Router)作为类型 *http.Request”


You can't use AppEngine services that require a Context outside of handlers (because the creation of a Context requires an *http.Request value). This by nature means you can't use them in package init() functions either.
Note that you can use them from cron jobs and tasks added to task queues, because tasks and cron jobs are executed by issuing HTTP GET requests.

您必须重组代码,以便从处理程序调用服务(在您的情况下为 urlFetch)。

一个可能的解决方案是检查 init 是否在服务用户请求的处理程序中完成。如果没有,则执行您原本要放入的初始化函数init()在继续处理请求之前。

是的,这可能会导致首次请求的处理时间显着延长。为此目的(为了避免这种情况)我建议您使用预热请求。在新实例“上线”之前、开始服务用户请求之前,会向新实例发出预热请求。在你的app.yaml在配置文件中,您可以通过添加来启用预热请求-warmup to the inbound_services指示:

inbound_services:
  - warmup

这将导致 App Engine 基础架构首先发出GET请求/_ah/warmup。您可以向此 URL 注册处理程序并执行初始化任务。与任何其他请求一样,您将有一个http.Request在预热处理程序中。

但请注意:

..你可能会遇到加载请求,即使您的应用程序中启用了预热请求。

这意味着在极少数情况下,新实例可能不会收到预热请​​求,因此最好也检查用户处理程序中的初始化状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Go on AppEngine 中的 init() 函数获取 URL 的相关文章

  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • gcloud 应用程序部署 - 更新服务默认值失败,代码为 13 超出实例配额限制,并且 401 未授权

    创建了一个新项目 在第一次部署时我得到这个 Updating service default this may take several minutes failed ERROR gcloud app deploy Error Respon
  • 使用 OpenID 保护应用程序引擎中的 remote_api

    我之前问过一个question https stackoverflow com questions 2981226 app engine remote api with openid关于将应用程序引擎的remote api与openID一起
  • 为什么Golang无法从前面小写字符的struct生成json?

    我正在尝试打印我创建的结构体的 json 结果 如下所示 type Machine struct m ip string m type string m serial string 并打印出来 m Machine m ip test m t
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 批量 put() 限制

    对于批量更新现有记录是否存在硬限制或性能下降限制 我有一个任务队列进程 其中处理数千条现有记录 在流程循环结束时 所有记录的索引 BooleanProperty 从 False 更改为 True 一次执行 5 000 条记录与嵌套批次放置
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 与 Reflect.StructTag.Get 不兼容

    我当时在 Google Cloud 中工作 一切都很好 但是当我在 PC 中克隆所有项目时 每个 JSON 结构中都有此消息 结构体字段标签bson edad json edad omitempty 与reflect StructTag G
  • 交叉编译共享库

    我想知道是否有可能 如果是的话 如何 与 Go 交叉编译共享库 假设我有这段代码 package main import C export DoubleIt func DoubleIt x int int return x 2 func m
  • 为什么结构体的字段是“非名称”[重复]

    这个问题在这里已经有答案了 这段代码不起作用 它抱怨 j Bar 是一个 非名字 package main import fmt import os type foo struct Bar string Baz int func main
  • 在 App Engine 灵活的 PHP 7.0 上连接到第二代 Cloud SQL - 缺少套接字

    我决定在 App Engine 上尝试 PHP 7 并按照说明进行操作here https cloud google com appengine docs flexible php using cloud sql连接到第二代 Cloud S
  • 在 Google App Engine Flex 上将 Websockets 与 Django 结合使用

    我目前正在尝试使用 django 框架和 django channels 设置 Google 应用程序引擎 Flex 对于我当前的项目 我需要一个 websocket 所以我尝试重建 Django channels 网站上提供的教程 htt
  • 如何通过map[string]interface{}递归迭代

    我遇到了一个问题 如何在附加条件下递归地迭代 map string interface 1 如果一个值是一个映射 递归调用该方法 2 如果一个值是一个数组 调用数组的方法 3 如果一个值不是一个映射 处理它 现在当方法尝试执行时doc th
  • appengine python (bigtable) 中的父->子关系

    我仍在学习有关 bigtable nosql 中的数据建模的课程 并且希望得到一些反馈 如果我经常需要跨父母处理孩子的聚合 那么我应该在数据建模中避免父母 gt 孩子的关系吗 举个例子 假设我正在构建一个由许多作者贡献的博客 每个作者都有帖
  • Google App Engine 数据存储中最有效的一对多关系?

    抱歉 如果这个问题太简单了 我才刚上九年级 我正在尝试学习 NoSQL 数据库设计 我想设计一个谷歌数据存储模型 最大限度地减少读 写次数 以下是一对多关系中的博客文章和评论的玩具示例 将所有评论存储在 StructuredProperty
  • 在 Go 中传递任意函数作为参数

    我正在尝试扩展我对 Go 函数指针的了解 并且我有一个问题 在 Go 中将函数作为参数传递可以做什么 不可以做什么 假设我想写一个decorator 可以包装任何现有函数的函数 为简单起见 我们将其限制为仅接受一个参数并仅返回一个值的函数
  • go install - 我需要手动更新我的路径吗?

    我对 Go 的最新最佳实践是什么有点困惑 在 macos 上安装最新的 1 17 Go 没有 GOPATH 环境变量 使用 go mod 我看到我的路径中有以下内容 usr local go bin 当我跑步时go install
  • 数据存储区中的一对多关系和 Google App Engine 中的取消引用

    我在两个实体之间有一对多关系 第一个是卫星 第二个是频道 卫星表单返回一个卫星名称 我希望该名称出现在另一个 HTML 页面中 并带有频道数据 您可以在其中表示该频道与该卫星相关 我怎样才能做到这一点 这听起来像是使用 ReferenceP
  • 在 Google App Engine 数据模型中进行“OR”查询

    我想进行这样的查询 从地址 或年龄 的人中选择名称 这在GAE模型中可能吗 所有事物都包含 AND 闭包 而不是 OR 我如何使用 JDO JPA Objectify 来做到这一点 提前致谢 数据存储上没有 OR 运算 您必须执行两个单独的
  • 如何从 gorm 中的模型获取表名?

    是否可以获得模型的表名 我发现可以从模型结构但我不知道如何正确地做到这一点 我没有找到该结构的任何初始化 user User tableName db 对于 Gorm v2 根据https github com go gorm gorm i

随机推荐