集群环境中开发代码注意事项

1.     Api----getRealPath()

有的中间件,对J2EE标准的支持不一样,如:Weblogic中无法在Servlet中使用getRealPath获取资源的绝对路径。

但是,我们可以使用类加载器来得到…/WEB-INF/classes/目录的绝对路径:

MyServlet.class.getClassLoader().getResource(“/”).getPath();

 

2.     Api----request.getRemoteHost();

获取请求的客户端的IP

如果使用了负载均衡器,则调用request.getRemoteHost()方法返回的是负载均衡器的IP,而不是客户端的实际IP

一般的负载均衡在发送请求到一台服务器时,会将客户端的真实IP放到header信息中,所以可以通过这种方式获取客户端的真实IP

 

获取客户端真实IP
public static String getRealIpAddres(HttpServletRequest request)
{
    String ip 
= request.getHeader("x-forwarded-for");
    
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
        ip 
= request.getHeader("Proxy-Client-IP");
    }
    
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
        ip 
= request.getHeader("WL-Proxy-Client-IP");
    }
    
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
    {
        ip 
= request.getRemoteAddr();
    }
    
return ip;
}

 

3.     Log4j日志记录

多数情况下,我们一台服务器上会对一个项目部署多个server,但是这多个serverlog4j配置文件内容却是一样的,这样就会造成多个server同时对日志文件进行写操作,

这样就会造成日志的丢失。解决思路如下:

一台机器上的各个server肯定占用的是不同的端口,所以可以将各个server的日志记录输出到对应的端口下,例如,log4j.properties文件中配置日志输出目录为:/root/bea/logs/

那么,我们可以让8001端口的server日志记录到/root/bea/logs/8001/目录下,8003端口的server记录到/root/bea/logs/8003/目录下,

这样就可以解决日志丢失的问题:代码放到filter中(/*),当第一次请求server时,就会创建相应端口的目录,以后的日志就会记录到该端口目录下

 

修改log4j日志路径
private static boolean created = false;    // 目录是否创建成功了
public static void initLog4JDir(HttpServletRequest request)
{
    
if(created)
        
return;
    
try
    {
        
// 1.读取property文件中,log4j日志的配置路径
        String logDir = readLogDir();
        
if(StringTools.isEmpty(logDir))
            
return;
        
// 2.如果文件路径不存在,则创建, 代码略
        
// logDir = createLogDirIfNeed(logDir, "8001");
        logDir = createLogDirIfNeed(logDir, request.getLocalPort());
        System.setProperty(
"LOG_DIR", logDir);
        
new PropertyConfigurator().doConfigure(Loader.getResource(LogManager.DEFAULT_CONFIGURATION_FILE),
                        LogManager.getLoggerRepository());
        created 
= true;
    } 
catch (Exception e)
    {
        e.printStackTrace();
        created 
= false;
    }
}

 

posted on 2010-09-21 03:55  TroyZ  阅读(734)  评论(0编辑  收藏  举报