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"
Java Client 调 FastDFS在Docker容器中Storage ip映射的问题的更多相关文章
- mac系统上访问docker容器中的ip配置
使用 mac系统,发现docker没有 docker0网桥,无法直接在宿主机上 访问 容器的ip, 在测试的时候有这种需求,而不是通过-p的方式,可以参考下面的连接,主要就是 修改 setting.j ...
- 一个docker容器中运行多个服务还是弄一堆docker容器运行?
不建议直接在单个 Docker 容器中运行多个程序. 以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经 ...
- docker容器中搭建kafka集群环境
Kafka集群管理.状态保存是通过zookeeper实现,所以先要搭建zookeeper集群 zookeeper集群搭建 一.软件环境: zookeeper集群需要超过半数的的node存活才能对外服务 ...
- 在Docker容器中安装jdk和spark
在Docker容器中安装jdk和spark 1.下载jdk和spark 可以使用迅雷等专业下载软件下载jdk和spark软件包,注意是linux版,这里直接给出下载地址: JDK下载地址 JDK进入后 ...
- Docker 容器中相关软件安装
Docker 容器中相关软件安装 1.介绍 我们从docker hub下载的centos镜像是只有很少的命令,需要单独安装我们所需的相关软件. 2.安装软件 安装yum-utils软件包 该软件包是辅 ...
- 【原创】大叔经验分享(71)docker容器中使用jvm工具
java应用中经常需要用到jvm工具来进行一些操作,如果java应用部署在docker容器中,如何使用jvm工具? 首先要看使用的docker镜像, 比如常用的openjdk镜像分为jdk和jre,只 ...
- Docker容器中MySQL最大连接数被限制为214的解决方案
原文:Docker容器中MySQL最大连接数被限制为214的解决方案 一.背景 话说笔者在上次的博客里简单的讲了一下调整MySQL最大连接数的方法.在文章的最后笔者提到了还有一些特殊情况比如说Dock ...
- 如何在Docker容器中使用Arthas
Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...
- Docker容器中运行ASP.NET Core
在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...
- 在 docker 容器中捕获信号
我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过从主机向容器发送信号 ...
随机推荐
- Python生成whl文件
下载源码包,生成whl文件 python setup.py bdist_wheel
- Net6的核心组件之中间件
Net6的核心组件之中间件 What is Middleware? 1.广义上来讲:Tomcat.WebLogic.Redis.IIS:狭义上来讲,ASP.NET Core中的中间件指ASP.NET ...
- DDR内存256M16、512M8含义
256M16,后面的16是代表数据位数,也可以认为是16个bit.一般一个Byte是8个bit.例如256M4的容量为256*16 bit = 4096Mb = 512MB所以 256M16和 512 ...
- 逆向学习物联网-网关ESP8266-04系统联合调试
1.测试平台原理 2.搭建硬件测试平台 3.软件测试平台 1)串口终端 2)串口监视 3)OneNET后台服务 https://open.iot.10086.cn/passport/login/ 户名 ...
- HCIA-ICT实战基础10-广域网技术PPP
HCIA-ICT实战基础-广域网技术PPP 目录 早期广域网技术概述 PPP协议原理与配置 1 早期广域网技术概述 1.1 什么是广域网 广域网是连接不同地区局域网的网络, 通常所覆盖的范围从几十公里 ...
- POJ--2386题C++实现
本题利用深度遍历的穷竭搜索法进行解题,即对每一个元素都对其进行各个方向的深度遍历,穷尽其周围 #include<iostream>#include<cstdio>using n ...
- 【APT】响尾蛇(SideWinder)APT组织样本分析
基础信息 名称:NDC Participants.docx类型:.docMD5:df020e81b7ca32868a8ac1f5eddd086f描述:通过远程模板注入技术加载含有CVE-2017-11 ...
- webpack1.x 打包文件过大优化
1. 图片单独打包 module: { loaders: [ { test: /\.(jpe?g|png|gif|svg)$/, loader: 'url?limit=8192&name=./ ...
- c# WinForm 多次点击这个按钮会弹出多个窗体, 怎么才能只显示一个窗体。解决方案!
第一种解决方法 "单例" <mark> 书上有 private void toolStripLabel1_Click(object sender, EventArgs ...
- Nginx 监听同一端口号配置多个域名
同一台nginx服务器通过配置多个server块实现在同一端口号下监听多个域名. 需要注意的是:端口号(listen)+主机名(server_name) 需要在多个server中唯一,否则会报错. 实 ...