1. 程式人生 > >微服務治理平臺的RPC方案實現

微服務治理平臺的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框架已經歷經了多次迭代和升級,並且支撐了用友雲平臺大量應用的開發,在嚴峻的功能和效能的需求中得到了產品質量的驗證。