代码级干货 | 如何利用Docker与Rails API gem构建微服务

今天小数给你们带来的是一篇代码级干货文章,与你们分享一些利用Rails API以微服务形式设置应用的经验与心得。mysql

为什么选择Docker加Rails API?

在我效力的企业中,咱们一直在利用Docker为所有工程师构建开发环境。在这种状况下,新人加入后可以快速拥有与之对应的容器工做环境。与大多数长久使用总体应用的企业同样,咱们一样但愿充分发挥微服务架构带来的松散耦合、高紧凑性与独立部署等固有优点。web

我曾经利用Rails做为API构建过几款应用——坦率地讲,这种做法有点矫枉过正,由于咱们其实不必使用其中的所有视图逻辑与额外中间件。Rails API gem集成于Rails 5版本当中,此版本目前处于beta测试阶段。我曾经打算利用Docker完成上述工做,但却在设置过程当中遇到了困难,因此在今天的文章中,我将利用Rails 4完成设置并将rails-api gem做为关联性添加至Gemfile当中。sql

你们可能会问,为何要将Rails API做为微服务架构中的技术堆栈。我认为具体答案取决于技术团队的实际专长方向。互联网上曾经就要不要投身微服务以及应该具体使用哪些技术产生过激烈的争论。能够看到,不少朋友利用Node.js、Go、Scala或者Java等其它卓越技术完成了任务。我曾经拿出过一段时间体验这些方案,也认同它们的出色表现,但我所的在团队更熟悉Rails。所以出于快速开发的考量,咱们作出了这样的决定。若是非要再选一种潜在方案,我我的更倾向于Node.js,由于咱们的不少新应用都以其为基础构建而成。在我看来,这一转型项目的最终目标在于确保每项服务都拥有小巧的体积,从而可以在必要时实现轻松重写。docker

从Docker起步

设置工做

今天的教程面向Mac用户,但你们也能够在Linux发行版或者Windows平台上实现相似的操做。首先在终端中为项目建立一个目录。我将把项目命名为“inventory manager”,但你们也能够随意选择本身喜欢的名称。数据库

图片描述

接下来在项目root目录下建立几个文件。api

图片描述

设置 Dockerfile

Dockerfile负责容纳咱们Docker容器环境的所有设置。
图片描述服务器

那么咱们该在文件中添加怎样的内容?在这里咱们利用Ruby的最新版本(2.3.0)建立一套镜像,然后在该容器上运行apt软件包管理命令。咱们将利用MySQL客户端库进行开发。此后,咱们将把本地Gemfile与Gemfile.lock添加至容器的文件系统当中,再安装其关联性。最后,咱们将项目目录内的所有内容添加至容器内。架构

设置 docker-compose.yml

咱们须要设置docker-compose.yml文件,从而确保Docker Compose工具可以对Rails API应用及咱们的MySQL容器间的通讯进行编排。微服务

图片描述

这套配置创建起一套mysql容器,外加一套由Dockerfile构建而成的名为web的容器,后者在端口9292上运行Puma webserver。接下来,咱们能够将这一Rails应用容器链接至mysql容器,从而保证两者可以彼此通讯。工具

设置 Gemfile

在Gemfile当中,咱们将添加Rails gem、Rails API gem、mysql客户端适配器、Puma webserver以及Active Model Serializers(用于JSON格式的响应信息)。

图片描述

建立Docker镜像

如今进行Docker镜像的建立。

图片描述
图片描述
运行Docker build命令,从而利用Dockerfile构建镜像并安装gem。
图片描述
Docker镜像已经成功建立完成

一旦Gemfile或者Dockerfile内容出现变动,你们将须要再次运行这条命令以重构Docker镜像。你们能够利用如下命令查看已经建立的镜像:

图片描述
图片描述

建立Rails API应用结构

接下来,咱们在Docker镜像中运行Rails API命令以建立应用结构。在咱们的 docker-compose.yml文件内,将“web”做为命令执行的目标容器。
图片描述
建立Rails API应用结构

设置数据库

如今须要对database.yml文件进行设置,完成后便可进行数据迁移。

图片描述

主机为“db”,咱们已经在docker-compose.yml file文件中定义了该名称。这一主机值必须与咱们在docker-compose.yml文件中定义的数据库容器保持一致。

测试Web应用的运行状况

如今应用结构已经构建完成,下面运行Web服务器以检查可以正常查看Rails状态页面。

图片描述
图片描述
在各自容器中运行数据库与Web应用,然后运行Puma server以监听端口9292

图片描述

个人docker-machine ip运行在端口192.168.59.100上。你们应确保运行docker-machine ip以找到正确的docker ip(本示例直接使用docker ip做为别名)。

图片描述

下一步

如今咱们的应用已经开始正常运行,以此为基础你们能够随意建立数据模型以及控制器等等。

咱们能够经过这种方式建立更多微服务,并确保不一样应用之间利用JSON经过http经由同一Docker主机的不一样web服务器端口实现彼此通讯。咱们也可使用消息收发机制实现不一样服务间的通讯,例如RabbitMQ。

原文做者:Charles Wang

相关文章
相关标签/搜索