问题描述
- 外网上传文件到fastdfs,调用storage存储文件时,默认调用的是内网配置的storage的IP地址,导致失败。
- 内部网络隔离通过代理端口的方案一样遇到这样的问题。
网上解决方案
网上查了资料,给出的方案:
# 修改tracker.conf
use_storage_id = true
storage_ids_filename = storage_ids.conf
# 修改storage_ids.conf(内网/公网)
100001 group1 内网ip,外网ip
但是试了下还是不行,后来发现可能这个针对的是fastdfs 6的版本。
于是继续寻找新的方案。解决问题就像破案,该方案有时间证人(6版本),需要继续寻找新的_。
另一种解决方案
既然有trackerserver,说明连接storage的ip肯定是从trackerserver获取到的。那么要吗改trackerserver里的ip,要吗改客户端连接的ip?
哈哈,那考虑稳定性和简单性,肯定是后者了,go!
项目fastdfs client客户端用到的是开源的https://github.com/tobato/FastDFS_Client/
通过源码阅读,最底层的socker连接,都是基于该类
com.github.tobato.fastdfs.domain.conn.DefaultConnection
源码改造代码:
public DefaultConnection(InetSocketAddress address, int soTimeout, int connectTimeout, Charset charset) {
try {
socket = new Socket();
socket.setSoTimeout(soTimeout);
LOGGER.debug("connect to {} soTimeout={} connectTimeout={}", address, soTimeout, connectTimeout);
this.charset = charset;
//改造的源码
int port = address.getPort();
String host = address.getAddress().getHostAddress();
if(port!=22122){//trackerserver的socker连接也在这里,排除掉
String use_ip = "x.x.x.x";//实际外网ip或者代理ip
switch(host){
case "x.x.x.1"://fastdfs的内网ip
address = new InetSocketAddress(use_ip,23000);
break;
}
}
socket.connect(address, connectTimeout);
} catch (IOException e) {
throw new FdfsConnectException("can't create connection to" + address, e);
}
}
小技巧
通过项目组里创建相同的包名和类名,来覆盖底层的jar包。