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

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 ;
    }
}

 

你可能感兴趣的:(集群)