在服务器环境中使用 Remote Config


Firebase Remote Config 支持使用 Firebase Admin Go SDK 4.17.0 版或更高版本进行服务器端配置。借助该功能,您可以使用 Remote Config 动态管理服务器端应用的行为和配置。包括 Cloud Functions 等无服务器实现。

与 Firebase 客户端 SDK 不同,服务器端 Remote Config SDK 会从 Firebase 提取完整的 Remote Config 模板,而客户端 SDK 提取的是从 Remote Config 模板派生出的客户端专属配置。之后,服务器可以针对每个传入请求为模板赋值,并用自己的逻辑以极低的延迟提供自定义响应。 您可以使用条件根据随机百分比和自定义信号中定义的客户端属性来控制和自定义响应。

借助服务器端 Remote Config,您可以:

  • 为在服务器上运行或通过服务器访问的应用定义配置参数,支持远程配置 AI 模型参数和提示以及其他集成等使用场景,以确保 API 密钥的安全性。
  • 根据环境的变化或其他应用变化动态调整参数,比如更新 LLM 参数和模型端点。
  • 通过远程更新服务器调用的 API 来控制费用。
  • 为访问服务器的客户端即时生成自定义配置。
  • 记录哪些客户端收到了参数值,并将其作为授权验证系统的一部分在 Cloud Functions 中使用。

您可以在 Cloud Run、Cloud Functions 或自托管的服务器环境中部署服务器端 Remote Config

准备工作

按照将 Firebase Admin SDK 添加到您的服务器中的说明,创建 Firebase 项目、设置服务账号,并将 Firebase Go SDK 添加到服务器。

第 1 步:初始化 Firebase Admin Go SDK 并对 API 请求授权

如果在初始化 Admin SDK 时未提供任何参数,该 SDK 将使用 Google 应用默认凭据并从 GOOGLE_APPLICATION_CREDENTIALS 环境变量中读取选项。如需初始化 SDK 并添加 Remote Config,请使用以下内容:

ctx := context.Background()

// Initialize Firebase
app, err := firebase.NewApp(ctx, nil)
if err != nil {
    log.Fatalln("Error initializing app:", err)
}

remoteConfig, err := app.RemoteConfig(ctx)
if err != nil {
    log.Fatalln("Error initializing remote config client:", err)
}

第 2 步:确定服务器应用的默认参数值

确定应用中您想要使用 Remote Config 动态更新的变量。然后,考虑应用中必须默认设置哪些变量,以及它们的默认值应该是什么。这可确保应用成功运行,即使其与 Remote Config 后端服务器的连接中断也是如此。

例如,如果您要编写一个管理生成式 AI 函数的服务器应用,您可以设置默认的模型名称、提示序言和生成式 AI 配置,如下所示:

参数名称 说明 类型 默认值
model_name 模型 API 名称 字符串 gemini-2.0-flash
preamble_prompt 要附加到用户查询前面的提示 字符串 I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!
generation_config 要发送到模型的参数 JSON {"stopSequences": ["I hope this helps"], "temperature": 0.7, "maxOutputTokens": 512, "topP": 0.9, "topK": 30}

第 3 步:配置服务器应用

确定要用 Remote Config 配置的参数后,您便可以开始配置应用,以设置默认值、提取服务器专属的 Remote Config 模板并使用其值。以下步骤介绍了如何配置 Go 应用。

  1. 访问并加载模板。

    // Initialize server-side Remote Config
    
    defaultConfig := make(map[string]any)
    templateDataJSON := ""
    template, err := remoteConfig.InitServerTemplate(defaultConfig, templateDataJSON)
    if err != nil {
             log.Fatalln("Error initializing server template:", err)
    }
    
    // Load Remote Config
    err = template.Load(ctx)
    if err != nil {
             log.Fatalln("Error fetching server template:", err)
    }
    
    

    或者,如果您将 Go 与 Cloud Functions 搭配使用,则可以使用 GetServerTemplate,一步即可完成模板的初始化和加载:

    // Initialize server-side Remote Config
    defaultConfig := make(map[string]any)
    
    template, err := remoteConfig.GetServerTemplate(ctx, defaultConfig)
    if err != nil {
             log.Fatalln("Error fetching server template:", err)
    }
    
    

    您还可以使用 GetServerTemplate 函数检索所需的服务器模板,以此初始化模板。您可以将此模板转换为可存储在本地的 JSON 格式。随后,您可以使用 InitServerTemplate 函数初始化此 JSON 模板。

  2. 为应用添加每个参数的默认值,以确保应用成功运行,即使其与 Remote Config 后端服务器的连接中断也是如此。为此,请在 InitServerTemplateGetServerTemplate 模板函数中添加一个 defaultConfig

    // Initialize server-side Remote Config
    
    defaultConfig := make(map[string]any)
    defaultConfig["model_name"] = "gemini-2.0-flash"
    
    // Assume the type generationConfig has been defined
    defaultConfig["generation_config"] = &generationConfig{
        StopSequences:   []string{"I hope this helps"},
        Temperature:     0.7,
        MaxOutputTokens: 512,
        TopP:            0.9,
        TopK:            30,
      }
    
    defaultConfig["preamble_prompt"] = "I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!"
    
    templateDataJSON := ""
    template, err := remoteConfig.InitServerTemplate(defaultConfig, templateDataJSON)
    if err != nil {
             log.Fatalln("Error initializing server template:", err)
    }
    
    // Load Remote Config
    err = template.Load(ctx)
    if err != nil {
             log.Fatalln("Error fetching server template:", err)
    }
    
    
  3. 模板加载后,使用 template.Evaluate() 从模板导入参数和值:

    // An empty evaluation context means no conditions are applied.
    evaluationContext := make(map[string]any)
    config, err := template.Evaluate(evaluationContext)
    
    if err != nil {
    log.Fatalln("Error evaluating template:", err)
    }
    
    
  4. 此外,如果您在 Remote Config 模板中设置了条件,则可以选择定义并提供所需的值:

    • 如果使用百分比条件,请在 template.Evaluate() 函数中添加要用于评估条件的 randomizationID
    • 如果使用自定义信号,请定义属性及其值。自定义信号适用于 Firebase Admin Go SDK 4.17.0 版及更高版本。

    例如,您可以将 Firebase 安装 ID 或用户 ID 设置为 randomizationID,以确保将与您的服务器通信的每个用户都添加到适当的随机分组中;将 version 设置为自定义信号,以定位特定的客户端版本;将 platform 设置为自定义信号,以定位客户端平台。

    如需详细了解条件,请参阅条件规则类型

    
    // Add template parameters to `config`. Evaluates the
    // template and returns the parameter value assigned to
    // the group assigned to the {randomizationID}, version and platform.
    evaluationContext := make(map[string]any)
    evaluationContext["randomizationID"] = "2ac93c28-c459-4760-963d-a3974ec26c04"
    evaluationContext["version"] = "1.0"
    evaluationContext["platform"] = "Android"
    
    config, err := template.Evaluate(evaluationContext)
    
    if err != nil {
           log.Fatalln("Error evaluating template:", err)
    }
    
    
  5. 接下来,从配置常量中提取所需的参数值。您可以使用 gettersRemote Config 中的值转换为您需要的格式。系统支持以下类型:

    • 布尔值:GetBoolean
    • 整数:GetInt
    • 浮点数:GetFloat
    • 字符串:GetString
    • 值来源:GetValueSource

    例如,如果您要在服务器上实现 Vertex AI 并想要更改模型和模型参数,则可能需要为 model_namegeneration_config 配置参数。以下示例展示了如何访问 Remote Config 的值:

    
    // Replace defaults with values from Remote Config.
    
    // Assume the type generationConfig has been defined
    var genConfig generationConfig
    err = json.Unmarshal([]byte(config.GetString("generation_config")), &genConfig)
    if err != nil {
    log.Fatalln("Error unmarshaling generation config:", err)
    }
    model := config.GetString("model_name")
    
    // Parameter created on the console
    isAIEnabled := config.GetBoolean("is_ai_enabled")
    
    // Generates a prompt comprised of the Remote Config
    // parameter and prepends it to the user prompt (assume it is extracted from the request body)
    userPrompt := "What is Remote Config?"
    prompt := fmt.Sprintf("%s %s", config.GetString("preamble_prompt"), userPrompt)
    
  6. 如果您的服务器长时间运行(即不是无服务器环境),请定期重新加载模板,以确认您正在从 Remote Config 服务器提取最新的模板。

第 4 步:在 Remote Config 中设置服务器专属参数值

接下来,创建一个服务器 Remote Config 模板,并配置要在应用中使用的参数和值。

如需创建服务器专属 Remote Config 模板,请执行以下操作:

  1. 打开 Firebase 控制台Remote Config 参数页面,然后从客户端/服务器选择器中选择服务器
  2. 定义与应用中定义的参数具有相同名称和数据类型的 Remote Config 参数,并提供值。当您提取模板、为模板赋值,并将这些值分配给变量时,这些值将替换您在配置服务器应用步骤设置的 defaultConfig
  3. 此外,您还可以选择设置条件,将值持续应用于随机实例样本或您定义的自定义信号。如需详细了解条件,请参阅条件规则类型
  4. 添加完参数后,点击发布更改
  5. 审核更改,然后再次点击发布更改

第 5 步:使用 Cloud FunctionsCloud Run 进行部署

如果您的服务器应用是轻量级的事件驱动型应用,不妨考虑使用 Cloud Functions 来部署您的代码。例如,如果您有一款应用,其中包含由生成式 AI API(例如 Google AIVertex AI)提供技术支持的角色对话。在这种情况下,您可以在应用按需调用的函数中托管 LLM 服务逻辑。

如需详细了解如何使用 Cloud Functions 部署应用,请参阅使用入门:编写、测试并部署您的首批函数

如果您的应用打算长时间运行(例如包含资源的 Web 应用),建议考虑使用 Cloud Run。如需使用 Cloud Run 部署服务器应用,请按照快速入门:构建 Go Web 应用并将其部署到 Cloud Run 中的指南进行操作。

如需详细了解 Cloud RunCloud Functions 的最佳使用场景,请参阅Cloud FunctionsCloud Run:何时应选择其中一种服务