源码改造-FastDFS内网/公网ip不一致问题的另一种解决方案

问题描述
  1. 外网上传文件到fastdfs,调用storage存储文件时,默认调用的是内网配置的storage的IP地址,导致失败。
  2. 内部网络隔离通过代理端口的方案一样遇到这样的问题。

网上解决方案

网上查了资料,给出的方案:

# 修改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包。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余很多之很多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值