微服務治理平臺的RPC方案實現

導讀:本文主要探討了rpc框架在微服務化中所處的位置,需要解決的問題。同時介紹了用友雲微服務治理平臺的rpc解決方案,爲什麼選擇該方案、該方案提供的好處是什麼。同時也會介紹用友RPC框架的基本結構以及在實現時所用到的一些關鍵技術。希望通過本文讀者能夠一窺用友rpc框架的原理,並藉此開發出更優秀的微服務應用。

一、rpc在微服務中的重要性

  隨着越來越多的公司向着互聯網方向轉型,服務化這個概念已經深入人心。而rpc框架無疑是微服務中的重要一環。rpc框架的基本功能是將遠程調用模擬成本地調用。調用本地函數很簡單,傳入參數執行邏輯獲得返回值就可以了。但是實現一個遠程調用就要考慮的多一些:
微服務治理平臺的RPC方案實現
  如圖所示,調用和服務雙方就不得不考慮在調用過程中產生的一些序列化、服務尋址、超時、異步、上下文管理等非業務問題,這些問題並不是開發者的核心問題,但是繁雜遠程調用實現卻爲開發者帶來了巨大的工作量,這就爲業務開發團隊帶來了一個不小的困擾。因此使用一個統一的rpc框架在應用微服務化進程中是相當重要的。
  此外rpc框架還能夠實現公司不同團隊開發的異構應用提供互相調用的需求,通過統一的rpc調用框架java、go、python等語言開發的應用可以互相使用已存在的服務接口,解放了團隊技術棧的限制、實現了各種服務實現上的解耦。
微服務治理平臺的RPC方案實現
  rpc調用框架是微服務化的必要條件,rpc框架的性能、功能、特性直接決定了微服務項目最終的表現。總而言之,搞微服務先要搞定RPC框架才行。

二、rpc過程中需要解決的4個問題

微服務治理平臺的RPC方案實現
  一個rpc框架至少要有上圖中的幾個調用流程:
  1)調用端發出調用方法(服務)的請求
  2)ClientStub先進行服務發現,找到需要調用的服務,然後進行請求接口、方法、參數以及服務地址、請求Id的封裝,包裝成請求對象、序列化——編碼,最後傳輸到網絡上去
  3)服務端經過網絡接受到請求
  4)ServerStub進行字節流的反序列化、解析請求查×××端的實現代碼、發送參數到執行
  5)服務端的實現將返回值發送給ServerStub處理
  6)ServerStub將result、返回狀態碼、請求id等進行包裝成返回信息、序列化——編碼、傳輸
  7)ClientStub得到字節流,進行反序列化、解析返回值,將結果返給調用端
  8)調用端最終得到結果
  通過上面的調用流程我們可以總結出以下幾點在實現rpc框架時要解決的重點問題:
  1.確定rpc請求攜帶的信息
  rpc調用需要封裝被調用方法的相關信息,這些信息需要進行編碼。確定傳輸數據的數據結構。
  2.序列化
  確定了rpc請求消息內容要進行發送還需要爲rpc框架選擇一套可靠地序列化反序列化方案。目前序列化方案衆多,我們要從rpc框架的需求出發選擇合適的方案。序列化方案會對rpc的調用性能造成較大的影響我們一般將以下幾點作爲參考進行選擇:

  • 通用性,主要指序列化框架對各種不同對象序列化的能力,例如序列化方案是否能支持較複雜的類型、數組、泛型等。序列化框架的通用性越好對用戶編寫業務結構的限制就越小。
  • 性能,性能是選擇序列化方案的重要指標,一個工程可能很多功能模塊都要調用微服務,有些微服務調用可能很頻繁,每次微服務調用都會進行序列化和反序列化,如果選擇的序列化方案效率低下會極大地影響整個系統的效率
  • 擴展能力,序列化方案還要考慮可擴展性,在開發過程中一套序列化方案可能並不能夠支持所有的需求,這就要求序列化方案具備一定的擴展能力。通過擴展接口能夠處理特殊需求的
      3.網絡通信問題
      消息序列化之後就是網絡通信了,nio、netty等、http通訊框架都可以進行網絡通訊,這方面可以根據具體需求來進行選擇。
      4.服務發現
    微服務上線後,提供服務的地址可能是動態變化的。當服務地址產生變化時有可能不是一個實例而是多個實例進行變化。這時調用端的調用地址必然是需要作出改變的。爲了滿足這一需求rpc框架必須能夠自動的發現提供服務的地址變化並實時更改,這樣就需要一個服務註冊和服務發現的框架。市面上流行的rpc框架例如dubbo使用的zookeeper,springcloud使用的是eureka.這些框架都各有各的優勢和缺點。

    三、常見的3種開源rpc方案

      下面我們介紹幾種常見的開源rpc方案:
      1.gRPC
      grpc是Google發佈的開源RPC框架,使用HTTP/2協議並用ProtoBuf作爲序列化工具。並且提供多種語言的客戶端擁有非常豐富而實用的特性。
      2.Dubbo/Dubbox
      dubbo是阿里開源的RPC框架,和Spring框架結合使用很方便。該框架資料豐富使用廣泛。dubbo曾經停止維護了一段時間,不過目前貌似又重啓了孵化項目。
      噹噹在dubbo的基礎上經過自己的改進又實現了dubbox框架並且是實現了對REST的支持。
      3.Spring Cloud
      Spring Cloud 基於Spring Boot發展了一套rpc調用框架,但是不單單侷限於rpc調用,它還具有配置管理,服務發現,斷路器,智能路由,微代理,控制總線等相關功能,具有一整套的解決方案。Spring Cloud 整合了很多業界成熟的解決方案,例如Netflix、Kafka、Eureka、Zookeeper等可以根據自己項目需求進行自由選擇

    四、用友雲rpc方案

      1.開源方案的不足:
      gRPC和Dubbo的性能和效率不錯,但是這兩個RPC框架缺乏對於大型項目的配套解決方案,很多功能可能需要自行開發或者使用第三方的插件支持。
      Spring Cloud雖然解決方案較爲完善,但是並不能很好地支撐公司項目在註冊、發現,動態和可視化配置,限流熔斷,鏈路追蹤、分析,異步調用,數據一致性處理,API網關等方面的需求。
      這些開源框架的缺點導致其不能完美的覆蓋用友雲面向企業級應用時所產生的獨特需求,因此我們決定自研一款rpc解決方案來解決這些問題,最終產品就是用友雲rpc調用框架iris
      2.用友雲rpc調用框架iris方案的幾個特點:
      1)可插拔的序列化機制:用友RPC遠程調用框架iris在序列化方面採用了可插拔的實現方式,並且預置了兩種序列化方案:json序列化、hessian序列化。
    微服務治理平臺的RPC方案實現
      iris框架通過序列化器可插拔的方式加載不同的序列化實現,在rpc調用過程中按照不同的需求使用不同的序列化實現將原始對象序列化爲可傳輸數據。在iris框架中普通的rpc調用時通過hessian序列化的,而當面臨一些特殊的需求時,例如遠程調用傳遞的參數或返回值在服務方並沒有對應的實現類,這時就可以通過json序列化完成調用,而不必因爲hessian序列化的特性導致無法發送rpc調用請求。
      2)豐富的對象類型:在通用性方面iris框架能夠支持簡單對象、複雜對象、數組、集合、泛型等多種參數和返回值類型,充分滿足業務方對調用接口的各種需求。同時因爲支持類型廣泛,對老舊項目升級也更流暢,原始的接口不用花費太大代價就能改造成微服務。
      3)獨特的服務註冊和服務發現機制,這套機制主要由服務註冊中心、服務元數據、iris服務發現機制組成。

  • 服務註冊中心脫胎於eureka,並通過增加權限校驗機制有機的和用友雲的用戶系統結合在一起。註冊中心通過http協議完成微服務註冊和微服務信息下發,因此能夠穿透多層網絡、nginx代理等,能夠較好的適應複雜網絡環境。此外註冊中心還負責維護微服提供者的實時狀態,及時剔除死亡實例
  • 元數據則是存儲於用友雲平臺中的RPC遠程調用接口的描述信息,通過元數據用友雲平臺能夠方便的收集微服務api信息,並且爲後面的可視化管理以及數據分析打好基礎。
  • iris服務發現機制能夠從微服務註冊中心獲得被調用微服務的訪問地址,並且在存在多個服務實例時優先選擇較近網絡環境的實例。
      4)精準的異常處理機制:遠程異常處理機制是iris框架在遠程實現發生異常時,調用端能夠快速追蹤問題的保證。
    微服務治理平臺的RPC方案實現
      這套機制把異常分爲三種類型:聲明異常、未聲明異常、框架異常。並且將遠程異常按照一定的規則序列化後傳輸到調用端,最終將異常在調用端拋出。使得rpc框架的異常能夠像本地異常一樣進行處理。此外對異常進行分類處理使得調用者能夠清晰的分別異常是自己調用的代碼錯誤、框架錯誤、還是遠程實現發生了錯誤。藉此能夠快速的分析定位問題,節省開發人員的時間和精力。
      5)能力擴展機制,能力擴展機制是iris框架爲框架本身的功能開發預留的擴展接口,同時這套接口也能夠提供給第三發開發者實現自己的邏輯。
    微服務治理平臺的RPC方案實現
      上圖是iris框架中一套基本的rpc調用鏈條,在這條鏈條中的幾個關鍵節點參數封裝、序列化、數據接收、尋找實現類、執行實現等我們都預留了擴展點,通過這些擴展點我們可以根據需求將功能邏輯作爲插件插入到執行流程中
      6)擴展用戶機制與安全校驗
      iris框架是用友雲平臺針對企業級微服務化開發的基礎的RPC框架,只有一套RPC框架是不能夠稱之爲微服務的。通過能力擴展機制iris框架引入了豐富的微服務核心功能。目前這套機制支撐了服務限流、異步編程、配置中心、鏈路追蹤、一致性框架等平臺功能,通過擴展機制用戶可以簡單的加載特定的依賴模塊,無侵入的選用用友雲平臺的微服務擴展功能。
    微服務治理平臺的RPC方案實現
      iris安全校驗融合了用友雲平臺的權限校驗機制,使得用戶能夠通過用友雲平臺的權限機制來管理微服務api.只有通過安全校驗的微服務才能夠註冊到相應的開發者名下,同時開發者可以通過前端可視化界面決定微服務api的私有、公有、調用權限、管理權限。
    微服務治理平臺的RPC方案實現
      3.方案總結:
      iris框架是用友雲平臺針對企業級微服務開發推出的RPC調用框架,作爲整個用友微服務解決方案的組成部分,該框架爲平臺提供了穩定高效的遠程調用解決方案,並在這套方案的基礎上提供了搭建其他微服務核心功能的骨架。同時iris框架也充分考慮到了用戶易用性等需求使用iceberg依賴封裝、isolate內部類隔離等機制打造了一套低侵入的代碼引入方案,方便工程的改造和升級。
      截至目前爲止iris框架已經歷經了多次迭代和升級,並且支撐了用友雲平臺大量應用的開發,在嚴峻的功能和性能的需求中得到了產品質量的驗證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章