集群环境中开发代码注意事项
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:
{
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,但是这多个server的log4j配置文件内容却是一样的,这样就会造成多个server同时对日志文件进行写操作,
这样就会造成日志的丢失。解决思路如下:
一台机器上的各个server肯定占用的是不同的端口,所以可以将各个server的日志记录输出到对应的端口下,例如,log4j.properties文件中配置日志输出目录为:/root/bea/logs/
那么,我们可以让8001端口的server日志记录到/root/bea/logs/8001/目录下,8003端口的server记录到/root/bea/logs/8003/目录下,
这样就可以解决日志丢失的问题:代码放到filter中(/*),当第一次请求server时,就会创建相应端口的目录,以后的日志就会记录到该端口目录下
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),
created = true;
} catch (Exception e)
{
e.printStackTrace();
created = false;
}
}