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

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"


最新文章

  1. Peter Hessler和他的中国三部曲(上)
  2. 【代码笔记】iOS-先选择城市,然后,跳转Tabbar
  3. Linux三剑客之awk
  4. Howto: Connect MySQL server using C program API under Linux or UNIX
  5. 理解listagg函数
  6. 传奇的通迅协议与base64算法
  7. UITextFiled
  8. Uva592 Island of Logic
  9. Ubuntu中NetBeans C/C++配置、编译
  10. eclipse 下找不到或无法加载主类的解决办法[转]
  11. linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)
  12. Dapper的使用
  13. Roslyn 编译平台概述
  14. java源码学习(二)Integer
  15. MySQL NULL值
  16. 蓝桥杯 剪邮票 全排列+DFS
  17. 第II篇PCI Express体系结构概述
  18. java Socket实现简单在线聊天(二)
  19. RabbitMQ安装笔记
  20. sql注入、csrf

热门文章

  1. Expected space(s) after &quot;default&quot; keyword-spacing
  2. js已知多边形坐标点,求多边形的中心点坐标
  3. 扫二维码 下载app
  4. 用python遍历一个图片文件夹,并输出所有路径到一个 txt 文件
  5. matlab读写文件
  6. web3招聘信息渠道
  7. 解决element-ui表格多重嵌套循环时,添加row-key=&quot;id&quot; 出现Duplicate keys detected: &#39;XXX&#39; 错误的问题
  8. uniapp中使用AntV F6 + table表格插件使用
  9. c++官方网站汇集
  10. CentOS切换gcc