Developer

Docker 微服务教程

Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器……Docker 使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。 这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层。 微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。 上一篇教程介绍了 Docker 的概念和基本用法,本文接着往下介绍,如何在一台计算机上实现多个服务,让它们互相配合,组合出一个应用程序。 我选择的示例软件是 WordPress。它是一个常用软件,全世界用户据说超过几千万。同时它又非常简单,只要两个容器就够了(业务容器 + 数据库容器),很适合教学。而且,这种”业务 + 数据库”的容器架构,具有通用性,许多应用程序都可以复用。 为了加深读者理解,本文采用三种方法,演示如何架设 WordPress 网站。 方法 A:自建 WordPress 容器 方法 B:采用官方的 WordPress 容器 方法 C:采用 Docker Compose 工具 一、预备工作:image 仓库的镜像网址 本教程需要从仓库下载 image 文件,但是国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站。这里推荐使用官方镜像 registry.docker-cn.com。 打开/etc/default/docker文件(需要sudo权限),在文件的底部加上一行。 DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com" 然后,重启 Docker 服务。 $ sudo Read more…

By RSSBot, ago
Developer

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文就来详细解释,帮助大家理解它,还带有简单易懂的实例,教你如何将它用于日常开发。 一、环境配置的难题 软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。 如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:”它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。 环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。 二、虚拟机 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。 虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。 (1)资源占用多 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。 (2)冗余步骤多 虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。 (3)启动慢 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。 三、Linux 容器 由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。 Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。 由于容器是进程级别的,相比虚拟机有很多优势。 (1)启动快 容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。 (2)资源占用少 容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。 Read more…

By RSSBot, ago
Developer

持续集成服务 Travis CI 教程

编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test)。 为了提高软件开发的效率,构建和测试的自动化工具层出不穷。Travis CI 就是这类工具之中,市场份额最大的一个。 本文介绍 Travis CI 的基本用法。用好这个工具不仅可以提高效率,还能使开发流程更可靠和专业化,从而提高软件的价值。而且,它对于开源项目是免费的,不花一分钱,就能帮你做掉很多事情。 一、什么是持续集成? Travis CI 提供的是持续集成服务(Continuous Integration,简称 CI)。它绑定 Github 上面的项目,只要有新的代码,就会自动抓取。然后,提供一个运行环境,执行测试,完成构建,还能部署到服务器。 持续集成指的是只要代码有变更,就自动运行构建和测试,反馈运行结果。确保符合预期以后,再将新代码”集成”到主干。 持续集成的好处在于,每次代码的小幅变更,就能看到运行结果,从而不断累积小的变更,而不是在开发周期结束时,一下子合并一大块代码。 二、使用准备 Travis CI 只支持 Github,不支持其他代码托管服务。这意味着,你必须满足以下条件,才能使用 Travis CI。 拥有 GitHub 帐号 该帐号下面有一个项目 该项目里面有可运行的代码 该项目还包含构建或测试脚本 如果这些条件都没问题,就可以开始使用 Travis CI 了。 首先,访问官方网站 travis-ci.org,点击右上角的个人头像,使用 Github 账户登入 Travis CI。 Travis 会列出 Github 上面你的所有仓库,以及你所属于的组织。此时,选择你需要 Travis 帮你构建的仓库,打开仓库旁边的开关。一旦激活了一个仓库,Travis 会监听这个仓库的所有变化。 三、.travis.yml Travis Read more…

By RSSBot, ago
Developer

Bash 脚本 set 命令教程

服务器的开发和管理离不开 Bash 脚本,掌握它需要学习大量的细节。 set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本文介绍它的基本用法,让你可以更安心地使用 Bash 脚本。 一、简介 我们知道,Bash 执行脚本的时候,会创建一个新的 Shell。 $ bash script.sh 上面代码中,script.sh是在一个新的 Shell 里面执行。这个 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。 set命令用来修改 Shell 环境的运行参数,也就是可以定制环境。一共有十几个参数可以定制,官方手册有完整清单,本文介绍其中最常用的四个。 顺便提一下,如果命令行下不带任何参数,直接运行set,会显示所有的环境变量和 Shell 函数。 $ set 二、set -u 执行脚本的时候,如果遇到不存在的变量,Bash 默认忽略它。 #!/usr/bin/env bash echo $a echo bar 上面代码中,$a是一个不存在的变量。执行结果如下。 $ bash script.sh bar 可以看到,echo $a输出了一个空行,Bash 忽略了不存在的$a,然后继续执行echo bar。大多数情况下,这不是开发者想要的行为,遇到变量不存在,脚本应该报错,而不是一声不响地往下执行。 set -u就用来改变这种行为。脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。 Read more…

By RSSBot, ago
Developer

双因素认证(2FA)教程

所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 越来越多的地方,要求启用双因素认证(Two-factor authentication,简称 2FA)。本文介绍它的概念和实现方法。 文章结尾有一则活动消息,优达学城(Udacity)的”双十一优惠”,课程最高减免1111元。 一、双因素认证的概念 一般来说,三种不同类型的证据,可以证明一个人的身份。 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。 个人物品:该用户的私人物品,比如身份证、钥匙。 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。 这些证据就称为三种”因素”(factor)。因素越多,证明力就越强,身份就越可靠。 双因素认证就是指,通过认证同时需要两个因素的证据。 银行卡就是最常见的双因素认证。用户必须同时提供银行卡和密码,才能取到现金。 二、双因素认证方案 常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行。 但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。 国内的很多网站要求,用户输入密码时,还要提供短消息发送的验证码,以证明用户确实拥有该手机。 但是,短消息是不安全的,容易被拦截和伪造,SIM 卡也可以克隆。已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。 因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。 三、TOTP 的概念 TOTP 的全称是”基于时间的一次性密码”(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。 它的步骤如下。 第一步,用户开启双因素认证后,服务器生成一个密钥。 第二步:服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。 注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥。 第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希,有效期默认为30秒。用户在有效期内,把这个哈希提交给服务器。 第四步,服务器也使用密钥和当前时间戳,生成一个哈希,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。 五、TOTP 的算法 仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢? Read more…

By RSSBot, ago
Developer

CSS 框架 Bulma 教程

网页样式需要大量时间开发,最省事的方法就是使用 CSS 框架。 Bootstrap 是最著名的 CSS 框架,但是今天我想推荐另一个更轻量化、更易用的框架—-Bulma。有了它,即使完全不懂 CSS,也可以轻而易举做出美观的网页。 我要感谢 100offer 对我提供赞助。100offer 是国内第一流的人力资源网站,本文结尾有他们的简介,最近想换工作的朋友可以看一下。 一、简介 Bulma 框架最大的特点,就是简单好用。所有样式都基于class,只需为 HTML 元素指定class,样式立刻生效。 Login 上面代码中,a 元素只需加上几个class,就会出现一个主色调(is-primary)的大(is-large)按钮。 Bulma 是一个手机优先的框架,提供五个宽度断点,具有良好的自适应特性,可以随心所欲为不同设备设置不同样式。 mobile:小于等于768px tablet:大于等于769px desktop:大于等于1024px widescreen:大于等于1216px fullhd:大于等于1408px 它提供二十多种常用组件,比如表单 、表格、图标、面包屑、菜单、导航、Modal 窗口等等。简单的网站,可以不用写任何 CSS 代码。 二、基本用法 Bulma 的安装只需一步,把样式表插入网页即可。 使用更简单,就是为 HTML 元素加上class。 Button 上面的代码为 a 元素加上button类,这个链接就会被渲染成按钮。 Bulma 提供大量的修饰类,用来改变基类的样式。它们都是以is-或has-开头。比如,要改变 Button 的大小,就可以使用下面的修饰类。 Small Normal Medium Large Read more…

By RSSBot, ago
Developer

开源许可证教程

作为一个开发者,如果你打算开源自己的代码,千万不要忘记,选择一种开源许可证(license)。 许多开发者对开源许可证了解很少,不清楚有哪些许可证,应该怎么选择。本文介绍开源许可证的基本知识,主要参考了 OpenSource.com (1,2)。 一、什么是开源许可证 开源许可证是一种法律许可。通过它,版权拥有人明确允许,用户可以免费地使用、修改、共享版权软件。 版权法默认禁止共享,也就是说,没有许可证的软件,就等同于保留版权,虽然开源了,用户只能看看源码,不能用,一用就会侵犯版权。所以软件开源的话,必须明确地授予用户开源许可证。 二、开源许可证的种类 目前,国际公认的开源许可证共有80多种。它们的共同特征是,都允许用户免费地使用、修改、共享源码,但是都有各自的使用条件。 如果一种开源许可证没有任何使用条件,连保留作者信息都不需要,那么就等同于放弃版权了。这时,软件可以直接声明进入”公共领域”(public domain)。 根据使用条件的不同,开源许可证分成两大类。 宽松式(permissive)许可证 Copyleft 许可证 三、宽松式许可证 3.1 特点 宽松式许可证(permissive license)是最基本的类型,对用户几乎没有限制。用户可以修改代码后闭源。 它有三个基本特点。 (1)没有使用限制 用户可以使用代码,做任何想做的事情。 (2)没有担保 不保证代码质量,用户自担风险。 (3)披露要求(notice requirement) 用户必须披露原始作者。 3.2 常见许可证 常见的宽松式许可证有四种。它们都允许用户任意使用代码,区别在于要求用户遵守的条件不同。 (1)BSD(二条款版) 分发软件时,必须保留原始的许可证声明。 (2) BSD(三条款版) 分发软件时,必须保留原始的许可证声明。不得使用原始作者的名字为软件促销。 (3)MIT 分发软件时,必须保留原始的许可证声明,与 BSD(二条款版)基本一致。 (4)Apache 2 分发软件时,必须保留原始的许可证声明。凡是修改过的文件,必须向用户说明该文件修改过;没有修改过的文件,必须保持许可证不变。 四、Copyleft 许可证 4.1 Copyleft 的含义 Copyleft 是理查德·斯托曼发明的一个词,作为 Copyright Read more…

By RSSBot, ago
Developer

如何读懂火焰图?

软件的性能分析,往往需要查看 CPU 耗时,了解瓶颈在哪里。 火焰图(flame graph)是性能分析的利器。本文介绍它的基本用法。 一、perf 命令 让我们从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。 通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。 $ sudo perf record -F 99 -p 13204 -g -- sleep 30 上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒。 运行后会产生一个庞大的文本文件。如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。 为了便于阅读,perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列。 $ sudo perf report -n --stdio 这个结果还是不易读,所以才有了火焰图。 二、火焰图的含义 Read more…

By RSSBot, ago
Developer

如何使用 Issue 管理软件项目?

软件开发(尤其是商业软件)离不开项目管理,Issue 是最通用的管理工具之一。 本文介绍 Issue 的基本用法。 一、Issue 是什么? Issue 指的是一项待完成的工作,通常与系统的改进相关,中文可以译为”问题”或”事务”。下面这些都是 Issue 的例子。 一个软件的 bug 一项功能建议 一项待完成的任务 文档缺失的报告 每个 Issue 应该包含该问题的所有信息和历史,使得后来的人只看这个 Issue,就能了解问题的所有方面和过程。 历史上,Issue 起源于客服部门。用户打电话反映问题,客服就创建一个工单(ticket),后续的每一个处理步骤、每一次与用户的交流,都要更新工单,记录全部信息。这就是 Issue 的前身。 因此,Issue 的原始功能是问题追踪和工单管理,后来不断扩展,逐渐演变成全功能的项目管理工具,还可以用于制定和实施软件的开发计划。 除了软件,其他项目也可以使用 Issue,比如有人把自己住宅的改善计划都做成了 Issue。 二、Issue 跟踪管理系统 专门管理 Issue 的软件,叫做 Issue 跟踪管理系统(Issue tracking system)。它面向所有人,普通用户也可以使用。 还有一种 Bug 跟踪管理系统,通常只面向开发者,比如下图的 Bugzilla。它和 Issue 系统可以同时使用,但是也可以被 Issue 系统取代。 一般来说,Issue 跟踪管理系统应该具有以下功能。 项目管理   - Read more…

By RSSBot, ago
Developer

全文搜索引擎 Elasticsearch 入门教程

全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 本文从零开始,讲解如何使用 Elastic 搭建自己的全文搜索引擎。每一步都有详细的说明,大家跟着做就能学会。 一、安装 Elastic 需要 Java 8 环境。如果你的机器还没安装 Java,可以参考这篇文章,注意要保证环境变量JAVA_HOME正确设置。 安装完 Java,就可以跟着官方文档安装 Elastic。直接下载压缩包比较简单。 $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip $ unzip elasticsearch-5.5.1.zip $ cd elasticsearch-5.5.1/ 接着,进入解压后的目录,运行下面的命令,启动 Elastic。 $ ./bin/elasticsearch 如果这时报错“max virtual memory areas vm.maxmapcount [65530] is Read more…

By RSSBot, ago