gRPC Python 入門到生產環境

2021-01-15 xsren

所有的代碼在 https://github.com/xsren/learning_record/tree/master/grpc,歡迎star。

一、先了解幾個概念

RPC

RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程電腦程式上請求服務,而不需要了解底層網絡技術的協議。

gRPC

gRPC是一個高性能、通用的開源RPC框架,其由Google主要由開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支持眾多開發語言。

基於HTTP/2協議提供了更好的強的應用性能(節省帶寬,減少TCP請求連接數)基於ProtoBuf定義服務,面向接口對服務進行頂層設計支持主流的程式語言,C++,Java,Python,Go,Ruby,Node.js,PHP等, 基於ProtoBuf生成相應的服務端和客戶端代碼。相比在使用Restful方式完成服務之間的相互訪問,GRPC能提供更好的性能,更低的延遲,並且生來適合與分布式系統。同時基於標準化的IDL(ProtoBuf)來生成伺服器端和客戶端代碼, ProtoBuf服務定義可以作為服務契約,因此可以更好的支持團隊與團隊之間的接口設計,開發,測試,協作等等。

protobuf

protocol buffers(簡稱protobuf)是google 的一種數據交換的格式,它獨立於語言,獨立於平臺。

protobuf是google開發的一個數據傳輸格式,類似jsonprotobuf是二進位的、結構化的,所以比json的數據量更小,也更對象化protobuf不是像json直接明文的,這個是定義對象結構,然後由protbuf庫去把對象自動轉換成二進位,用的時候再自動反解過來的。傳輸對我們是透明的!我們只管傳輸的對象就可以了

二、再學習protobuf

1、安裝protobuf

1)安裝 Protocol Compiler

參考:Protocol Compiler Installation https://github.com/google/protobuf

有兩種方式,一種是自己編譯,一種是下載然後把protoc放在/usr/bin即可。我選的後者,本地命令如下:

# 下載在 https://github.com/google/protobuf/releases 下載 protoc-3.5.1-osx-x86_64.zip# 解壓unzip protoc-3.5.1-osx-x86_64.zip -d protoc# 拷貝sudo cp protoc/bin/protoc /usr/bin/# 增加可執行的權限sudo chmod +x /usr/bin/protoc# 拷貝 include文件pcp -rf include/google /usr/local/include

2)安裝 python package

sudo pip3 install protobuf

2、運行protobuf demo

參考:

Protocol Buffer Basics: Python https://developers.google.com/protocol-buffers/docs/pythontutorialproto3和proto2的區別 https://superlc320.gitbooks.io/protocol-buffers-3-study-notes/content/proto3he_proto2_de_qu_bie.html

官方的demo實現了一個簡易通訊錄,可以將聯繫人寫入文件,並可以從文件中讀取聯繫人。

python版本3.6.0protoc版本3.5.1cd protobuf_demo# 編譯生成addressbook_pb2.pyprotoc --python_out=. addressbook.proto# 添加聯繫人python3 add_person.py address.txt# 讀取聯繫人python3 list_people.py address.txt

運行結果

三、gRPC學習

1、安裝

參考:https://grpc.io/docs/quickstart/python.html

# Install gRPCsudo pip3 install grpcio# Install gRPC tools sudo pip3 install grpcio-tools

2、運行

1) hello world

cd grpc_helloworld# 生成 helloworld_pb2.py 和 helloworld_pb2_grpc.pypython3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. helloworld.proto# 運行serverpython3 greeter_server.py# 運行clientpython3 greeter_client.py

2) route guide

一個和streaming相關的demo,支持:

A server-to-client streaming RPC.A client-to-server streaming RPC.A Bidirectional streaming RPC.

streaming 的應用場景主要是傳輸數據量比較多的情況。

cd grpc_helloworld# 生成 route_guide_pb2.py 和 route_guide_pb2_grpc.pypython3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. route_guide.proto# 運行serverpython3 route_guide_server.py# 運行clientpython3 route_guide_client.py

四、生產環境

參考:

python API doc https://grpc.io/grpc/python/index.htmlExploring Security, Metrics, and Error-handling with gRPC in Python https://blog.codeship.com/exploring-security-metrics-and-error-handling-with-grpc-in-python/gRPC Authentication https://grpc.io/docs/guides/auth.html#credential-types

生產環境的要求:

性能使用多線程提高並發。使用負載均衡的方式進行擴展。安全SSL/TLSToken-based authentication with Google擴展使用其他認證方式錯誤處理超時錯誤攔截器(python版本的攔截器還不穩定)cd grpc_product# 生產私鑰openssl genrsa -out server.key 2048# 生產公鑰openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650# 生成 helloworld_pb2.py 和 helloworld_pb2_grpc.pypython3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. helloworld.proto# 運行serverpython3 greeter_server.py# 運行clientpython3 greeter_client.py

五、讓gRPC支持Restful

參考:

gRPC with REST and Open APIs https://grpc.io/blog/coreosgrpc-gateway https://github.com/grpc-ecosystem/grpc-gatewaygRPC helloworld service, RESTful JSON API gateway and swagger UI http://www.cnblogs.com/lienhua34/p/6285829.html

可以使用使用grpc-gateway生成一個反向代理,將接收的RESTful JSON API 轉化為 gRPC。

grpc_gateway.png

# 生成的python文件用到了google.api,搞了半天,我發現居然是包含在google-cloud-translate裡面的sudo pip3 install google-cloud-translate# 安裝go依賴的包go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gatewaygo get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swaggergo get -u github.com/golang/protobuf/protoc-gen-go# 修改proto文件# 生成 gRPC golang stub 類sh gen_grpc_stub_go.sh# 需要注釋掉helloworld.pb.go第19行: import _ "github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis/google/api"# 生成 gRPC python stub 類sh gen_grpc_stub_python.sh# 生成網關代碼sh gen_grpc_gw.sh# 生成swagger代碼sh gen_grpc_gw_swagger.sh# 運行 serverpython3 server.py# 運行 clientpython3 client.py# 運行網關服務go run proxy.go# 命令行測試curl -X POST -k http://localhost:8080/v1/hello -d '{"name": "world"}'# 打開swagger測試http://localhost:8080/swagger-ui/

六、TODO:

1、深入研究grpc-gateway的高級選項。

七、疑問解答:

Question1: gRPC client能使用代理嗎?

Answer:

官方的client API並沒有提供設置proxy的選項,可行的幾種方案:

1、通過設置系統的代理$ echo $http_proxyhttp://httpproxy.mydomain:80802、通過nginx、haproxy等設置一個反向代理

Question2: protobuf的默認值是?

Answer:以下只針對proto3參考https://developers.google.com/protocol-buffers/docs/proto3

For strings, the default value is the empty string. For bytes, the default value is empty bytes.For bools, the default value is false.For numeric types, the default value is zero.For enums, the default value is the first defined enum value, which must be 0.For message fields, the field is not set. Its exact value is language-dependent. See the generated code guide for details.

Question3: gRPC如何認證和授權?

SSL/TLSToken-based authentication with Google(包含了Oauth2和JWT的方式)自己擴展,官方提供API可以自行擴展認證方式(找到了go的實現方式)

Question4: gRPC的並發問題?

多線程(不支持多進程)異步,有一個熱心網友的實現負載均衡

相關焦點

  • 三分鐘從入門到精通——Python模塊
    #Python入門教程#什麼是python中的模塊:假設您正在使用python解釋器。### operations.pyfrom utils import multiplicationresult = multiplication(2, 4)print(result)>>>8如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python裙,關注小編,並私信「01」即可進裙,領取python學習資料,會節約很多時間,
  • Python入門小迷宮,走完這個迷宮,就能掌握python編程基礎
    其實,這是一個用python做的迷宮小遊戲,非常簡單,但對於python初學者來說,還是有一定的挑戰性,但TONOW有源碼和教程,只要跟著python迷宮小遊戲的教程和相應的源碼,不僅很容易就能自己開發出這個遊戲,還能在這個過程中,掌握python編程的基礎哦!
  • Python趣味打怪:147段簡單代碼完成從入門到大師
    不要害怕學習的過程枯燥無味,這裡有程式設計師jackzhenguo打造的一份中文Python「糖果包」:147個代碼小樣,60秒一口,營養又好玩,從Python基礎到機器學習盡皆囊括。入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:例子是有趣的例子,教程也是正經教程,學習路徑清晰、系統,先一起來看看完整目錄:
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。三、python程式語言介紹Python是荷蘭人吉多·范羅蘇姆(Guido van Rossum)在1989年聖誕節期間開發的一門解釋性的腳本語言,什麼是解釋性的語言,大家可以參照百度百科(
  • Python爬蟲從入門到精通只需要三個月
    如何入門Python,為了能夠幫助大家更輕鬆的學好Python開發,Python爬數據,Python數據分析等相關理論知識,給大家共同分享自己一套Python學習生活資料,文章最後面的有附屬的相關資料,無論你是大牛還是小白,是想轉行還是想入行都可以來了解,一起不斷進步以及一起努力學習
  • 如何快速學會Python爬蟲(入門篇)
    一、爬蟲入門Python爬蟲入門一之綜述2.Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • python編程從入門到實踐:使用文件的內容
    讀取你剛創建的文件learning_python.txt中的每一行,將其中的Python都替換為另一門語言的名稱,如C。將修改後的每行都列印到屏幕上。learning_python.txt中的內容為In Python you can broaden your horizons.In Python you can get joy beyond learning.
  • python入門第四課:列表的排序、元素遍歷
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes本節介紹列表的操作,包括列表的排序、元素遍歷等操作。for語句會從列表fruits中從第一個元素到最後一個元素按順序取出值,放到變量Afruit中,然後執行縮進中的語句(本例的縮進語句即print(Afruit))。4、縮進的代碼可以有多條。這裡再多囉嗦幾句,python就是靠縮進來解析代碼邏輯的,所以python中縮進非常重要。
  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:python允許用lambda關鍵字創造匿名函數。匿名是不需要以標準的方式來聲明,比如說使用 def 語句。(除非賦值給一個局部變量,這樣的對象也不會在任何的名字空間內創建名字,上面的例子中會創建名字。)作為函數,它們也能有參數。一個完整的 lambda"語句"代表了一個表達式,這個表達式的定義體必須和聲明放在同一行。
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
    資料 | Practical Python and OpenCV 一周時間帶你入門CV
  • python爬蟲入門實戰!爬取博客文章標題和連結!
    最近有小夥伴和我留言想學python爬蟲,那麼就搞起來吧。準備階段爬蟲有什麼用呢?舉個最簡單的小例子,你需要《戰狼2》的所有豆瓣影評。最先想的做法可能是打開瀏覽器,進入該網站,找到評論,一個一個複製到文本中,保存,翻頁,接著複製,直到翻到最後一頁。
  • Python趣味打怪:60秒學會一個例子,147段代碼助你從入門到大師
    不要害怕學習的過程枯燥無味,這裡有程式設計師jackzhenguo打造的一份中文Python「糖果包」:147個代碼小樣,60秒一口,營養又好玩,從Python基礎到機器學習盡皆囊括。入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:
  • Python開發簡單爬蟲【學習資料總結】
    ;另一方面,會將新的URL補充進URL管理器,若有URL管理器中含有新的URL,則重複上述步驟,直到爬取完所有的URL 6、最後,調度器會調動應用的方法,將價值數據輸出到需要的格式。
  • 能跑源碼,還提供數據集:這裡有一個入門企業級驗證碼識別項目
    注意默認情況會安裝到全局的 Python 環境下,筆者強烈建議在虛擬環境進行,做好項目間的環境隔離,可以藉助 Virtualenv 或 Anaconda 等等實現。筆者個人使用的是 Virtualenv,如果有修改代碼需求的,可直接在 PyCharm 上操作。
  • python環境配置簡要流程
    用戶名 目錄下修改 Anaconda 配置文件 .condarc,將 -defaults 這一行刪掉即可 5、版本對應關係 首先明白各個版本對應關係: https://docs.floydhub.com/guides/environments/ 6、創建虛擬環境
  • windows上python開發環境的搭建
    對於程序開發而言,需要的就是一個良好的開發環境。對於C,C++, java等靜態性語言而言,需要通過IDE(集成開發環境)來便利開發過程;對於perl, python這種動態性語言而言,其開發環境的搭建就顯得簡單多了,只需要安裝好對應的解釋器,以及選擇一個順手的編輯器即可。
  • 計算機網絡安全之python入門基礎
    python介紹 (A)python安裝 (B)建議使用mac os或者linux系統(系統自帶)、win系統也可以需要官網下載URL:https://www.python.org/downloads/ 根據相應的系統選擇下載安裝。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • 代碼詳解:Python虛擬環境的原理及使用
    % cd test-project/% python3 -m venv venv/ # Creates an environment called venv/注意:可使用不同的環境名稱替換「venv/」。瞧!虛擬環境誕生了。