嗨,大家好,我叫葉榮宇目前在Google單人staff,Software Engineer今天要跟大家分享的是開源專案GRPC的新功能以及如何快速上手現在就讓我們開始吧GRPC是一個開源高尚能的Remove Procedural Code框架可以在任何環境下運行提供在應用程式的MicroService之間做高尚的溝通並有Low Balancing, Tracing, Health Tracking以及身份認證的支持GRPC源於一個Google內部工具Stopping普遍用於多個產品及環境Google在2015年決定要將Stopping變成一個開源專案GRPC讓更多的使用者能夠享受其所帶來的好處在2018年GRPC也正式成為CNCF的項目GRPC與Portugal Buffers有很大的關聯性Portugal Buff是一個開源的序列化資料結構的協定也是GRPC所使用的Interface Definition Language用來定義GRPC在不同的MicroService之間溝通所使用的資料結構GRPC很常被用在Surface Mesh而現在我們也推出了Processless Surface Mesh不再需要塞Card Proceed讓部署的流程更加簡單也降低開銷且減少網路延遲提高溝通效能最後使用GRPC的開發者類型很廣因為它可以在任何環境下運行包括Backend、Web以及Mobile在GRPC Github Repository上可以看到很多開發者跟我們的互動以及給我們的反饋從2005年推出以來Github上的Start Count一直在持續的增加現在所有GRPC Repository加總後的Start Count已經來到了9萬是很受開發者歡迎的開源項目除了Github之外您可能也熟悉NPM是Node.js的預設Package Manager而GRPC的Package在NPM上有每週平均700萬的下載量而拍賞的部分我們可以看到GRPC IO的平均每日下載量高達200多萬也是長期都一直在下載量的排行榜上最後是來自Maphan的數據GRPC Java的每月下載量更是高達1500萬是目前GRPC所有支持的語言當中最受歡迎的非常感謝有這麼多的開發者對GRPC的支持我們也不斷的在新增更多開發者資源給大家GRPC.io這個網站近期新增了很多開發者指南幫助大家更快速的學習各種進階的主題同時我們也聽到各位的反饋在每個開發者指南裡新增各個語言的Code examples包括Java, Go, Python, C++此外我們也拍攝了很多教學視頻歡迎訂閱我們的YouTube channel at GRPCIO在第一時間收到新的教學影片的通知現在就讓我們一起來看看GRPC有哪些新功能吧首先是關於Cogonadis的支持Gearware API是這幾年非常活躍的主題主要用於管理外部客戶端到內部服務的流量也就是所謂的南北流量GRPC從去年就開始著手對Gearware API的支持目的是讓開發者能夠更方便的使用Gearware API來管理GRPC服務的流量而不需要在已有的HTTP route上作額外的開發目前GRPC route資源已經進入了實驗性階段很快就會推進到V1 Beta1也即將在Google Cloud的Traffic Director以及其他的平台上支持Gamma Gearware API for Service Match如同大家所知Gearware API也適用於管理集群內部服務的流量也就是所謂的東西流量我們的團隊也參與了很多相關的設計與討論確保GRPC Processed Surface Match與Gamma會有很好的整合讓開發者可以統一的使用Cogonadis的資源來管理GRPC Processed Surface Match與其他的服務GRPC一直以來都致力於讓我們的Low Balancer有更好的支持而在這方面我們也推出了很多的新功能其中一項是使用用您的後端所提供的客製化指標來做Low Balancing開發者在後端提供客製化的指標數據例如現在後端的Q裡面有多少等待的項目而這個指標就可以作為GRPC Low Balancing的依據回傳指標的方法是依照Open Request Cost Aggregation的標準可以是在每一次的RPC完成後回傳數據或者是另外開一個特定的Channel專用於數據的回傳詳細的文件可以參考下方的短鏈節這些回傳的客製化指標可以在您的客製的Low Balancing Policy裡做使用或者是跟其他GRPC所提供的Low Balancing Policy一起使用例如Waited Wrong Robin使用的方法很簡單如果您有使用Google Cloud Platform的Traffic Director只需要在Localty LB policies裡面指定Waited Wrong Robin這個Custom Policy並且提供對應的參數在這個範例裡面我們會使用ORCA Auto-Band Matrix Report所以第一個參數設定為True而Aeropanel題是GRPC Client Silo Balancing會用到的參數在後面我們會看到如果您沒有使用Traffic Director也沒有關係只要在客戶端呼叫Dial的時候加上這幾行程式碼設定Default Surface Config就可以了GRPC的Waited Wrong Robin使用這個公式來決定每個後端的weight其中會考慮到CPU的使用率QPS、EPS以及Aeropanel題Aeropanel題就是上一頁客戶端所設定的參數接下來就在伺服器提供您想要使用的指標數據首先先創建一個Server Matrix Recorder然後根據您的需求客製化選項例如多久回傳一次數據接著Register這個ORCA Matrix Reporting就完成了基礎設定最後就是要在回傳數據的地方呼叫Set CPU Utilization或者Set QPS等等這樣就完成伺服器客製化指標設定以及使用GRPC為您提供的Waited Wrong Robin了另一個與Low Balancing相關的功能就是隨期化Pick First PolicyPick First是一個很簡單的Low Balancing Policy就像它的名字一樣當Nem Resolver會傳一連串的位置時我們總是選擇第一個來連線連不上就連第二個依序進行這樣的方法簡單但缺點也很明顯通常需要搭配DNS Server隨機回傳位置的順序這樣才能有比較好的Low Balancing的效果在某些情況下DNS Server並不支援隨機的順序這時候您就可以使用Randomized Pick First這個功能只要設定一個簡單的FlagShuffle Address ListGRPC Client Library就會在收到Nem Resolver回傳的位置後先幫您Shuffle順序然後再跟第一個連線詳細的文件可以參考下方的短鏈節下一個新功能叫做Steffo Session Affinity這是在Low Balancing的基礎上引入Session的概念把屬於同一個Session的RPC都送到同一個後端處理這樣後端就可以很容易地保存Session State在其中一個後端即可不需要把每一次RPC後的State同步到所有的後端資料庫實現的方式是透過Cookie來識別RPC要送到哪一個後端在送到Session的第一個Request之後依照本來Low Balancing的邏輯找到合適的後端處理當Response回到GRPC Library時我們會把這次處理Request的後端資訊加密編碼過後存入Response Header Cookie裡送回你的應用程式如果您希望接下來的Request也是送到同一個後端處理就把這個Cookie存下來作為後續使用在下次送出新的RPC的時候在Request裡面加上剛才收到的CookieGRPC Library就會試著去解碼取得對應的後端資訊並且把Request送到同一個後端處理在您的Cookie過期之前GRPC Load Balancer都會把Request送到同一個後端這樣就可以輕易地在同一個後端上保存同一個Session的Local State不需要同步到其他地方透過GCP Session Affinity Policy你可以設定Cookie的過期期限首先先創建一個Cookinitis Resource指定其類別為GCP Session Affinity Policy然後設定Cookie的有效期限以及要使用在哪一個Route或是Surface上如果你還想知道更多關於Staple Session Affinity的資訊可以參考下方鏈結這是我們今年在Cookin Europe所做的詳細介紹GRPC Resolvability是另一個新的功能幫助您更輕鬆地從應用程式收集資料儲存到Google Cloud或是其他第三方的平台來實施地監測您的應用程式的執行情況做更進一步的分析去融化您的應用程式我們透過GRPC Interceptor的架構來收集TraceMonitoring Matrix以及Login這些信息接著把這些信息輸出到分析平台的後台我們開發了一個GRPC Observability Plugin來處理這些信息這個Plugin會把應用程式的Log上傳到您指定的分析平台以Google Cloud為例您就可以使用Cloud Login看到詳細的Log來幫助您Troubleshooting這個Plugin也會把您的應用程式的Metrics以及Traces依照Open Census的標準上傳到您指定的平台以Google Cloud為例Cloud Monitoring可以給您看時時的數據Cloud Traces也可以看到每一個工作的執行時長開啟GRPC Observability的方法很簡單首先需要先設定Observability ConfigLog Metrics Trace可以獨立或合併使用以Google Cloud Platform為例您需要設定Project IDCloud Login是指定您想要關注或是排除哪些事件可以一一列舉也可以用信號表示所有事件伺服器端與客戶端是分開做設定的Cloud Monitoring是設定您想要開啟哪些指標例如同時有多少RPC在準備開始RPC又是花了多少的時間完成等等Cloud Traces可以設定Sample Rate因為Trace Data通常很多所以在這個範例裡面我們只有隨機的取5%的資料來作為代表在您的應用程式裡面呼叫Observability.start來讓GRPC Library根據您給的Config開始傳送Log Metrics和Trace到您指定的平台在結束應用程式之前記得呼叫Observability.and確保資料都成功送出以及清理資源除了上面提到的很多跟Low Balance相關的新功能以及Observability之外GRPC還有更多進階的功能除了提供客製化的後端指標之外您也可以自訂Low Balance in Policy相關的資訊可以參考短鏈接的文件另外我們也實現了RBAC HTTP Filter來支持Surface Scope客戶端授權來持續加強GRPC的Security還有前面提到了Observability目前支援Open Census標準的Metrics以及Trace我們也正在新增對Open Telemetry標準的開發最後GRPC現在有支援IPP-4跟IPP-6但還不支援同一個Endpoint上同時有IPP-4跟IPP-6的位置這部分的設計跟開發正在進行當中之後Name Resolver可以針對每個Endpoint提供多個位置而GRPC內部也會用Heavy Eyeballs來決定要跟哪一個位置做連線前面我們提到了很多GRPC跨語言的新功能除了這些之外GRPC也不斷的在提升對每個語言有更好的原聲支持例如Java的Automatic Module在Java 9以及更高的版本中每個發布的Java文件都被視為一個模組模組的名稱由Java的名稱決定使用GRPCJava的時候Automatic Module那樣會自動設為模組的名稱您不再需要明確的指定除此之外GRPCJava還有職員List Request Low Balancing也感謝Spotify在GRPC開源專案中的貢獻除了Java之外GRPC也提升對Python的原聲支持Python 2在2020年已經正式終止開發但長期以來我們一直盡力地維護對Python 2的支持因為我們知道有很多的專案還需要更長的時間來完成遷移一直以來我們也盡量減少GRPCPython本身的dependency而現在我們終於正式的把最後的幾個dependency都拿掉了並且同時與Python 2以及Python 3都相容此外我們也新增了對Mac OSM萬晶片的支援在1.51之後的release都會有Mac Universal Dynamic Libraries可以同時在舊的跟新的Mac OS上執行除了提升對每個語言的原聲支持之外我們也致力於升級所有的功能例如GRPCC Core Event EngineEvent Engine是一個提供給應用程式的全新Public Interface用於客製化一部工作的執行進而創造更多的可能性例如由外部的Event Loop來驅動GRPC的執行使用Event Engine的方法很簡單首先先創建您自己的Class來實現Event Engine這個Interface選擇您想要附寫的Operation例如RAM, CANCEL, CONNECT等等然後定義您想要執行的工作內容最後就是在您的應用程式開始使用GRPC之前設定Event Engine Factory為您所定義的Class即可在不久後的將來我們也會開放每個Channel或是每個Server有自己的Event Engine這樣應用程式就可以在更細緻的去客製化不同的Channel跟Server之間的行為詳細的內容可以參照下方的短鏈節除了Event Engine之外GRPC C++也升級了現有的迴調方式提供了新的Callback API讓使用者更容易的調用不再需要另外去創建一個Thread定期去Pull in completion queue更重要的是其效能跟擴充性甚至更好因為當RPC完成的時候GRPC會直接調用您應用程式裡的Callback Function減少Pulling所造成的時間差有更及時的回饋根據GRPC Channel的類別Unary、Client Streaming、Server Streaming跟By Directional Streaming所提供的Reactor Interface有些微的不同但主要都分為三大類第一類是開始執行特定的Operation例如Start Read、Start Write、Finish您的應用程式可以呼叫這些Method讓GRPC Library知道要開始執行這些動作第二大類是在某一個Operation結束後呼叫您的應用程式所指定的Callback Function例如Unread Done、Unwrite Done、Uncancel第三大類則是讓您的應用程式來控制一部工作的執行例如Add HoldGRPC C++的Callback API會讓您的開發變得更簡潔、方便詳細的內容也請參考下方的短鏈節在升級現有的功能的同時我們也在擴充每個功能在不同語言上的支持在GRPC Go裡面我們引入了新的Channel State IDLE在連線介入後會進入Ready State而後如果有一段時間沒有使用RPC我們則會暫時地把Channel State調整為IDLE並且關在Open Connections來節省資源等到下一個RPC進來時再自動重新建立連線應用程式不需要做額外的處理這個功能之前在Java跟C Core都已經實現了現在我們也在GRPC Go裡面加上相同的功能而您可以加入以下的程式碼來設定您想要的IDLE State最後我們也持續地提升開發者工具為您提供更好的使用者體驗GRPC Debug是一個Command Line Interface的開源工具用來擷取GRPC Library內部的Channel State確認某個Service的健康狀態或是獲取XDS的相關資訊幫助您更容易的Debug如果你還沒有使用過可以到Github上面找GRPC DebugGRPC Curl也是一個開源的Command Line Tool讓你可以更輕鬆地用類似Curl的方式來送GRPC Request給您的伺服器最後是在GRPC Project裡面的Cooperatix Interrupt Test Framework有興趣的朋友也可以到我們的Github了解更多的細節以上我們介紹了很多GRPC的最新資訊最後我想再跟大家分享一些GRPC的資源GRPC.io是我們的官網上面有豐富的開發者指南讓你能夠快速地了解並開始使用GRPC我們也剛成立了一個YouTube Channel接下來會發佈更多的教學視頻歡迎您訂閱我們的頻道獲得最新的視頻通知最新的產品資訊我們也都會發佈在我們的Blog上面如果你有任何關於GRPC的問題或反饋歡迎到Github或是Google Groups留言我們都會定期回覆最後謝謝您的觀看期待之後有更多的資訊與大家分享