0%

Preface

安全是计算机系统中独立又特别部分。尤其是日常编程任务中业务代码实现较多时,往往不会涉及到安全,导致我们对安全仅有模糊的概念,but why should we care?

安全的重要性不言而喻,尤其是在系统架构层次,当你需要完整的设计一套商用系统时,除了功能实现,性能,高可用等方面的考虑,安全也显得尤为重要。即使是仅实现业务代码,必然会碰到一些场合需要安全相关知识,特别是以SSH,HTTPS为代表的安全技术如此流行的今天,RSA/DSA,SSL/TLS,椭圆曲线,公钥私钥,签名,证书,X509,pem文件,等等等等,一系列的术语名词让人目不暇接,如坠云雾。 零星的关键词搜索带来了更多的术语名词,更多的疑问,使人沮丧。

作者本人对安全入门的挫折深有体会,很久都搞不清楚SSH,HTTPS工作原理;分不清SSL/SSH区别。但是随着前阵子一个安全相关的项目的完结,基本上以程序员视角,建立起安全的big picture,从而弄清楚了对于安全的很多疑问。再一次深感建立big picture的重要性,见^1。因此本篇博客的目的是通过回答一系列的Why,帮助读者建立起安全的框架,知其所以然,是真正理解知识的开始;在big picture建立之后,通过实际操作,编程来体会每一部分,才会在脑中留下知识的深深烙印。这是一劳永逸习得新知识的最佳实践。可是长期来看,最为高效的学习方式。

阅读全文 »

Preface

在linux下,有时我们的进程需要临时提升权限,比如临时在file system中当前用户不具备access之处创建文件,修改记录,应该如何做到呢?linux提供了setuid/setgid机制,我们经常会用到的sudo就是其中的一个例子,接下来让我们看看相关的linux知识,并分析几个实际的例子加深理解。

阅读全文 »

Preface

在Docker的使用过程中,data persist,share一直是比较令人困惑,比如:

  • container内部被改动的文件保存在哪里?
  • container运行结束或者被删除后,如何读取感兴趣的数据?
  • 如何在host及container,container之间共享数据?

本文的目标通过介绍docker相关背景知识(union file system, volume),给出完成常见volume操作的示例,最终达到解答这些问题的目的。

阅读全文 »

Preface

项目需要用golang编写一个ssh client, 实现自定义的authorisation policy,log等。为了模拟目标环境,需要搭建多级跳板机的测试环境,要求host之间可以相互ssh。用vagrant,每个host起一个VM太’重’了,在我的旧T430上,环境启动至少需要10s+的时间。且会占据较多的系统资源;于是萌生了用docker实现轻量级VM的想法,在一番试验之后,实现了采用docker-compose和phusion/baseimage的组合来搭建多host的环境,启动耗时3s左右。

阅读全文 »

Preface

I bet you’ve heard people talking about RPC, gRPC all the time. You may already got questions like: What are they, why we need them in my system? seems like the RESTful API works just fine for us. How I should implement it, hope will not be too complicated.

In this WHAT/WHY/HOW style blog, I am gonna first illustrate some key about RPC/gRPC, and then show how gRPC works by a simple example, hope you enjoy it.

阅读全文 »

Preface

似乎越来越流行Dev To Do everything:编码自不用说,测试,发布,运维恨不得全部由dev team来完成。于是如何发布成为重要问题。在项目的早期还可以直接SSH登录,纯手工或者借助简单脚本半自动完成,但随着功能约来越复杂,发布日趋频繁,测试环境部署,线上扩容,私有化部署等,之前的手工/Shell脚本部署方式会成为系统迭代的瓶颈。 在如何保证数十台,上百台机器同步更新配置,失败检测;部署不同环境prod和testing等,Ansible都有完善的解决方案。在前公司的项目,我们采用Ansible代替之前的手工部署,效果非常好。

本篇是我读完 Ansible Up and Running 一书所做的思维导图总结。看完总结/分享是比单纯看一遍高效的多的学习方式,参见此书这里,而且建立知识的整体框架对掌握知识尤为重要。

阅读全文 »

Preface

搜索,对于很多项目来说非常重要,甚至是核心功能。常见的一种搜索形式是: 输入关键字组合,给出全系统中匹配或相似的1到多条信息(通常称之为1个document)。也称此为full-text search 。

企业FAQ系统,就可以用此思路搭建:用户输入问题,搜索出系统中和用户问题最相似的问题,然后给出已记录的标准答案;相当于计算机”理解“用户的疑问。实现时,既可以手工实现:用分词算法切割用户输入的自然语言,得到关键词数组,用bm25算法,根据词频计算用户问题和系统FAQ问题的相似度,排序之后给出推荐;或者采用开源解决方案,ElasticSearch就是其中被广为采纳的一个。

之前在悉尼找工作时,正好一家media公司给出的编程题便是用Golang搭建文本搜索系统,当时研究了一下ElasticSearch,给出了解决方案;于是就把这个有趣的经历记录下来。

阅读全文 »

Preface

在接触到Golang的某一时刻我们肯定会问自己:Golang是值传递还是引用传递?好吧,Golang其实不像C++那样非此即鄙,要么值传递,要么引用传递。我们一起来看看吧

阅读全文 »

Preface

在微服务的搭建过程中,时常会听到熔断,降级。什么意思呢?以我们家里用的保险丝为例:其实它是一种circuit breaker,当电流超过阈值时,会断路,家电对电力资源的请求无法被满足,以保护电网安全。在微服务的世界里,由于存在非常多的跨服务调用,当某个繁忙的服务因网络或运行出现异常时,会影响依赖其的服务:经常是开始响应变慢,错误率上升;由于调用者一般都有重试机制,发现超时或者出错会重试几次,进一步加剧了已经出问题节点的负担,使之恶化导致完全停止服务;若调用者不限定timeout, 会因为过长的等待时间影响用户体验;更严重的是,其会积压大量用户请求,耗尽内存,很可能因为一个外部不太重要的服务,而造成关键服务停止,进而引发连锁反应,像雪崩一样,整个微服务系统因此崩溃;这个现象也称之为级联失败。

阅读全文 »