python rpc微服务框架_grpc的微服务探索实践
對于微服務的實踐,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服務實踐,現在通過一個簡單的服務來分析Python技術棧的微服務實踐
技術棧:Python3 + grpc + Zookeeper
服務API:通過學科獲取相應的題型
grpc:由Google公司開源的高性能RPC框架,消息協議使用Google自家開源的Protocol Buffers協議機制,傳輸使用HTTP2.0標準,支持雙向流和連接多路復用
Protocol Buffers部分:
syntax = "proto3";
message Subject {
string name= 1;
}
message QuestionType {
string name= 1;
}
service SimpleRpcServer {//server streaming rpc//客戶端發送學科,服務端多次返回該學科包含的題型
rpc GetSubjectQuestionTypes (Subject) returns (stream QuestionType) {
}
}
這里定義grpc的接口類型為服務器流式RPC,即客戶端發起一次請求,服務器可以返回多個響應信息,典型的例子有:客戶端向服務端發送一個股票代碼,服務端就把該股票的實時數據源源不斷的返回給客戶端:
通過protobuf編譯器和Protocol Buffers生成代碼:
python3 -m grpc_tools.protoc -I. --python_out=.. --grpc_python_out=.. simple_calculate.proto
服務端開啟服務器,對外提供rpc調用流程:
客戶端rpc調用流程:
Zookeeper服務注冊與發現策略:
服務注冊:
1 defregister_zk(host, port):2 """
3 注冊到zookeeper4 """
5 zk = KazooClient(hosts='{host}:{port}'.format(6 host=settings_info["zookeeper"]["host"],7 port=settings_info["zookeeper"]["port"])8 )9 zk.start()10 zk.ensure_path('/rpc_calc') #創建根節點
11 value = json.dumps({'host': host, 'port': port})12
13 #創建服務子節點
14 zk.create(15 '/rpc_calc/calculate_server',16 value.encode(),17 ephemeral=True,18 sequence=True19 )
服務治理發現:
1 def _get_servers(self, event=None):2 """
3 從zookeeper獲取服務器地址信息列表4 """
5 servers =self._zk.get_children(6 '/rpc_calc', watch=self._get_servers7 )8 print(servers)9 self._servers =[]10 for server inservers:11 data = self._zk.get('/rpc_calc/' +server)[0]12 ifdata:13 addr =json.loads(data.decode())14 self._servers.append(addr)15
16 defget_server(self):17 """
18 隨機選出一個可用的服務器19 """
20 return random.choice(self._servers)
服務端實現代碼:
1 classSimpleRpcServerServicer(calculate_grpc.SimpleRpcServerServicer):2 """
3 實現被調用方法的具體代碼4 """
5
6 def __init__(self):7 self.subject_question_type_db ={8 'Chinese': ['單選', '多選', '填空', '解答', '問答', '作文'],9 'Math': ['單選', '填空', '解答'],10 'English': ['單選', '填空', '作文'],11 'Physics': ['單選', '多選', '填空', '解答'],12 'Chemistry': ['單選', '多選', '填空', '解答'],13 'Biology': ['單選', '多選', '填空', '解答'],14 'History': ['單選', '多選', '填空', '解答', '問答']15 }16
17 defGetSubjectQuestionTypes(self, request, context):18 """
19 服務器流式RPC調用 根據subject獲取question_types20 :param request:21 :param context:22 :return:23 """
24 subject =request.name25 question_types =self.subject_question_type_db.get(subject)26 for question_type inquestion_types:27 yield calculate_pb2.QuestionType(name=question_type)
客戶端實現代碼:
1 definvoke_get_subject_question_types(stub):2 """
3 根據學科獲取題型4 Server Streaming RPC 服務器流式RPC 客戶端發送,服務器響應多個5 :param stub:6 :return:7 """
8 subject = calculate_pb2.Subject(name='Chinese')9 question_types =stub.GetSubjectQuestionTypes(subject)10 for question_type inquestion_types:11 print(question_type.name)
服務測試:
開啟三個服務,地址分別是 host:8003 host:8005 host:8009,客戶端開啟兩個,client1 和 client2 ,測試結果:
已經成功注冊了三個server到Zookeeper,客戶端1使用的是8003端口的server,客戶端2使用的是8005端口的server;grpc框架對于完整的rpc實現來說,實質上是封裝了 網絡傳輸、數據協議的打包解包,使得實現rpc更加簡單,其本質仍然是遵守rpc的實現原理的
總結
以上是生活随笔為你收集整理的python rpc微服务框架_grpc的微服务探索实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: psp能装安卓软件吗_王思聪:翻译软件能
- 下一篇: nginx 转发慢_学习Nginx的正确