二哥的编程知识星球正式开放了,这是一个Java学习指南+编程实战的学习宝地,可以帮助你提高编程能力、养成好的学习习惯、找到志同道合的学习伙伴、拿到更好的 Offer。详情戳链接《Java程序员进阶之路》!
大家好,我是二哥!
很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。
但由于白嫖(GitHub图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。
直到某一天,我神秘的流量用光了,上不去了谷歌,访问不了 X 网,我才发现,原来我的网站加载图片这样慢啊!!!!经常是一蹦一蹦出来的,肉眼(带近视镜)可见的慢。
事没到自己头上,显然高高挂起,可一旦事搁到自己头上,就受不了了呀!
于是我打开站长工具检测了一下图片的访问速度,好家伙,我直接好家伙!国内的访问速度能飙到 100ms,国外的确实快,只有 14.7ms,
要知道,网站面对的用户群体大多数都是国内的小伙伴,这速度,真的是劝退用户!
再加上我今天看到小林把自己的网站也升级了自己的图床,所以我就也按捺不住了。
怎么办?
不可能一个个手动替换啊,《Java 程序员进阶之路》上少说也有 200 篇文章,一篇文章平均 5 张图片的话,也得 1000 张吧,全部替换下来还不得疯!
由于我本地已经分门别类的保存了所有的图片,就只剩下:
替换链接的思路也比较简单,就是读取所有 md 文件,找到其中的图片地址,按照下图的方式替换即可。
第一步,上传图库到云厂商
直接选择扫描文件夹就可以把所有的图片上传到新的图床里。
PS:这里有个坑,不知道有眼尖的小伙伴看出来了没?
第二步,开启 CDN
只使用 OSS 的话,除了流量计费比较高一点外,就是图片没有进行加速服务,所以我就顺带开启了 CDN 服务。开启方法非常简单,只需要将域名回源到 OSS 就可以了。
第三步,编写 Java 代码批量转链
@Slf4j
public class ConvertAllFileWithPool {
public static final String img_url_pre_before = "https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/";
private final static String img_url_pre_after = "http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/images/";
private final static String docPath = "/Users/maweiqing/Documents/GitHub/toBeBetterJavaer/docs/";
public static void main(String[] args) throws IOException {
// 递归遍历目录以及子目录中的所有文件
List<File> files = FileUtil.loopFiles(docPath);
log.info("总文件数{}",files.size());
ExecutorService executorService = Executors.newCachedThreadPool();
for (File file: files) {
if (FileNameUtil.isType(file.getName(), "md")) {
log.info("MD 文件{}", file.getName());
executorService.submit(() -> {
FileReader fileReader = FileReader.create(file, Charset.forName("utf-8"));
String result = fileReader.readString().replaceAll(img_url_pre_before,img_url_pre_after);
log.info("转换完毕");
try {
FileWriter writer = new FileWriter(file);
writer.write(result);
writer.flush();
} catch (IOException e) {
log.error("写入文件出错了{}", e);
}
});
}
}
}
}
思路非常简单,也没有多少行代码:
FileUtil.loopFiles()
方法递归遍历目录以及子目录中的所有文件;Executors.newCachedThreadPool()
创建一个缓存线程池,由于最多 1087 个文件,所以不用担心线程池资源耗尽;也就不用严格按照阿里手册上强制要求的不能使用 Executors 创建线程池,因地制宜;FileNameUtil.isType()
过滤掉不是 md 的文件;replaceAll()
方法替换原有的图片链接;来看一下执行日志:
17:29:30.547 [main] INFO top.image.ConvertAllFileWithPool - 总文件数1087
。。。
17:29:30.649 [main] INFO top.image.ConvertAllFileWithPool - MD 文件flow-control.md
17:29:30.649 [pool-1-thread-12] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-4] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-8] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-5] INFO top.image.ConvertAllFileWithPool - 转换完毕
基本上不到一秒钟就完成了,因为有 GitHub 作为版本仓库,所以我们可以放心大胆地执行,不用担心出错,大不了重来就是了。
大概检查几个文件后,发现 OK,就可以把修改后的文件提交到版本库了。
重新部署网站后,打开站长工具重新测试了一下图片的访问速度,这次就快多了,国内基本上都是在 20ms 左右,这比原来的 100ms 快了五分之四啊!
早知道这样子,我就早切换链接了!
小插曲
本地图片上传 OSS 的时候一点没注意,多了一个 images 的目录,就导致我构建网站后,发现图片全部挂了!
人慌了好一阵子,OSS 也没提供移动资源的功能,索性就只能在 md 文件中多加了一个 images 目录,这下只能将错就错了。
充了 100 块钱,不知道能用多久,OSS+CDN,链接中没敢用 HTTPS,因为 HTTPS 也收费,就先用 HTTP 了。
好了,今天是五一劳动节,大早上起来我就在星球里制定了五月份的学习计划,不少球友都响应了,也制订了自己的学习计划。
药卷一起卷(狗头)
没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。