在最近的幾年裡,“微服務架構”如雨後春筍般湧現。它用於描述一種特定的軟件應用設計方式,這種方式使得應用可以由多個獨立部署的服務以服務套件的形式組成。 - M. Fowler
簡單來說,微服務架構可以將你的系統拆分成多個負責不同任務的小的(單一上下文內)功能塊,它們彼此互無感知,各自只提供用於通訊的通用指向(。這個指向通常是已經將通訊協議和接口定義好的消息隊列。
想象一下,你有一個 REST API ,這個 API 有一個端點(REST 風格的 API 可以有多個端點用於處理對同一資源的不同類型的請求)用來接受數據,並且你需要將接收到的數據進行一些運算工作。那麼相比阻塞接口調用者的請求來說,異步實現此接口是一個更好的選擇。你可以先給用戶返回一個 "OK - 你的請求稍後會處理" 的狀態,然後在後台任務中完成運算。
同樣,如果你想要在不阻塞主進程的前提下,在計算完成後發送一封提醒郵件,那麼將“郵件發送”委托給其他服務去做會更好一些。
場景描述讓我們將系統創建起來,在實踐中理解它。
環境我們需要的環境:
在開發環境中使用 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 yagmailfrom nameko.rpc import rpc, RpcProxyclass Mail(object): name = "mail" @rpc def send(self, to, subject, contents): yag = yagmail.SMTP('[email protected]', '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@localhoststarting services: mail, computeConnected 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@localhostNameko Python 2.7.9 (default, Apr 2 2015, 15:33:21) [GCC 4.9.2] shell on linux2Broker: amqp://guest:guest@localhost>>>
現在你已經處在 RPC 客戶端中了,Shell 的測試工作是通過 n.rpc 對象來進行的,它的使用方法如下:
>>> n.rpc.mail.send("[email protected]", "testing", "Just testing")
上邊的代碼會發送一封郵件,我們同樣可以調用計算服務對其進行測試。需要注意的是,此測試還會附帶進行異步的郵件發送。
>>> n.rpc.compute.compute('sum', 30, 10, "[email protected]")40>>> n.rpc.compute.compute('sub', 30, 10, "[email protected]")20>>> n.rpc.compute.compute('mul', 30, 10, "[email protected]")300>>> n.rpc.compute.compute('div', 30, 10, "[email protected]")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, requestfrom flasgger import Swaggerfrom nameko.standalone.rpc import ClusterRpcProxyapp = 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, 200app.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/ 獲取更多的信息。
別光看了,撸起袖子來,實現微服務!
原文來自:https://linux.cn/article-7584-1.html
轉載地址:http://www.linuxprobe.com/python-rabbitmq-nameko.html
http://xxxxxx/Linuxjc/1155987.html TechArticle