使用 Cloud Datastore 初始化 Go AppEngine 应用

在 GAE 的 golang 应用程序的 init() 函数中,如何为我的应用程序设置初始值?

如何在 init() 函数中或在应用程序启动后立即从 Cloud Datastore 读取?据我了解,服务器无法写入本地文件系统,而 Cloud Datastore 是唯一的选择?

我需要一些全局变量和数据切片..


慕哥9229398
浏览 170回答 1
1回答

呼唤远方

使用静态文件在 AppEngine 上,您无权访问主机操作系统的文件系统,但您可以访问您的 Web 应用程序的文件(您具有只读权限,不能更改它们,也不能在其中创建新文件)应用程序的文件夹)。所以问题是:您的应用程序代码能否更改您想要读取并用于初始化的数据?或者,如果它与您的应用程序代码“静态”部署,是否可以?如果您不需要更改它(或仅在您重新部署应用程序时),最简单的方法是将其存储为“静态”文件作为 Web 应用程序的一部分。您可以使用相对路径来引用您的应用程序的文件,其中当前或工作目录是您应用程序的根目录。例如,如果您的应用程序data在其根目录(app.yaml所在的位置)中包含一个文件夹,并且该init_values.txt文件data夹内有一个文件,您可以使用以下路径引用它:data/init_values.txt.一个重要的注意事项:并非每个文件都可以通过代码读取,这取决于应用程序配置。引用配置 app.yaml / 静态文件处理程序:如果您有应用程序代码需要读取的数据文件,则该数据文件必须是应用程序文件,并且不能与静态文件模式匹配。使用数据存储您不能使用需要Context外部处理程序的AppEngine 服务(因为创建 aContext需要一个*http.Request值)。这本质上意味着您也不能在包init()函数中使用它们。请注意,您可以从添加到任务队列的 cron 作业和任务中使用它们,因为任务和 cron 作业是通过发出 HTTP GET 请求来执行的。您必须重构您的代码,以便从处理程序调用您的初始化(例如从数据存储区读取)。使用以下方法实现此目的的示例Once.Do():var once = sync.Once{}func MainHandler(w http.ResponseWriter, r *http.Request) {    ctx := appengine.NewContext(r)    once.Do(func() { mysetup(ctx) })    // do your regular stuff here}func mysetup(ctx appengine.Context) {    // This function is executed only once.    // Read from Datastore and initialize your vars here.}“利用”预热请求是的,这可能会导致第一个请求需要更长的时间来服务。为此(为了避免这种情况),我建议您使用Warmup requests。在新实例开始为用户请求提供服务之前,它会在“上线”之前向新实例发出预热请求。在您的app.yaml配置文件,你可以通过添加使预热请求-warmup的inbound_services指令:inbound_services:  - warmup这将导致 App Engine 基础架构首先向 发出GET请求/_ah/warmup。您可以向此 URL 注册处理程序并执行初始化任务。与任何其他请求一样,您将http.Request在预热处理程序中有一个。但请注意:..您可能会遇到加载请求,即使您的应用程序中启用了预热请求。这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go