python与rpc服务
什么是rpc
隨著企業(yè) IT 服務(wù)的不斷發(fā)展,單臺(tái)服務(wù)器逐漸無(wú)法承受用戶日益增長(zhǎng)的請(qǐng)求壓力時(shí),就需要多臺(tái)服務(wù)器聯(lián)合起來(lái)構(gòu)成「服務(wù)集群」共同對(duì)外提供服務(wù)。
同時(shí)業(yè)務(wù)服務(wù)會(huì)隨著產(chǎn)品需求的增多越來(lái)越腫,架構(gòu)上必須進(jìn)行服務(wù)拆分,一個(gè)完整的大型服務(wù)會(huì)被打散成很多很多獨(dú)立的小服務(wù),每個(gè)小服務(wù)會(huì)由獨(dú)立的進(jìn)程去管理來(lái)對(duì)外提供服務(wù),這就是「微服務(wù)」。
當(dāng)用戶的請(qǐng)求到來(lái)時(shí),我們需要將用戶的請(qǐng)求分散到多個(gè)服務(wù)去各自處理,然后又需要將這些子服務(wù)的結(jié)果匯總起來(lái)呈現(xiàn)給用戶。那么服務(wù)之間該使用何種方式進(jìn)行交互就是需要解決的核心問(wèn)題。
RPC 就是為解決服務(wù)之間信息交互而發(fā)明和存在的。
RPC(Remote Procedure Call)——遠(yuǎn)程過(guò)程調(diào)用,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。
RPC采用客戶機(jī)/服務(wù)器模式。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。
首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。
在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。
當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息
然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
RPC就是一種遠(yuǎn)程調(diào)用函數(shù)接口的方式,說(shuō)白了,就是一種遠(yuǎn)程調(diào)用函數(shù)接口的方式,客戶端和服務(wù)端之間約定一種契約(函數(shù)接口),然后服務(wù)端一直等待客戶端的調(diào)用。
有點(diǎn)像平常的WEB網(wǎng)絡(luò)請(qǐng)求。
一種用途是在多臺(tái)服務(wù)器之間互相進(jìn)行調(diào)用。
另一個(gè)用途則在于,不同編程語(yǔ)言之間都支持這種方式,像Python更是內(nèi)置對(duì)其的支持,不需要額外安裝什么庫(kù),所以可以直接在多語(yǔ)言的服務(wù)器之間互相進(jìn)行調(diào)用。
Socket編程就是RPC通信
HTTP與RPC
這兩者的關(guān)系好比
- HTTP(普通話)
- RPC(方言)
要進(jìn)行跨企業(yè)服務(wù)調(diào)用時(shí),往往都是通過(guò) HTTP API,也就是普通話,雖然效率不高,但是通用,沒(méi)有太多溝通的學(xué)習(xí)成本。
但是在企業(yè)內(nèi)部還是 RPC 更加高效,同一個(gè)企業(yè)公用一套方言進(jìn)行高效率的交流,要比通用的 HTTP 協(xié)議來(lái)交流更加節(jié)省資源。
中國(guó)各地都有自己方言,你回了老家還是流行說(shuō)方言
本質(zhì)上,普通話也是一種方言,只不過(guò)是官方的方言,使用的最廣泛的方言。
Nginx與RPC
Ngnix 是互聯(lián)網(wǎng)企業(yè)使用最為廣泛的代理服務(wù)器。
它可以為后端分布式服務(wù)提供負(fù)載均衡的功能,它可以將后端多個(gè)服務(wù)地址聚合為單個(gè)地址來(lái)對(duì)外提供服務(wù)。
如圖,Django 是 Python 技術(shù)棧最流行的 Web 框架。
你可能會(huì)問(wèn),python web部署不是用的uwsgi嗎,是的,也可以走uwsgi協(xié)議,它是比HTTP協(xié)議更省流量的二進(jìn)制協(xié)議。
uwsgi 通訊協(xié)議在 Python 語(yǔ)言體系里使用非常普遍,如果一個(gè)企業(yè)內(nèi)部使用 Python 語(yǔ)言棧搭建 Web 服務(wù),那么他們?cè)谏a(chǎn)環(huán)境部署 Python 應(yīng)用的時(shí)候不是在使用 HTTP 協(xié)議就是在使用 uwsgi 協(xié)議來(lái)和 Nginx 之間建立通訊。
RPC交互
RPC是兩個(gè)子系統(tǒng)之間進(jìn)行的直接消息交互,使用操作系統(tǒng)提供的套接字作為消息的載體
python的socket編程就是一種RPC通信
rpc_server.py
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("localhost", 8080)) sock.listen(1) # 監(jiān)聽(tīng)客戶端連接 while True:conn, addr = sock.accept() # 接收一個(gè)客戶端連接print(conn.recv(1024)) # 從接收緩沖讀消息 recv bufferconn.sendall(b"world") # 將響應(yīng)發(fā)送到發(fā)送緩沖 send bufferconn.close() # 關(guān)閉連接rpc_client.py
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("localhost", 8080)) # 連接服務(wù)器 sock.sendall(b"hello") # 將消息輸出到發(fā)送緩沖 send buffer print(sock.recv(1024)) # 從接收緩沖 recv buffer 中讀響應(yīng) sock.close() # 關(guān)閉套接字...xmlrpc庫(kù)
簡(jiǎn)單的服務(wù)端
像web請(qǐng)求一樣,我們需要確定供客戶端訪問(wèn)的url和端口號(hào),以及供客戶端調(diào)用的方法實(shí)現(xiàn),最后要讓我們服務(wù)器一直處于等待被訪問(wèn)的狀態(tài):
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' from xmlrpc.server import SimpleXMLRPCServer# 調(diào)用函數(shù) def respon_string(str):return "get string:%s"%strif __name__ == '__main__':server = SimpleXMLRPCServer(('localhost', 8888)) # 初始化server.register_function(respon_string, "get_string") # 注冊(cè)函數(shù)print ("Listening for Client")server.serve_forever() # 保持等待調(diào)用狀態(tài)可以看到,代碼中就實(shí)現(xiàn)了上面說(shuō)的幾點(diǎn)。
register_function用于注冊(cè)一個(gè)供調(diào)用的函數(shù),第一個(gè)參數(shù)為自己實(shí)現(xiàn)的方法名,第二個(gè)參數(shù)為供客戶端調(diào)用的方法名。
簡(jiǎn)單的客戶端
根據(jù)url和端口號(hào)初始化一個(gè)服務(wù)器對(duì)象,然后調(diào)用需要的方法即可:
from xmlrpc.client import ServerProxyif __name__ == '__main__':server = ServerProxy("http://localhost:8888") # 初始化服務(wù)器print (server.get_string("oldboy_python6666")) # 調(diào)用函數(shù)并傳參分別啟動(dòng)服務(wù)端和客戶端,客戶端即可遠(yuǎn)程調(diào)用服務(wù)端的功能函數(shù)
saltstack就是基于rpc遠(yuǎn)程調(diào)用命令
總結(jié)
以上是生活随笔為你收集整理的python与rpc服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python中Json、os、sys、h
- 下一篇: python练习题:给定一个字符串,请你