Google app engine 从Go on AppEngine中的init()函数获取URL
背景:我正在运行Go-on-GAE并为我的路由器使用Mux。为了获取URL,GAE要求我使用其内置的urlFetch功能。我想在模块init()期间执行此URL获取,但据我所知,我只能在通过处理程序调用时使用urlFetchGoogle app engine 从Go on AppEngine中的init()函数获取URL,google-app-engine,go,spreadsheet,mux,Google App Engine,Go,Spreadsheet,Mux,背景:我正在运行Go-on-GAE并为我的路由器使用Mux。为了获取URL,GAE要求我使用其内置的urlFetch功能。我想在模块init()期间执行此URL获取,但据我所知,我只能在通过处理程序调用时使用urlFetch func init() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) r.HandleFunc("/about", anotherHandler) http.Handle("/", r) } G
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路由器,它就不想工作。因此,我不知道如何在URL处理程序的作用域之外进行urlFetch
传递mux路由器时出错:“无法将r(type*mux.router)用作“appengine”的参数中的type*http.Request。NewContext”您不能使用需要外部处理程序的appengine服务(因为创建
上下文需要一个值)。这本质上意味着您也不能在packageinit()函数中使用它们。
注意,您可以从cron作业和添加到任务队列的任务中使用它们,因为任务和cron作业是通过发出httpget请求来执行的
您必须重新构造代码,以便从处理程序调用服务(在您的例子中是urlFetch)
func init() {
r := mux.NewRouter()
r.HandleFunc("/", homeHandler)
r.HandleFunc("/about", anotherHandler)
http.Handle("/", r)
}
一个可能的解决方案是检查服务于用户请求的处理程序中的init是否完成。如果没有,请在继续处理请求之前,执行本应放入init()
中的初始化函数
是的,这可能会导致首次请求的服务时间较长。为此,我建议您使用。预热请求在新实例进入“活动”状态之前,即在它开始为用户请求提供服务之前,会发出给新实例。在app.yaml
config文件中,您可以通过向入站服务
指令添加-warmup
来启用预热请求:
inbound_services:
- warmup
这将导致应用程序引擎基础结构首先向/\u ah/warmup
发出GET
请求。您可以将处理程序注册到此URL并执行初始化任务。与任何其他请求一样,您将在预热处理程序中有一个
但请注意:
…即使应用程序中启用了预热请求,您也可能会遇到
这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。“…但其参数是http路由器…”它不是http路由器,它是*http.request
,因此显然不能传递*mux.router
值。继续,谢谢你,伊卡!非常有帮助,热身的要求是正确的钱。