https://github.com/twtrubiks/grpc_python_tutorial
grpc python 教學 Google RPC
https://github.com/twtrubiks/grpc_python_tutorial
grpc python3 tutorial
Last synced: about 1 month ago
JSON representation
grpc python 教學 Google RPC
- Host: GitHub
- URL: https://github.com/twtrubiks/grpc_python_tutorial
- Owner: twtrubiks
- Created: 2023-09-30T03:58:16.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2023-10-04T14:02:24.000Z (over 2 years ago)
- Last Synced: 2025-01-17T05:09:08.839Z (over 1 year ago)
- Topics: grpc, python3, tutorial
- Language: Python
- Homepage:
- Size: 6.84 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# grpc python 教學
* [Youtube Tutorial - gRPC Python 基礎全攻略:掌握 Protobuf定義以及編譯、HTTP/2 高效能 RPC 開發](https://youtu.be/PBPKiPMxaQc)
gRPC 也可以稱 Google RPC, 今天來用 python 把玩 😀
## 介紹
官網架構圖

簡單說,RPC (遠端程序呼叫) 就像你呼叫本機的 function 一樣。
實際上,客戶端 (Client) 會透過一個由 `.proto` 文件編譯產生的「客戶端代理」(Client Stub) 來呼叫遠端函式,
這個 Stub 看起來就像一個本地物件,它會幫你處理好參數打包、網路通訊等細節,
讓你感覺就像直接呼叫本地函式 (實際上是呼叫遠端的函式).
## 好處以及適合使用時機
- 基於 HTTP/2 協定,支援多路復用、標頭壓縮、伺服器推送和雙向串流等特性,相比傳統 REST 具有更高的傳輸效率和更低的延遲
- 原生串流支援 (Streaming), 相較 RESTful 如果要實現需要借助不同的機制或協定(WebSockets, Server-Sent Events (SSE) 或長輪詢等額外技術)
- 預設使用 Protocol Buffers (Protobuf) 作為序列化格式。Protobuf 是二進位格式,傳輸效率高且輕量。`.proto` 文件具備**強型別**特性
- 可從單一的 `.proto` 文件為多種主流程式語言(如 Python, Java, Go, C++, Node.js 等)自動生成類型安全的客戶端和伺服器端程式碼,極大地簡化了跨語言服務的開發與整合
- 適合使用在微服務(microservices)內部溝通
🧐 多路復用 (multiplexing)
沒有多路復用 (類似 HTTP/1.1): 就像一條單線道的隧道。一次只能有一輛車(一個請求或回應)通過。如果前面的車開得慢(回應慢),後面的車就必須等待。如果想同時走更多車,就需要挖更多條獨立的隧道(建立多個 TCP 連接),但這樣成本很高(連接建立的開銷)。
有多路復用 (類似 HTTP/2): 就像一條擁有多條車道的高速公路。雖然整條路(TCP 連接)只有一條,但上面可以同時容納來自不同起點、前往不同終點的多輛車(多個請求和回應)並行前進,它們在各自的車道(串流 Stream)上有序行駛,互不阻塞。
## 環境安裝
```cmd
pip install grpcio grpcio-tools
```
## 定義 proto
第一步驟, 先定義 `proto`, 文檔路徑 [protos/user.proto](protos/user.proto)
這裡面定義了 message 以及 service
## 編譯
第二步驟
指令說明 (說明用, 不要使用這個指令, 原因後面說明)
``` cmd
python -m grpc_tools.protoc -I./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/user.proto
```
`-I` or `--proto_path` 指定一個目錄,作為 Protocol Buffer 編譯器 (protoc) 搜尋 `.proto` 定義檔路徑.
`--python_out=.` `--pyi_out=.` `--grpc_python_out=.` 這裡的意思都是放在當前目錄底下,
我們統一把編譯出來的放到 `service_protos` 資料夾底下 (方便管理).
指令範例
(推薦使用以下指令進行編譯,利用路徑映射將生成檔案輸出到獨立的 `service_protos` 目錄並解決 `import` 問題)
```cmd
python -m grpc_tools.protoc -Iservice_protos=./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/user.proto
```
說明 `-Iservice_protos=./protos`
`service_protos` 這將成為生成程式碼中 import 路徑的一部分.
可參考 [user_pb2_grpc.py](service_protos/user_pb2_grpc.py) 底下
```python
......
from service_protos import user_pb2 as service__protos_dot_user__pb2
......
```
可參考 [Generating gRPC interfaces with custom package path](https://grpc.io/docs/languages/python/basics/#generating-grpc-interfaces-with-custom-package-path)
## grpc server
第三步驟
✍ server 和 client 都需要編譯後的檔案.
先開啟一個 terminal 執行 server
```cmd
❯ python3 server.py
Server started, listening on 50051
```
## grpc client
✍ server 和 client 都需要編譯後的檔案.
再開啟一個 terminal 執行 client
```cmd
❯ python3 client.py
details {
id: 2
value: "twtrubiks"
}
```
## grpc interceptor
幫助你更好的管理 grpc log
```cmd
pip install grpc-interceptor
```
在 [server.py](server.py) 中, 加入底下 code
```python
......
interceptors = [ExceptionToStatusInterceptor()]
server = grpc.server(
concurrent.futures.ThreadPoolExecutor(max_workers=10),
interceptors=interceptors
)
......
```
如果你加上這個, 當發生錯誤你會更快的找到問題
加入前

加入後

## 官方範例
如果你還需要範例可參考 [https://github.com/grpc/grpc/tree/v1.72.0/examples/python](https://github.com/grpc/grpc/tree/v1.72.0/examples/python)
## Reference
* [https://grpc.io/docs/what-is-grpc/introduction/](https://grpc.io/docs/what-is-grpc/introduction/)
* [https://grpc.io/docs/languages/python/basics/](https://grpc.io/docs/languages/python/basics/)
* [https://grpc-interceptor.readthedocs.io/en/latest/](https://grpc-interceptor.readthedocs.io/en/latest/)
## Donation
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing:
綠界科技ECPAY ( 不需註冊會員 )

[贊助者付款](https://bit.ly/2F7Jrha)
歐付寶 ( 需註冊會員 )

[贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)
## 贊助名單
[贊助名單](https://github.com/twtrubiks/Thank-you-for-donate)
## License
MIT license