在java中动态加载配置的最佳方法?

在java中动态加载配置的最佳方法?,java,config,ab-testing,Java,Config,Ab Testing,我正在用java设计一个web服务,我需要用java中的请求进行某种AB测试 基本上,我正在寻找方法来轻松配置参数,这些参数将由请求处理程序动态加载,以根据配置值确定代码路径 例如,假设我需要从外部web服务或本地DB获取一些数据。我希望有一种方法来配置参数(本文中的条件),以便确定是从外部web服务还是从本地DB获取数据 如果我使用上面的键值对配置系统,示例可能会产生类似的结果 locale=us percentage=30 browser=firefox 这意味着我将从本地数据库获取30%

我正在用java设计一个web服务,我需要用java中的请求进行某种AB测试

基本上,我正在寻找方法来轻松配置参数,这些参数将由请求处理程序动态加载,以根据配置值确定代码路径

例如,假设我需要从外部web服务或本地DB获取一些数据。我希望有一种方法来配置参数(本文中的条件),以便确定是从外部web服务还是从本地DB获取数据

如果我使用上面的键值对配置系统,示例可能会产生类似的结果

locale=us
percentage=30
browser=firefox
这意味着我将从本地数据库获取30%的请求数据,这些请求来自用户代理为firefox的美国用户。我希望这个配置系统是动态的,这样服务器就不需要重新启动

对于非常高级别的描述表示抱歉,但如有任何见解/线索,将不胜感激。
如果这是一个在过去被打死的主题,请告诉我链接。

我不确定它是否对您有帮助,但我通常将配置数据放在一些可编辑的文件中:

文件params.ini 我使用这个类来加载它:

import java.io.*;
import java.util.HashMap;
import java.util.Scanner;

public class Params 
{
 static int VERTICES = 0;
 static int N_POLY = 0;
 static float MUTATION_RATE = 0.0f;
 static int PHOTO_INTERVAL_SEC = 0;
 static String TARGET_FILE;
 static boolean RANDOMIZE_START = false;
 static int MIN_ALPHA = 0;
 static int MAX_ALPHA = 0;
 
 public Params() 
 { 
  Scanner scanner = new Scanner(this.getClass().getResourceAsStream("params.ini")); 
  HashMap<String, String> map = new HashMap<String, String>();
  
  while (scanner.hasNext()) 
  {
   map.put(scanner.next(), scanner.next());
  }
  
  TARGET_FILE = map.get("target_file");
  VERTICES = Integer.parseInt(map.get("vertices"));
  N_POLY = Integer.parseInt(map.get("n_poly"));    
  MUTATION_RATE = Float.parseFloat(map.get("mutation_rate"));
  PHOTO_INTERVAL_SEC = Integer.parseInt(map.get("photo_interval_sec"));
  RANDOMIZE_START = Boolean.parseBoolean(map.get("randomize_start"));
  MIN_ALPHA = Integer.parseInt(map.get("min_alpha"));
  MAX_ALPHA = Integer.parseInt(map.get("max_alpha"));
 }
 
}

希望有帮助

我不确定它是否对您有帮助,但我通常会将配置数据放在一些可编辑的文件中:

文件params.ini 我使用这个类来加载它:

import java.io.*;
import java.util.HashMap;
import java.util.Scanner;

public class Params 
{
 static int VERTICES = 0;
 static int N_POLY = 0;
 static float MUTATION_RATE = 0.0f;
 static int PHOTO_INTERVAL_SEC = 0;
 static String TARGET_FILE;
 static boolean RANDOMIZE_START = false;
 static int MIN_ALPHA = 0;
 static int MAX_ALPHA = 0;
 
 public Params() 
 { 
  Scanner scanner = new Scanner(this.getClass().getResourceAsStream("params.ini")); 
  HashMap<String, String> map = new HashMap<String, String>();
  
  while (scanner.hasNext()) 
  {
   map.put(scanner.next(), scanner.next());
  }
  
  TARGET_FILE = map.get("target_file");
  VERTICES = Integer.parseInt(map.get("vertices"));
  N_POLY = Integer.parseInt(map.get("n_poly"));    
  MUTATION_RATE = Float.parseFloat(map.get("mutation_rate"));
  PHOTO_INTERVAL_SEC = Integer.parseInt(map.get("photo_interval_sec"));
  RANDOMIZE_START = Boolean.parseBoolean(map.get("randomize_start"));
  MIN_ALPHA = Integer.parseInt(map.get("min_alpha"));
  MAX_ALPHA = Integer.parseInt(map.get("max_alpha"));
 }
 
}

希望有帮助

我以前用过这个。在java中,使用java.util.Properties实现您的要求是最常见的方法:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
* Class that loads settings from config.properties
* @author Brant Unger
*
*/
public class Settings 
{
public static boolean DEBUG = false; 

/**
 * Load settings from config.properties
 */
public static void load()
{
    try
    {
        Properties appSettings = new Properties();
        FileInputStream fis = new FileInputStream("config.properties"); //put config properties file to buffer
        appSettings.load(fis); //load config.properties file

                   //This is where you add your config variables:
                   DEBUG = Boolean.parseBoolean((String)appSettings.get("DEBUG"));

        fis.close();
        if(DEBUG) System.out.println("Settings file successfuly loaded");

    }
    catch(IOException e)
    {
        System.out.println("Could not load settings file.");
        System.out.println(e.getMessage());
    }
}
}

然后在你的主课上你可以做:

Settings.load(); //Load settings
然后,您可以在每个其他类中检查这些变量的值,如:

if (Settings.DEBUG) System.out.println("The debug value is true");

我以前用过这个。在java中,使用java.util.Properties实现您的要求是最常见的方法:

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
* Class that loads settings from config.properties
* @author Brant Unger
*
*/
public class Settings 
{
public static boolean DEBUG = false; 

/**
 * Load settings from config.properties
 */
public static void load()
{
    try
    {
        Properties appSettings = new Properties();
        FileInputStream fis = new FileInputStream("config.properties"); //put config properties file to buffer
        appSettings.load(fis); //load config.properties file

                   //This is where you add your config variables:
                   DEBUG = Boolean.parseBoolean((String)appSettings.get("DEBUG"));

        fis.close();
        if(DEBUG) System.out.println("Settings file successfuly loaded");

    }
    catch(IOException e)
    {
        System.out.println("Could not load settings file.");
        System.out.println(e.getMessage());
    }
}
}

然后在你的主课上你可以做:

Settings.load(); //Load settings
然后,您可以在每个其他类中检查这些变量的值,如:

if (Settings.DEBUG) System.out.println("The debug value is true");

我刚刚发布了一个使用
.yml
文件的开源解决方案,它可以加载到POJO中,从而创建了一个比属性映射更好的解决方案。此外,该解决方案还将系统特性和环境变量插入到占位符中:

url:${database.url}
密码:${database.password}
并发:12
可以将其加载到
映射
或更好的Java POJO中


请参见

我刚刚发布了一个使用
.yml
文件的开源解决方案,该文件可以加载到POJO中,从而创建了一个比属性映射更好的解决方案。此外,该解决方案还将系统特性和环境变量插入到占位符中:

url:${database.url}
密码:${database.password}
并发:12
可以将其加载到
映射
或更好的Java POJO中


请参见

java.util.Properties是实现此目的的“标准”方式java.util.Properties是实现此目的的“标准”方式您是在询问如何将配置从文件读取到内存中的结构中,还是在询问如何将所有这些合并到web服务中?如果是后者,您将使用什么技术堆栈来实现web服务?还有,您将拥有多少不同的分支点?因为进行AB测试的一个非常简单的方法是拥有两个版本的服务,并在实现/实例之前设置路由。您是在问如何将配置从文件读取到内存中的结构中,还是在问如何将所有这些合并到web服务中?如果是后者,您将使用什么技术堆栈来实现web服务?还有,您将拥有多少不同的分支点?因为进行AB测试的一种非常简单的方法是使用两个版本的服务,并在实现/实例之前设置路由。