Go 初体验
用 Go 写了第一个线上服务,简单记录一些。
- 直接
net/http
,没有用 Web 框架。之前用过 Beego,强大但过于黑盒,很多细节不理解,其实 Go 已经提供了 web 开发所需要的东西,这个服务只需对外 API,没有页面等,直接net/http
反而更简单。 - 强制代码风格,大爱,包括定义但不使用直接报错,刚开始会有不适应,但是对整体代码质量很有帮助。
database/sql
提供了统一的数据库操作接口,配上不同的 driver 即可。- Golang 的 error handlling 是个特色,但作为 web service 有些繁琐,需要再学习看有没有更为简洁的处理方式。
- 无痛热更新比较麻烦,还没有找到类似 Nginx 的实现。
- 性能上简单的 ab 压测和 ngx_lua 差距不大,开发效率相对高一些,毕竟自带库更丰富。
- gin 可以监控代码变化并自动重新编译,代理方式,不错的开发辅助工具。
Monthly Review 2015-01
- 参加一次线下的 Golang 技术聚会,收获不少。
- 有些业务功能很难 cover 全部情况,要有所取舍,满足最主要的用户需求。敢于放弃。
- Android 项目启动,简单调研了一下,对这个生态系统还是没兴趣,尤其是国内乱七八糟的市场。
- Golang 有了实际线上服务产出。
- 视频时六六已经会自己找爸妈了,真快。
Nginx DNS resolver
nginx 通过 proxy_pass
和 upstream server 通信的时候需要手动指定 resolver。某些时候 DNS 解析失败就会出现这个错误:
domain.com could not be resolved.
可以指定多个 DNS 并重置域名 TTL 延长 nginx 解析缓存来保障解析成功率:
resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s;
如果还有解析错误,可以用 dnsmasq 在本地自建 DNS,顺带还有加速解析的好处:
#/etc/dnsmasq.conf
domain-needed
bogus-priv
cache-size=51200
listen-address=127.0.0.1
#server=223.5.5.5
resolv-file=/etc/resolv.conf
另外需要注意的是 proxy_pass
并不是每次请求都会进行解析,如果 upstream IP 频繁变动,需要强制解析:
# via http://forum.nginx.org/read.php?2,215830,215832#msg-215832
resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;
HoloLens
When you change the way you see the world, you can change the world you see.
命令行 API 调试工具: HTTPie & jq
HTTPie 类似 cURL,更简单易用,jq 用来解析 JSON,一起配合使用做 API 开发调试非常方便:
- GET:
http :9090/api/test
- POST:
http -f post --session=fann :9090/api/login' user=fannheyward passwd=passwd
- GET with cookie:
http --session=fann :9090/api/profile
jq .
- 格式化整个 JSONjq ".status"
- 只显示 status 字段的值jq ". | {name: .name, icon: .icon}"
- 重组 JSON,只显示 name&icon 字段jq ".[] | {name: .name}"
- 遍历 JSON 数组,只显示每个元素的 name 字段
更多高级用法参考各自文档。
[self review:2014]
2014 年度个人总结,先对照去年计划:
工作
产品、管理的转型,提高执行力。
Properly Failed.
技术深度的挖掘。
Failed.
一年一门新语言,Golang.
Just done.
工作
瓶颈
由于个人原因,下半年的工作状态不好,对工作造成了很大影响,很不应该。
工作以业务开发为主,针对具体问题需求会有一些学习,但整体技术进步很有限。结果就是工作兴奋度不够,持续性差,缺乏成就感,工作以外的学习又流于表面,不够深入,一直在尝试打破这种状况,但效果不好,执行力不够是主要原因。
目前这种状况是自己的一个瓶颈期,要尽量解决好个人问题,减少对工作的影响。提高执行力和专注度,以技术为主,多学习多实践,向开发 leader 甚至架构的方向努力。
生活
升级做爸爸。
因为现在没有和六六待在一起,对我们生活有很大影响,主要是情绪上,时不时的状态低落。过了年就要想办法带六六过来,一家人就是要在一起。
在不同阶段会面临不同问题,要敢于面对,可以想的大一些,但不要想太多,不要试图用一个方案去解决所有问题。
2015
工作
- Golang 进入团队技术栈,结合实际项目要有更多学习。
- 分布式开发,要有实际产出。
- 代码质量保证上继续摸索一些适合团队的方案,Unit Test, CI 等。
- leader 去澳洲移民监,要担起开发团队的责任,不光光是自己有代码产出。
生活
- 家。
- 减肥,现在是 88kg,目标 75kg。
Fail
你有你自己的骄傲。
But
有一种落差是,你配不上自己的野心,也辜负了所受的苦难。
Nginx proxy_cache_valid
proxy_cache 可以缓存 upstream 响应,其中 proxy_cache_valid
设置缓存有效时间,需要注意的是 Nginx 检查缓存是否有效的优先级问题。根据文档和 Igor,Nginx 判断缓存有效的顺序是:
X-Accel-Expires
Expires/Cache-Control
proxy_cache_valid
也就是说 Nginx 会优先用 upstream 设置的缓存有效期,这种情况下 Nginx 相当于 Client,如果想忽略缓存直接到 upstream 更新,类似浏览器忽略本地缓存,可以这样设置:
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
另外 proxy_cache_path ... inactive=10m;
不受 upstream 影响,缓存文件在指定时间内没有被再次访问会被清理删除。
参考:
Monthly Review 2014-11
工作:
- 依然是 BDD(Business-driven Development, 业务驱动开发),完成了三个大功能,已上线的基本没有返工,符合自己的标准。
- BDD 往往是结果导向,产品前端的需求不一定会考虑到对后端系统带来的改变和压力。如果需求确定后才发现不可为或代价太大,开发会带着情绪去做,这不是好事。
- 所以开发要尽量早的参与到前期讨论,分析可能会带来的问题,考量开发性价比,对不合理或不清楚的需求能及时反馈,甚至拒绝。
- 需求-开发-上线-监测-分析,往往进行到上线就结束了,这样很难判断这次开发的价值,以后类似的需求还要不要做?
- 开发性价比是最近在思考的一个问题,有没有必要 100% 实时?一个需求要三个系统增加开发值不值得?
生活:
- 保持一个月回一次家的频率,发现同车还有很多这样的人。
- 视频叫六六会抬头瞅着屏幕笑,然后低头看着音箱找人……
- 深圳卫视的《极速前进》真人秀节目很好看,推荐。
- 老婆最近每天加班到八九点,相比之下我真的太懒散了。搞活动买的牛肉吃了两个星期,这么冷的冬天晚上有萝卜炖牛肉真的很幸福。
Vim Tips
这周新学到的两个 Vim tips:
gf
跳转到当前光标所在名字对应的文件(前提是文件存在)。C-w-f
新 buffer 打开C-w-gf
新 tab 打开
gt
跳转到下一个 tab,对应有gT
上一个 tab,{n}gt
编号对应的 tab.