python nameko用于生产_用 Python、 RabbitMQ 和 Nameko 实现微服务
"微服務(wù)是一股新浪潮" - 現(xiàn)如今,將項(xiàng)目拆分成多個獨(dú)立的、可擴(kuò)展的服務(wù)是保障代碼演變的最好選擇。在 Python 的世界里,有個叫做 “Nameko” 的框架,它將微服務(wù)的實(shí)現(xiàn)變得簡單并且強(qiáng)大。
在最近的幾年里,“微服務(wù)架構(gòu)”如雨后春筍般涌現(xiàn)。它用于描述一種特定的軟件應(yīng)用設(shè)計方式,這種方式使得應(yīng)用可以由多個獨(dú)立部署的服務(wù)以服務(wù)套件的形式組成。 - M. Fowler
簡單來說,微服務(wù)架構(gòu)可以將你的系統(tǒng)拆分成多個負(fù)責(zé)不同任務(wù)的小的(單一上下文內(nèi))功能塊,它們彼此互無感知,各自只提供用于通訊的通用指向(。這個指向通常是已經(jīng)將通訊協(xié)議和接口定義好的消息隊(duì)列。
想象一下,你有一個 REST API ,這個 API 有一個端點(diǎn)(REST 風(fēng)格的 API 可以有多個端點(diǎn)用于處理對同一資源的不同類型的請求)用來接受數(shù)據(jù),并且你需要將接收到的數(shù)據(jù)進(jìn)行一些運(yùn)算工作。那么相比阻塞接口調(diào)用者的請求來說,異步實(shí)現(xiàn)此接口是一個更好的選擇。你可以先給用戶返回一個 "OK - 你的請求稍后會處理" 的狀態(tài),然后在后臺任務(wù)中完成運(yùn)算。
同樣,如果你想要在不阻塞主進(jìn)程的前提下,在計算完成后發(fā)送一封提醒郵件,那么將“郵件發(fā)送”委托給其他服務(wù)去做會更好一些。
場景描述
讓我們將系統(tǒng)創(chuàng)建起來,在實(shí)踐中理解它。
環(huán)境
我們需要的環(huán)境:
運(yùn)行良好的 RabbitMQ(LCTT 譯注:RabbitMQ 是一個流行的消息隊(duì)列實(shí)現(xiàn))
由 VirtualEnv 提供的 Services 虛擬環(huán)境
由 VirtualEnv 提供的 API 虛擬環(huán)境
Rabbit
在開發(fā)環(huán)境中使用 RabbitMQ 最簡單的方式就是運(yùn)行其官方的 docker 容器。在你已經(jīng)擁有 Docker 的情況下,運(yùn)行:
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
在瀏覽器中訪問 http://localhost:15672 ,如果能夠使用 guest:guest 驗(yàn)證信息登錄 RabbitMQ 的控制面板,說明它已經(jīng)在你的開發(fā)環(huán)境中運(yùn)行起來了。
服務(wù)環(huán)境
現(xiàn)在讓我們創(chuàng)建微服務(wù)來滿足我們的任務(wù)需要。其中一個服務(wù)用來執(zhí)行計算任務(wù),另一個用來發(fā)送郵件。按以下步驟執(zhí)行:
在 Shell 中創(chuàng)建項(xiàng)目的根目錄
$ mkdir myproject
$ cd myproject
用 virtualenv 工具創(chuàng)建并且激活一個虛擬環(huán)境(你也可以使用 virtualenv-wrapper)
$ virtualenv service_env
$ source service_env/bin/activate
安裝 nameko 框架和 yagmail
(service_env)$ pip install nameko
(service_env)$ pip install yagmail
服務(wù)的代碼
現(xiàn)在我們已經(jīng)準(zhǔn)備好了 virtualenv 所提供的虛擬環(huán)境(可以想象成我們的服務(wù)是運(yùn)行在一個獨(dú)立服務(wù)器上的,而我們的 API 運(yùn)行在另一個服務(wù)器上),接下來讓我們編碼,實(shí)現(xiàn) nameko 的 RPC 服務(wù)。
我們會將這兩個服務(wù)放在同一個 python 模塊中,當(dāng)然如果你樂意,也可以把它們放在單獨(dú)的模塊里并且當(dāng)成不同的服務(wù)運(yùn)行。
在名為 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')
# 以上的驗(yàn)證信息請從安全的地方進(jìn)行讀取
# 貼士: 可以去看看 Dynaconf 設(shè)置模塊
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
現(xiàn)在我們已經(jīng)用以上代碼定義好了兩個服務(wù),下面讓我們將 Nameko RPC service 運(yùn)行起來。
注意:我們會在控制臺中啟動并運(yùn)行它。但在生產(chǎn)環(huán)境中,建議大家使用 supervisord 替代控制臺命令。
在 Shell 中啟動并運(yùn)行服務(wù)
(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 中(使用相同的虛擬環(huán)境),用 nameko shell 進(jìn)行測試:
(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
>>>
現(xiàn)在你已經(jīng)處在 RPC 客戶端中了,Shell 的測試工作是通過 n.rpc 對象來進(jìn)行的,它的使用方法如下:
>>> n.rpc.mail.send("name@email.com", "testing", "Just testing")
上邊的代碼會發(fā)送一封郵件,我們同樣可以調(diào)用計算服務(wù)對其進(jìn)行測試。需要注意的是,此測試還會附帶進(jìn)行異步的郵件發(fā)送。
>>> 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 中調(diào)用微服務(wù)
在另外一個 Shell 中(甚至可以是另外一臺服務(wù)器上),準(zhǔn)備好 API 環(huán)境。
用 virtualenv 工具創(chuàng)建并且激活一個虛擬環(huán)境(你也可以使用 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 ,因?yàn)樵谶@里,處理郵件是服務(wù)的職責(zé)。
創(chuàng)建含有以下內(nèi)容的 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 或者服務(wù)器上運(yùn)行此文件
(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 的界面了,利用它可以進(jìn)行 API 的交互并可以發(fā)布任務(wù)到隊(duì)列以供服務(wù)進(jìn)行消費(fèi)。
注意: 你可以在 shell 中查看到服務(wù)的運(yùn)行日志,打印信息和錯誤信息。也可以訪問 RabbitMQ 控制面板來查看消息在隊(duì)列中的處理情況。
Nameko 框架還為我們提供了很多高級特性,你可以從 https://nameko.readthedocs.org/en/stable/ 獲取更多的信息。
別光看了,擼起袖子來,實(shí)現(xiàn)微服務(wù)!
免費(fèi)提供最新Linux技術(shù)教程書籍,為開源技術(shù)愛好者努力做得更多更好:https://www.linuxprobe.com/
總結(jié)
以上是生活随笔為你收集整理的python nameko用于生产_用 Python、 RabbitMQ 和 Nameko 实现微服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述机器指令与微指令之间的关系_计算机组
- 下一篇: python创建初始值列表_Python