如何在Ruby中编写微服务?

  • 时间:
  • 浏览:4

什么都有 一个线程才能 只一个多类。什么都有 大伙儿 需要建起一个多项目形态学 –你这些 对于Rails开发人员来说是比较陌生的,什么都有 通常大伙儿 只需要运行rails new,什么都有 所有的东西都设置好了。在此处我就 多扩展一下。大伙儿 的项目树完成以前差不多是原本的:

在部署微服务(什么都有 ,总体来说,部署任何应用线程)时,要注意有些事项,包括:

以上给出了基本的项目形态学 ,此外需要做哪些地方呢?呃,还有个困难的次要:部署。

你这些 例子非常适合使用微服务,什么都有 它很小,什么都有 只关注某个功能点,接口也定义得很清晰。什么都有 ,当大伙儿 在工作中决定要重写邮件基础形态学 时,大伙儿 就会原本做。

什么都有 你让它继续运行,什么都有 在原本终端窗口中运行大伙儿 上面的编队脚本,就会得到下面的结果:

大伙儿 需要明确从哪个队列读收回息(即“mails”),以及consume消息的work法律法律依据,大伙儿 先解析消息(以前大伙儿 什么都有 说过用JSON格式–什么都有 再说明一次,我就选着任何格式,RabbitMQ什么都有 sneakers何必 关心格式大大问题 )。接着大伙儿 把消息散列传给有些组织组织结构的实际工作的类。最后,大伙儿 需要通知系统消息已收到,什么都有 RabbitMQ就会把消息重新放回队列中。什么都有 你想拒绝某条消息,什么都有 做别的操作,snearkers的wiki中有 法律法律依据。为了掌握具体情况,大伙儿 还在上面加入了日志功能(稍后大伙儿 会解释为哪些地方日志为标准输出)。

原文地址:https://dzone.com/articles/writing-a-microservice-in-ruby

(这里也是复杂化版本!)

想象一下你这些 场景:大伙儿 需要编写一个多微服务,其职责是发邮件。它收到的信息如下:

它的任务是替换掉模板中的有些变量,什么都有 把发票邮件发送至user@example.com。(大伙儿 用mandrill作为邮件API的供应商,令人忧伤的是,mandrill即将要停止服务了。)

这里的信息量相当大,有点是现在现在开始的次要,当然,此后我就根据需要去掉 次要日志。

bunny是RabbitMQ的标准gem,当大伙儿 不传任何项给Bunny.new时,它会假设RabbitMQ有标准的证书,是在localhost:5672上运行的。什么都有 大伙儿 (经过一系列设置)连接到一个多名为“mails”的消息队列。什么都有 你这些 队列还不存在,系统会创建你这些 队列;什么都有 已存在,系统会直接连接。接着大伙儿 才能 直接对你这些 队列发布任何消息(类式于,大伙儿 上面的发票消息)。在这里大伙儿 使用JSON,但事实上,我就使用任何你喜欢的格式(BSON、Protocol Buffers,什么都有 随便啥),RabbitMQ何必 关心。

什么都有 大伙儿 一个多微服务,大伙儿 需要找到一个多法律法律依据,向它发送有些信息。也什么都有 传递消息队列的法律法律依据。有许有些多可选的消息系统,我就随便选着一个多有些人喜欢的。大伙儿 这里选着的是RabbitMQ,什么都有 :

用RabbitMQ 把消息里装去队列中非常简单,就像下面原本:

有了你这些 ,大伙儿 以前之后 的系统行为都实现了。现在它才能 在后台运行了,什么都有 每次遇到失效都不 重启。你才才能 通过运行sudo systemctl enable mailer.target让它在系统启动时就现在现在开始运行。至于标准输出的日志,会重新被写入系统日志。对于systemd来说,也什么都有 journald,一个多二进制的日志记录器(什么都有 转储的大大问题 就不再存在)。大伙儿 才能 通过以下的法律法律依据来检查大伙儿 的日志输出:

什么都有 ,我就 出一份力。让大伙儿 先来看看怎样在Ruby中编写和部署微服务。

大伙儿 几次月前写了一个多类式于的邮件服务,到目前为止,大伙儿 对结果都挺满意。邮件服务是相对独立的,一个多明选着义的API,什么都有 经过独立的严格测试,什么都有 大伙儿 相信它能达到大伙儿 的预期。而其健全的重启机制对大伙儿 来说也像个交易熔断器——有些sidekiq工作线程偶尔会出bug,于是大伙儿 只好通过去掉 monit来外理大大问题 ——才能 充分使用操作系统自带的工具,感觉好极了。

最后,原本的代码才能 保证在开发和测试的过程中,假如有一天提前引入,你随时才能 加入byebug(Ruby 2.x的debug工具)。什么都有 你担心速率大大问题 搞笑的话(它随便说说需要花点时间),我就把它拿掉,需要的以前再里装去来,什么都有 是加入一个多猴子补丁:

现在,大伙儿 有了一个多worker类,和一个多大致的项目形态学 。大伙儿 只需要通知sneakers运行worker即可,这是大伙儿 在bin/mailer里所做的:

现在运行bin/mailer ,就会变成下面原本:

接着大伙儿 告诉foreman,在读取大伙儿 以前创建的.env文件的哪些地方地方变量时,把它们导出到systemd。

“部署微服务时,你得考虑什么都有 事情。”来自@Tainnor

点击前往Tweet

具体细节何必 重要。什么都有 从上面的代码才能 看出,大伙儿 明确了用户、工作路径、现在现在开始运行服务的命令,也明确了每次遇到失效都应当重启,以及记录日志并去掉 到系统日志中。大伙儿 也设定了有些环境变量,包括PATH。稍后我会再谈到你这些 。

这条命令挺长的,但归根结底什么都有 在运行foreman export systemd,一齐指定了文件应该被放置到的目录(据我所知/etc/systemd/system是其标准目录)、运行该命令的用户、以及加载文件的环境。

请注意这是可执行的(看看开头的#!),什么都有 大伙儿 不让ruby命令,才能 直接运行。首先,大伙儿 加载设置文件(在这得使用一个多相对路径),接着加载有些的需要的东西,包括大伙儿 的邮件worker类。

最近,大伙儿 都认为应当采用微服务架构。什么都有 ,又有几次相关教程呢?大伙儿 来看看这篇关于用Ruby编写微服务的文章吧。

笔者在本文中中有 了什么都有 方面,但假如有一天能让大伙儿 看后编写和部署微服务转过身的全景。显然,什么都有 你真想有些人掌握哪些地方地方内容,还得深入研究。但我就 我什么都有 告诉了你,哪些地方地方技术才能 研究。

我就赋予journalctl 更多的选项,类式于,根据日期进行筛选。

这当中有 一次只是才能 自你说哪些地方明的,类式于Gemfile(\.lock)?以及readme。大伙儿 什么都有 用不多的解释spec文件夹,只需要知道,照惯例大伙儿 在你这些 目录下放了一个多helper文件,一个多(spec_helper.rb)用于进行快速单元测试,原本(acceptance_helper.rb)用于验收测试。验收测试需要设置更多东西(类式于,模拟真实的HTTP请求)。lib文件夹也跟大伙儿 的主题不太相关,大伙儿 才能 看后上面一个多lib/mailer.rb(这什么都有 大伙儿 上面定义的worker类),剩下的一个多文件是专门针对个性服务的。examples/mail.rb文件是示例邮件的编队代码,如同上文中的一样。大伙儿 才能 随时用它发起手动测试。现在我就 着重讨论一下config/setup.rb文件。这是大伙儿 通常在一现在现在开始就会加载的文件(即使是在spec_helper.rb)。什么都有 大伙儿 何必 需要它做不多事情(什么都有 你的测试就会变得太快了 了 )。在大伙儿 的例子中,它是原本的:

这里比较重要的是配置sneakers:amqp参数会接受一个多针对RabbitMQ连接的URL,这才能 从设置中加载而来。大伙儿 才能 通知sneakers在前台运行,并记录日志为标准输出。接着,大伙儿 给sneakers一个多worker类的数组,让sneakers运行你这些 数组。同样大伙儿 也需要一个多中有 日志的库,原本大伙儿 才能 动态观察具体情况。httplog gem会记录下所有向外发送的请求,这对于与组织组织结构API通信来说非常有用(在这大伙儿 也让它记录下HTTP headers,但这都不 默认设置)。

此后,大伙儿 的服务就才能 在服务器上启动并保持运行,并准备接受发来的所有消息了。

为了让foreman生成systemd文件,大伙儿 需要在部署中设置导出流程。问你你是是不是用过Capistrano 2或Capistrano 3什么都有 别的类式于的工具(类式于mina)。下面我就看后你什么都有 需要的壳命令。最难的次要任务是怎样正确设置环境变量。为了确保foreman才能 在启动脚本中写出刚才的变量,大伙儿 才能 从所部署的项目根目录中运行下面的代码,从而把它们先里装去一个多.env文件:

什么都有 实际的输出随便说说要冗长的多!

(在此我省略了PORT变量——你这些 变量是foreman自动生成的。大伙儿 的服务什么都有 需要它。)

现在,大伙儿 什么都有 外理了producer端,但大伙儿 仍然需要一个多应用接受并外理消息。大伙儿 使用的是snearkers。sneakers是围绕RabbitMQ的一个多压缩gem。什么都有 你之后 做有些后台外理,它会把你最什么都有 要用到的RabbitMQ的子集暴露我就,什么都有 底层还是RabbitMQ的。有了sneakers(sneakers是受到sidekiq启发而来的),大伙儿 才能 设置一个多“worker”去外理大伙儿 的消息发送请求:

本文转自 OneAPM 官方博客

这里最重要的什么都有 设定加载路径。首先,大伙儿 引入bundler/setup,由此大伙儿 才能 通过gem的名称来引入各个gem。接着,大伙儿 把服务的lib文件夹加入加载路径。这因为着分析大伙儿 才能 做什么都有 事,类式于引入mandrill_api/provider,它才能 从<project_root>/ lib/mandrill_api/provider中找到。大伙儿 随便说说原本做,是什么都有 大伙儿 都不 喜欢相对路径。请注意,大伙儿 没法在Rails中使用自动加载。大伙儿 也没法调用Bundler.require,什么都有 原本会引入Gemfile当中的所有gem。这因为着分析你得有些人明确调用你需要的依赖项(gem什么都有 是lib文件)(随便说说原本挺好的)。

人人都不 讨论微服务,但我至今也没见过几篇有关用Ruby编写微服务的、像样的教程。这什么都有 是什么都有 有些Ruby开发人员仍然最喜欢Rails架构(这没哪些地方不好,Rails一种生活生活也没哪些地方不好,什么都有 Ruby才能 做到的事还有什么都有 呢。)

【编者按】本文作者为 Pierpaolo Frasa,文章通过完全的案例,介绍了在Ruby中编写微服务时所需注意的方方面面。系国内 ITOM 管理平台 OneAPM 编译呈现。

我就在Ruby中靠有些人做到哪些地方地方,但随便说说有更好的方案:利用有些现成的东西来外理哪些地方地方任务,即你的操作系统(sidekiq的创造者Mike Perhammm也同意我的看法)。对大伙儿 来说,这就因为着分析使用systemd,什么都有 这什么都有 在大伙儿 的服务器(以及大次要如今的Linux系统)上运行的线程,但我就 在这引发口水战。Upstart什么都有 daemontools什么都有 才才能 。

什么都有 大伙儿 重新加载所有的东西:

这里大伙儿 只一个线程,但我就指定多个。大伙儿 指定了一个多叫“mailer”的线程,它将运行bin/mailer你这些 可执行文件。foreman的好处体现在,它才能 把你这些 配置文件导出到有些初始化系统中,包括systemd。类式于,从你这些 简单的Procfile,它能创建出什么都有 文件;正如我刚才所说,大伙儿 才能 在Profile中指定多个线程,多个原本的文件才能 指定一个多依赖层级。层级的顶短时一个多mailer.target文件,它依赖于一个多mailer-mailer.target文件(而什么都有 大伙儿 的Procfile当中有 多个线程,mailer.target则会依赖于多个子target文件)。mailer-mailer.target文件又依赖于mailer-mailer-1.service(类式于于文件才才能 有多个,大伙儿 只需要将线程并发度的值明确设定为大于1即可)。最后的文件看起来是原本的:

接下来,大伙儿 启用该服务,让它在服务器启动以前保持运行:

另外,我挺喜欢Rails的多环境。在上面的例子中,大伙儿 是通过UNIX环境变量ENVIRONMENT来加载的。大伙儿 还需要进行有些设置(类式于RabbitMQ连接选项,什么都有 是大伙儿 服务所使用的有些API的密钥)。哪些地方地方应当依赖于环境,什么都有 大伙儿 加载了一个多YAML文件,什么都有 把它变成了全局变量。

要用systemd来运行大伙儿 的微服务,需要创建有些配置文件。这才能 手工完成,但我更之后 使用一款叫做foreman的工具来做。有了foreman,大伙儿 才能 指定所有需要在Procfile中运行的线程: