问题缘由
对于集群部署的项目,若某个节点挂了,对于固定url,存在无法实现动态展示项目信息问题。
处理思路
1. project-web.xml:配置集群ip:port分隔符隔开
<entry key="cluster.server">*.*.*.*:*,*.*.*.*:*,*.*.*.*:*</entry>
2. 工具类:UrlUtil.java 连通性判断
public class UrlUtil {
/**
* logger
*/
private static Logger logger = LoggerFactory.getLogger(UrlUtil.class);
/**
* 判断ip port是否可连接
* @param host
* @param port
* @return boolean
*/
public static boolean isUseable(String host, int port) {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(host, port));
} catch (IOException e) {
logger.error("{}:{} 不通!",host,port);
return false;
} finally {
try {
socket.close();
} catch (IOException e) {
logger.error("{}:{} socket关闭失败!",host,port);
}
}
return true;
}
public static String getUrl(String url) {
if (StringUtils.isBlank(url)) {
return url;
}
String[] servers = url.split(",");
for (String server : servers) {
if (isUseable(server.split(":")[0],Integer.valueOf(server.split(":")[1]))) {
return "http://"+server;
}
}
//没有可用的获取第一个节点
return "http://"+servers[0];
}
3. 配置系统参数:applicationContext.xml 载入project-web.xml,并获取参数映射
<bean id="sysParamManager" class="com.package.path.SysParamManager">
<property name="clusterServer" value="${cluster.server}"></property>
</bean>s
4. 系统参数类:SysParamManager.java
public class SysParamManager {
/**
* cluster 地址
*/
private String clusterServer;
public String getClusterServer() {
return UrlUtil.getUrl(clusterServer);
}
public void setClusterServer(String clusterServer) {
this.clusterServer = clusterServer;
}
}
5. 动态加载url:Controller.java
@Controller
public class Controller {
@RequestMapping("/newUrl.do")
public void redirectNewUrl(HttpServletResponse resp) throws IOException {
resp.sendRedirect(SysParamManager.getClusterServer()+"/newUrl");
}
}