"微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的、可扩展的服务是保障代码演变的最好选择。在 Python 的世界里,有个叫做 “Nameko” 的框架,它将微服务的实现变得简单并且强大。

在最近的几年里,“微服务架构”如雨后春笋般涌现。它用于描述一种特定的软件应用设计方式,这种方式使得应用可以由多个独立部署的服务以服务套件的形式组成。 - M. Fowler

简单来说,微服务架构可以将你的系统拆分成多个负责不同任务的小的(单一上下文内)功能块,它们彼此互无感知,各自只提供用于通讯的通用指向(。这个指向通常是已经将通讯协议和接口定义好的消息队列。

想象一下,你有一个 REST API ,这个 API 有一个端点(REST 风格的 API 可以有多个端点用于处理对同一资源的不同类型的请求)用来接受数据,并且你需要将接收到的数据进行一些运算工作。那么相比阻塞接口调用者的请求来说,异步实现此接口是一个更好的选择。你可以先给用户返回一个 "OK - 你的请求稍后会处理" 的状态,然后在后台任务中完成运算。

同样,如果你想要在不阻塞主进程的前提下,在计算完成后发送一封提醒邮件,那么将“邮件发送”委托给其他服务去做会更好一些。

场景描述

让我们将系统创建起来,在实践中理解它。

环境

我们需要的环境:

运行良好的 RabbitMQ(LCTT 译注:RabbitMQ 是一个流行的消息队列实现)

由 VirtualEnv 提供的 Services 虚拟环境

由 VirtualEnv 提供的 API 虚拟环境

Rabbit

在开发环境中使用 RabbitMQ 最简单的方式就是运行其官方的 docker 容器。在你已经拥有 Docker 的情况下,运行:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

在浏览器中访问 http://localhost:15672 ,如果能够使用 guest:guest 验证信息登录 RabbitMQ 的控制面板,说明它已经在你的开发环境中运行起来了。

服务环境

现在让我们创建微服务来满足我们的任务需要。其中一个服务用来执行计算任务,另一个用来发送邮件。按以下步骤执行:

在 Shell 中创建项目的根目录

$ mkdir myproject

$ cd myproject

用 virtualenv 工具创建并且激活一个虚拟环境(你也可以使用 virtualenv-wrapper)

$ virtualenv service_env

$ source service_env/bin/activate

安装 nameko 框架和 yagmail

(service_env)$ pip install nameko

(service_env)$ pip install yagmail

服务的代码

现在我们已经准备好了 virtualenv 所提供的虚拟环境(可以想象成我们的服务是运行在一个独立服务器上的,而我们的 API 运行在另一个服务器上),接下来让我们编码,实现 nameko 的 RPC 服务。

我们会将这两个服务放在同一个 python 模块中,当然如果你乐意,也可以把它们放在单独的模块里并且当成不同的服务运行。

在名为 service.py的文件中

import yagmail

from nameko.rpc import rpc, RpcProxy

class Mail(object):

name = "mail"

@rpc

def send(self, to, subject, contents):

yag = yagmail.SMTP('myname@gmail.com', 'mypassword')

# 以上的验证信息请从安全的地方进行读取

# 贴士: 可以去看看 Dynaconf 设置模块

yag.send(to=to.encode('utf-8),

subject=subject.encode('utf-8),

contents=[contents.encode('utf-8)])

class Compute(object):

name = "compute"

mail = RpcProxy('mail')

@rpc

def compute(self, operation, value, other, email):

operations = {'sum': lambda x, y: int(x) + int(y),

'mul': lambda x, y: int(x) * int(y),

'div': lambda x, y: int(x) / int(y),

'sub': lambda x, y: int(x) - int(y)}

try:

result = operations[operation](value, other)

except Exception as e:

self.mail.send.async(email, "An error occurred", str(e))

raise

else:

self.mail.send.async(

email,

"Your operation is complete!",

"The result is: %s" % result

)

return result

现在我们已经用以上代码定义好了两个服务,下面让我们将 Nameko RPC service 运行起来。

注意:我们会在控制台中启动并运行它。但在生产环境中,建议大家使用 supervisord 替代控制台命令。

在 Shell 中启动并运行服务

(service_env)$ nameko run service --broker amqp://guest:guest@localhost

starting services: mail, compute

Connected to amqp://guest:**@127.0.0.1:5672//

Connected to amqp://guest:**@127.0.0.1:5672//

测试

在另外一个 Shell 中(使用相同的虚拟环境),用 nameko shell 进行测试:

(service_env)$ nameko shell --broker amqp://guest:guest@localhost

Nameko Python 2.7.9 (default, Apr 2 2015, 15:33:21)

[GCC 4.9.2] shell on linux2

Broker: amqp://guest:guest@localhost

>>>

现在你已经处在 RPC 客户端中了,Shell 的测试工作是通过 n.rpc 对象来进行的,它的使用方法如下:

>>> n.rpc.mail.send("name@email.com", "testing", "Just testing")

上边的代码会发送一封邮件,我们同样可以调用计算服务对其进行测试。需要注意的是,此测试还会附带进行异步的邮件发送。

>>> n.rpc.compute.compute('sum', 30, 10, "name@email.com")

40

>>> n.rpc.compute.compute('sub', 30, 10, "name@email.com")

20

>>> n.rpc.compute.compute('mul', 30, 10, "name@email.com")

300

>>> n.rpc.compute.compute('div', 30, 10, "name@email.com")

3

在 API 中调用微服务

在另外一个 Shell 中(甚至可以是另外一台服务器上),准备好 API 环境。

用 virtualenv 工具创建并且激活一个虚拟环境(你也可以使用 virtualenv-wrapper)

$ virtualenv api_env

$ source api_env/bin/activate

安装 Nameko、 Flask 和 Flasgger

(api_env)$ pip install nameko

(api_env)$ pip install flask

(api_env)$ pip install flasgger

注意: 在 API 中并不需要 yagmail ,因为在这里,处理邮件是服务的职责。

创建含有以下内容的 api.py 文件:

from flask import Flask, request

from flasgger import Swagger

from nameko.standalone.rpc import ClusterRpcProxy

app = Flask(__name__)

Swagger(app)

CONFIG = {'AMQP_URI': "amqp://guest:guest@localhost"}

@app.route('/compute', methods=['POST'])

def compute():

"""

Micro Service Based Compute and Mail API

This API is made with Flask, Flasgger and Nameko

---

parameters:

- name: body

in: body

required: true

schema:

id: data

properties:

operation:

type: string

enum:

- sum

- mul

- sub

- div

email:

type: string

value:

type: integer

other:

type: integer

responses:

200:

description: Please wait the calculation, you'll receive an email with results

"""

operation = request.json.get('operation')

value = request.json.get('value')

other = request.json.get('other')

email = request.json.get('email')

msg = "Please wait the calculation, you'll receive an email with results"

subject = "API Notification"

with ClusterRpcProxy(CONFIG) as rpc:

# asynchronously spawning and email notification

rpc.mail.send.async(email, subject, msg)

# asynchronously spawning the compute task

result = rpc.compute.compute.async(operation, value, other, email)

return msg, 200

app.run(debug=True)

在其他的 shell 或者服务器上运行此文件

(api_env) $ python api.py

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

然后访问 http://localhost:5000/apidocs/index.html 这个 url,就可以看到 Flasgger 的界面了,利用它可以进行 API 的交互并可以发布任务到队列以供服务进行消费。

注意: 你可以在 shell 中查看到服务的运行日志,打印信息和错误信息。也可以访问 RabbitMQ 控制面板来查看消息在队列中的处理情况。

Nameko 框架还为我们提供了很多高级特性,你可以从 https://nameko.readthedocs.org/en/stable/ 获取更多的信息。

别光看了,撸起袖子来,实现微服务!

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:https://www.linuxprobe.com/

python nameko用于生产_用 Python、 RabbitMQ 和 Nameko 实现微服务相关推荐

  1. python的ai写作_使用Python创建AI比你想象的轻松

    可能对AI领域,主要开发阶段,成就,结果和产品使用感兴趣.有数百个免费源和教程描述使用Python的AI.但是,没有必要浪费你的时间看他们.这里是一个详细的指南,你需要知道在使用Python构建人工智 ...

  2. python中级项目下载_中级Python复习:教程,项目思想和技巧

    python中级项目下载 本文旨在向Python初学者和开发人员介绍Python中使用的一些关键概念,这些概念一开始就没有讲授. 如果您可以创建二次方根求解器,则可以理解本文. 这些是我一天之内没有学 ...

  3. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

  4. python出现的意义_[转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public 2. __object__ # special, python system ...

  5. python调整图像大小_使用Python调整图像大小

    作者|Nicholas Ballard 编译|VK 来源|Towards Data Science 可以说,每一个"使用计算机的人"都需要在某个时间点调整图像的大小.MacOS的预 ...

  6. python与数据分析结合_将Python和R整合进一个数据分析流程

    原标题:将Python和R整合进一个数据分析流程 在Python中调用R或在R中调用Python,为什么是"和"而不是"或"? 在互联网中,关于"R ...

  7. python新闻评论分析_使用 python 抓取并分析京东商品评论数据

    本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...

  8. python图片字符分割_图像分割python

    常用的十大 python 图像处理工具 本文为 AI 研习社编译的技术博客,原标题 : 10 Python image manipulation tools. 作者 | Parul Pandey 翻译 ...

  9. python测试抽奖脚本_使用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

最新文章

  1. 深入浅出Docker(一):Docker核心技术预览
  2. Zeal编程查询,离线文档浏览器
  3. libxml/xmlversion.h: No such file or directory
  4. 又一次的Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat)
  5. rocksdb和leveldb的bloom filter比较
  6. jvm系列二之GC收集器
  7. php 删除单个文件大小,php删除指定大小的jpg文件
  8. FullCalendar 三:FullCalendar应用——读取JSON数据
  9. .NET 工具生成引擎概述
  10. 如何更改 Safari 浏览器文件下载位置?
  11. Selenium爬虫 -- WebDriver多标签页创建与切换
  12. CISP-PTS学习笔记-XSS
  13. JMeter Ramp-up 说明
  14. H2---主题:融入动画技术的交互应用
  15. 【Docker学习笔记 七】深入理解Docker网络配置及微服务部署
  16. 如何设置最美的win11桌面(附隐藏任务栏方法)
  17. C语言实现背包与商城的小项目
  18. 习题10-4 递归求简单交错幂级数的部分和 (15 分)
  19. vscode进行远程服务器 An SSH installation couldnt be found
  20. 微软 Teams 可以排排坐了~~ C位你要不要?

热门文章

  1. java 查询线程池_[代码全屏查看]-我的 Java 线程池测试类
  2. JAVA期末考试工程部分_知到Java程序设计(山西工程职业学院)考试期末答案
  3. java 泛型和集合_Java集合和泛型
  4. mysql function函数_详解MySQL如何按表创建千万级的压测数据
  5. 如何确定JTAG好坏?JTAG到底是什么?
  6. 为什么要做电路保护,电路保护的意义是什么?
  7. 人脸识别技术如何应用到美颜领域?
  8. linux 定时器_定时器: Nodejs 中的 timers
  9. java workerdone_【架构】Java并发编程——线程池的使用
  10. while(true) 循环中使用了sleep休眠了半小时就中断了_线程中断不是你想中断就能的...