写点什么

几行代码,网站图片访问速度 100ms 飙升到 20ms!

作者:沉默王二
  • 2022 年 5 月 06 日
  • 本文字数:2556 字

    阅读完需:约 8 分钟

大家好,我是二哥!


很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。



但由于白嫖(GitHub 图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。


直到某一天,我神秘的流量用光了,上不去了谷歌,访问不了 X 网,我才发现,原来我的网站加载图片这样慢啊!!!!经常是一蹦一蹦出来的,肉眼(带近视镜)可见的慢。



事没到自己头上,显然高高挂起,可一旦事搁到自己头上,就受不了了呀!


于是我打开站长工具检测了一下图片的访问速度,好家伙,我直接好家伙!国内的访问速度能飙到 100ms,国外的确实快,只有 14.7ms,



要知道,网站面对的用户群体大多数都是国内的小伙伴,这速度,真的是劝退用户!


再加上我今天看到小林把自己的网站也升级了自己的图床,所以我就也按捺不住了。


怎么办?


不可能一个个手动替换啊,《Java 程序员进阶之路》上少说也有 200 篇文章,一篇文章平均 5 张图片的话,也得 1000 张吧,全部替换下来还不得疯!


由于我本地已经分门别类的保存了所有的图片,就只剩下:


  • 第一步,把图片上传到某云厂商

  • 第二步,批量替换所有文章中的图片链接为新图床的地址


替换链接的思路也比较简单,就是读取所有 md 文件,找到其中的图片地址,按照下图的方式替换即可。



第一步,上传图库到云厂商


直接选择扫描文件夹就可以把所有的图片上传到新的图床里。




PS:这里有个坑,不知道有眼尖的小伙伴看出来了没?


第二步,开启 CDN


只使用 OSS 的话,除了流量计费比较高一点外,就是图片没有进行加速服务,所以我就顺带开启了 CDN 服务。开启方法非常简单,只需要将域名回源到 OSS 就可以了。



第三步,编写 Java 代码批量转链


@Slf4jpublic 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); } }); } } }}
复制代码


思路非常简单,也没有多少行代码:


  • 通过 hutool 的 FileUtil.loopFiles() 方法递归遍历目录以及子目录中的所有文件;

  • 通过 Executors.newCachedThreadPool() 创建一个缓存线程池,由于最多 1087 个文件,所以不用担心线程池资源耗尽;也就不用严格按照阿里手册上强制要求的不能使用 Executors 创建线程池,因地制宜;

  • 循环遍历所有文件,通过 FileNameUtil.isType() 过滤掉不是 md 的文件;

  • 通过 FileReader 读取文件内容,并通过 String 类的 replaceAll() 方法替换原有的图片链接;

  • 通过 FileWriter 重新写入文件;


来看一下执行日志:


17:29:30.547 [main] INFO top.image.ConvertAllFileWithPool - 总文件数1087。。。17:29:30.649 [main] INFO top.image.ConvertAllFileWithPool - MD 文件flow-control.md17: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 了。



好了,今天是五一劳动节后第一天上班(昨天全员核酸),大早上起来我就在星球里制定了五月份的学习计划,不少球友都响应了,也制订了自己的学习计划。



药卷一起卷(狗头)




强烈推荐一波 GitHub 上星标 2k+ star 的开源专栏《Java 程序员进阶之路》,据说每一个优秀的 Java 程序员都喜欢她,风趣幽默、通俗易懂。内容包括 Java 基础、Java 并发编程、Java 虚拟机、Java 企业级开发、Java 面试等核心知识点。学 Java,就认准 Java 程序员进阶之路😄。


https://github.com/itwanger/toBeBetterJavaer


star 了这个仓库就等于你拥有了成为了一名优秀 Java 工程师的潜力。


没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟



发布于: 2022 年 05 月 06 日阅读数: 50
用户头像

沉默王二

关注

《Web全栈开发进阶之路》作者 2018.07.31 加入

一枚沉默但有趣的程序员

评论

发布
暂无评论
几行代码,网站图片访问速度 100ms 飙升到 20ms!_沉默王二_InfoQ写作社区