Java Client 调 FastDFS在Docker容器中Storage ip映射的问题

首先在写这篇文章之前,百度了不少资料基本上都是

1.iptables

2.用--net=host主机网络

3.替换java fast-client.jar自己做mapping映射。

方法一:iptables麻烦,应该是要在调用者那台机器通过防火墙转发到真实机器,维护起来容易让后面的人掉坑里。

方法二:没有尝试因为host主机网络的话,镜像内部的一些端口会和主机冲突,不得不做一些处理甚至要改镜像内部端口更麻烦,因为我的镜像除了fastdfs的端口还有内置的一个nginx

方法三:替换jar似乎可以行得通,自己在代码里面搞定了,但是工具包不好升级,你这个Client包相当于定制的,其它地方不一定找得到。

最后翻看了一下源码,我的版本是:

<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</exclusion>
</exclusions>
</dependency>

获取Storage节点信息的类在DefaultTrackerClient,默认是@Service注入到Spring容器中,其它地方是通过@Autowired注入的,因此我自己写了一个类继承DefaultTrackerClient,
用@Primary顶替掉默认的,然后再关键部位实现自定义的IP映射,思路是这样,测试了一下上传下载都没有问题。

@Primary
@Service
public class AeyeTrackerClient  extends DefaultTrackerClient implements TrackerClient {

    @Autowired
    private TrackerConnectionManager trackerConnectionManager;

    @Autowired
    private AeyeTrackerConfig aeyeTrackerConfig;

    /**
     * 获取存储节点
     */
    @Override
    public StorageNode getStoreStorage() {
        TrackerGetStoreStorageCommand command = new TrackerGetStoreStorageCommand();
        StorageNode node = trackerConnectionManager.executeFdfsTrackerCmd(command);
        mappingIp(node);
        return node;
    }

    /**
     * 按组获取存储节点
     */
    @Override
    public StorageNode getStoreStorage(String groupName) {
        TrackerGetStoreStorageCommand command;
        if (StringUtils.isBlank(groupName)) {
            command = new TrackerGetStoreStorageCommand();
        } else {
            command = new TrackerGetStoreStorageCommand(groupName);
        }
        StorageNode node = trackerConnectionManager.executeFdfsTrackerCmd(command);
        mappingIp(node);
        return node;
    }

    @Override
    public StorageNodeInfo getFetchStorage(String groupName, String filename) {
        TrackerGetFetchStorageCommand command = new TrackerGetFetchStorageCommand(groupName, filename, false);
        StorageNodeInfo nodeInfo = trackerConnectionManager.executeFdfsTrackerCmd(command);
        String mappingIp = aeyeTrackerConfig.getStorageIpMapping().get(nodeInfo.getIp()+":"+nodeInfo.getPort());
        if(AeyeStringUtils.isNotBlank(mappingIp)){
            nodeInfo.setIp(mappingIp.split(":")[0]);
            nodeInfo.setPort(Integer.parseInt(mappingIp.split(":")[1]));
        }
        return nodeInfo;
    }

    private void mappingIp(StorageNode node){
        String mappingIp = aeyeTrackerConfig.getStorageIpMapping().get(node.getIp()+":"+node.getPort());
        if(AeyeStringUtils.isNotBlank(mappingIp)){
            node.setIp(mappingIp.split(":")[0]);
            node.setPort(Integer.parseInt(mappingIp.split(":")[1]));
        }
    }
@Data
@Component
@ConfigurationProperties(prefix = FdfsClientConstants.ROOT_CONFIG_PREFIX)
public class AeyeTrackerConfig{


    /**
     * storage地址映射列表
     */
    private Map<String, String> storageIpMapping = new HashMap<>(16);

}

yml增加配置项

fdfs:
  storage-ip-mapping:
    "[172.19.0.1:23000]": "192.168.x.xxx:23001"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于使用 Docker Desktop 在 FastDFS 上传文件,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了 Docker Desktop 并成功运行。 2. 下载 FastDFSDocker 镜像。您可以在 Docker Hub 上搜索 `fastdfs`,选择一个可靠的镜像进行下载。例如,可以使用以下命令下载 fastdfs 的镜像: ``` docker pull delron/fastdfs ``` 3. 创建一个 Docker 网络,以便 FastDFS 容器可以与其他容器进行通信。运行以下命令创建网络: ``` docker network create fastdfs-net ``` 4. 启动 FastDFS 容器。运行以下命令创建 FastDFS 容器,并将其连接到刚刚创建的网络: ``` docker run -d --name tracker --network=fastdfs-net delron/fastdfs tracker docker run -d --name storage --network=fastdfs-net -e TRACKER_SERVER=tracker:22122 delron/fastdfs storage ``` 这将启动一个 Tracker 节点和一个 Storage 节点。 5. 现在,您可以使用 FastDFS 客户端工具上传文件。您可以使用 `docker exec` 命令进入 Storage 容器,并在容器执行 `fdfs_upload_file` 命令来上传文件。以下是一个示例命令: ``` docker exec -it storage fdfs_upload_file /etc/fdfs/client.conf /path/to/local/file ``` 这将使用 `/etc/fdfs/client.conf` 配置文件和本地文件路径 `/path/to/local/file` 来上传文件。 6. 上传成功后,您可以使用 FastDFS 客户端工具的其他命令来管理文件,例如 `fdfs_delete_file`、`fdfs_download_file` 等。 请注意,这只是一个简单的示例,您可能需要根据您的实际情况进行适当的整。此外,确保您已经阅读并理解了 FastDFS 的文档,以便更好地使用它。祝您操作顺利!如果您有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大麦牛奶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值