背景:我在 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(使用前将#替换为@)