看多了 Go 源代码,看一看应用,尤其是比较短小且有趣的应用代码,感觉很有意思,而且举重若轻。

如果顺带修一下小的错误[1],成为 Contributor,那就更多了一种成就感。就像杨文前几天成为 Go Contributor 那样[2],从小处开始,慢慢提升技术含量,总有一天,慢慢成为真正的 Contributor,像曹大那样[3]

某天欧神和杨文不知道怎么鼓捣出了一个 golang.design[4] 网站,前一阵子欧神又发布了一个 redir[5] 项目。它其实是一个跳转,比如,欧神分享的 Gophercon 2020 的 PPT 链接:https://golang.design/s/gophercon2020,其实最后会跳转到一个 dropbox 的一个文件分享页面。但是用 “/s/gophercon2020” 就会显得非常的优雅和高级。类似的,还有一些欧神做的分享,如 https://golang.design/s/go2generics 等,都会通过 /s/ 跳转到实际的地址去。至于为什么是 /s/ 路径,其实这个项目最初的名字是 short,也就是短网址的意思。

所以,我今天要介绍的就是 redir 的实现原理以及部署。

首先来看一下 redir 的两个核心功能:短网址跳转(/s);处理 go get 请求(/x)。前者很好理解,我访问短网址 https://golang.design/s/go2generics,redir 给我重定向到真实的 google slice 的地址;后者则不那么好理解,它处理的是我们在项目中 import 了一个 golang.design 下面的某个包,例如:import "golang.design/x/verbose",那么 go get 来获取这个包的时候会去 github 上 golang.design 相应目录下找,但这一切并不是自然发生的,需要通过返回的 header 告知 go get 一些信息。

对于比较知名的,如 github,我这样写:import github.com/go-redis/redis/v8go get 就知道去 github 官网去找,但是对于 golang.design 的库那就不知道怎么找了,所以它会尝试访问 https://golang.design/x/pkg/foo?go-get=1 来获取相关信息,于是 /x handler 就在 header 里返回 meta 信息,告诉 go get 去 github 找。

与 go get 交互

当 go get 收到上图的 HTTP 响应,会根据第一个红框的提示去 https://github.com/golang-design/verbose 这里找对应的包;而如果是浏览器过来的请求,则会重定向到 pkg.go.dev 查看包的详细信息。前者实际就是和 go get 交互的协议,具体的可以在这里[6]看到。

有了短网址跳转,自然就想知道访问每个短网址的 uv/pv 情况,如果访问路径 /s 后不接任何字符,那就返回短网址的汇总信息:

uv/pv

了解清楚了功能,我们来看看如何用代码实现。

main 函数会首先会根据传入的命令行参数 *daemon 来决定是开启一个 server,还是执行增加 alias(短链接和长链接对)、更新 alias 的命令。前者持续运行,后者则只执行一次,程序就会结束。

如果是启动一个 server,会首先连接 redis,初始化一个本地的 cache,用于加快响应速度;同时会启动两个异步协程:counting 和 backup,前者用于计数 uv/pv,后者则用于备份 redis 中的数据。

接着会注册 /.info/s/x 三个 handler,/.info 用来看一下程序相关的版本信息(内部会通过 nginx 屏蔽,外部无法访问);/s 用来处理短链接;/x 则用于执行包相关的请求。

/s 的处理逻辑是先从本地 cache 拿和短链相对应的实际链接,如果没有拿到,则从 redis 拿,最后调用 http.Redirect(w, r, url, http.StatusTemporaryRedirect) 重定向到实际链接地址。

最后,启动一个异步协程把访问信息(ip)添加到一个 channel 中去,用于计算 pv/uv。

关于 /s handler 还有一类特殊的请求,即短链接为空,直接访问 https://golang.design/s/,那就会返回所有的短链接并且展示相应的 uv/pv 信息。

完成上述这些,最后开始监听端口,处理请求。

另外一个流程就是根据命令行参数执行 alias 的增删改查,是一次性的行为。

整体的架构图:

架构图

最后我们来看下如何部署到自己的云主机上,我会修改成自己的域名:qcrao.com。当然,redir 还会向 Google Analytics 发送追踪数据,需要将 id 改成自己的。

首先要安装 docker 和 docker-compose,这个就不细说,对着命令敲就好了。

然后编译 redir.app:

make all

启动 redir 和 redis 容器:

make up

添加一个新的 alias:

./redir.app -a ck-s -l https://changkun.de/s/

访问 https://www.qcrao.com/s/,大功告成:

qcrao.com/s/

总体来看,项目的逻辑是比较简单清晰的,但涉及到东西其实也不少,麻雀虽小,五脏俱全。从实现到部署到运维,都需要了解。如果把整个都走通了,还是很有收获的。

在“玩弄” redir 的过程中,修了一下 Makefile 文件,增加了一个 stats 页面的排序,也因此成为 redir 的从 contributor,nice!

参考资料

[1]

错误: https://github.com/golang-design/redir/pull/3

[2]

那样: https://go-review.googlesource.com/c/tools/+/269397

[3]

那样: https://go-review.googlesource.com/c/go/+/263277

[4]

golang.design: https://golang.design/

[5]

redir: https://github.com/golang-design/redir

[6]

这里: https://golang.org/cmd/go/#hdr-Remote_import_paths

喜提 redir contributor相关推荐

  1. 喜提 Go Contributor

    上次写了一篇<喜提 Redir Contributor>,内容是给欧神写的一个短网址小工具加了一个输出结果排序的功能,凑了个热闹.结果有朋友看成了 redis contributor,并没 ...

  2. AI修复100年前晚清影像喜提热搜,这两大算法立功了

    整理 | 夕颜 来源 | CSDN(ID:CSDNnews) 昨天,一条"100 年前北京晚清的影像"喜提热搜,博主用 AI 技术修复了一段 10 多分钟的古董视频,使得 100 ...

  3. “六成应用开发不需要程序员”喜提热搜背后,RPA 会抢饭碗吗?

    整理 | 伍杏玲 出品 | 程序人生(ID:coder_life) 近日,一则"六成应用开发不需要程序员"喜提热搜,据 Gartner 数据显示,到 2024 年,全球约有 65% ...

  4. 漫画 | 如何凭实力炒老板鱿鱼,并喜提N+1~

    金三银四跳槽季,很多小伙伴都在面试,后台偶尔也会有些小伙伴问我一些面试的问题,或者关于离职的一些想法.面试当然就是面试题了,比较枯燥,离职就不一样了,各式各样的都很多. 其中问的最多的就是离职的理由了 ...

  5. java笔试完一般多久给通知_恭喜浙江,喜提浙江中烟招聘通知,一、二批共计招录130人左右...

    首先,在这里恭喜江浙两省喜提烟草招聘通知.小编前两天以为大家都要准备过年了,年前应该没有什么相关国企招聘,谁知,昨天江苏烟草专卖局不声不响出了个175人的招录通知,今天浙江中烟工业也开始呼应. 浙江中 ...

  6. 最便宜的那款特斯拉,刚刚喜提“最安全汽车”称号(然后被打脸)

    昨天,特斯拉官网表示,在NHTSA(美国国家公路交通安全局)新出炉的安全测评中,特斯拉迎来人生春天: Model 3在所有类别和子类项目中均获得五星安全评级,而且在NHTSA测试过的所有汽车中受伤概率 ...

  7. 庆祝喜提13337000编号,我悄悄把老板的Windows命令行设置成了这样

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:致敬某签喜提神秘编号,我把老板的服务器命令行设置成了喜庆的颜色. ...

  8. AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!

    整理 | 夕颜 出品 | CSDN(ID:CSDNnews) 昨天,一条"100 年前北京晚清的影像"喜提热搜,博主用 AI 技术修复了一段 10 多分钟的古董视频,使得 100 ...

  9. 雷军喜提第四家上市公司;梨视频 App 被全网下架;Flutter 1.17 稳定版发布 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦 ...

最新文章

  1. 如何用CSS制作横向菜单?
  2. 3D模型“换皮肤”有多简单?也就一句话的事
  3. c语言中mw shl code,cacoshl - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  4. Common sql statement
  5. Linux文件系统为,浅析Linux文件系统
  6. 案例八:shell自动化管理账本脚本
  7. Silverlight反编译系列二常见代码(自动生成属性CompilerGenerated,代码)
  8. 2008秋季-计算机软件基础-未交实验报告名单
  9. web获取多行mysql结果_mysql中的多行查询结果合并成一个
  10. oracle包如何进入编辑,修改 Oracle 的process和Session
  11. [HNOI2012]三角形覆盖问题
  12. The Double-Checked Locking is Broken Declaration
  13. 纵深防御及MS纵深防御模型
  14. 深度神经网络基本问题的原理详细分析和推导
  15. css样式让样式失效,如何让css样式失效
  16. 数据挖掘比赛笔记总结
  17. Request.GetOwinContext()打不到
  18. 巨杉数据库入选Gartner报告,中国数据库原创力量崛起
  19. IT面试技巧经典问答
  20. 2019牛客暑期多校训练营(第八场) Beauty Values

热门文章

  1. 编程开发涉及的非原生英文名词的读法
  2. 【SpringBoot零基础案例07】【IEDA 2021.1】多环境下.yml/.yaml配置文件的使用
  3. DC/DC变换器的典型拓扑
  4. webclientt和httpwebrequest
  5. Spring Boot 整合 Shiro
  6. 大归因+小归因,先崛网络帮你还原SEM的真实价值
  7. Oracle 创建主键自增表
  8. java的网络工具netty简介
  9. ubuntu下安装zabbix
  10. ASP中文件上传组件ASPUpload介绍和使用方法