<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                原文出處:http://weibo.com/p/1001643875439147097368 作者: ![](https://box.kancloud.cn/2015-09-14_55f66a0c949fa.jpg) **課程大綱** [TOC] ## 一、RPC簡介 RPC協議具有語言無關、通信協議無關在大中型分布式系統中,遠程服務調用是十分關鍵的環節。RPC由于具有語言無關、簡單高效等特點,在遠程服務調用中有著廣泛應用。本文將簡單介紹一下RPC的基本概念,以及微博平臺RPC服務框架的基本原理和使用方式。 ### 1、什么是RPC? RPC(Remote Procedure Call)指遠程過程調用,是一種通過網絡調用遠程過程(或方法)的協議。RPC是基于Client/Server模式,Client端攜帶必要參數調用Server端的方法,并獲取Server端返回的方法執行結果。 、高效可靠等特點,非常適合作為分布式計算、分布式服務等遠程交互的基礎協議。RPC協議一般包括協議消息處理、網絡傳輸兩個部分,一個簡單的rpc調用過程如下圖:? ![](https://box.kancloud.cn/2015-09-14_55f66a0d085ed.jpg) 當Client調用遠程的方法時,先將要調用的方法名、參數等信息按RPC協議轉換為RPC消息,然后再通過某種傳輸協議(TCP、HTTP等)將RPC消息傳輸到Server端。Server端接到請求后將RPC消息按協議轉換為調用請求,并執行方法,將執行后的結果按類似的過程返回給Client端,完成一次RPC調用。 ### 2、RPC與HTTP、RMI等遠程通信方式比較 1)、RMI與RPC: RMI(Remote Method Invocation)是指java語言中的遠程方法調用,RMI中的每個方法都具有方法簽名,RMI客戶端和服務器端通過方法簽名進行遠程方法調用。RMI只能在java語言中使用,可以把RMI看作面向對象的java RPC。 2)、HTTP與RPC HTTP(HyperText Transfer Protocol)是應用層通信協議,使用標準語義訪問指定資源(圖片、接口等),網絡中的中轉服務器能識別協議內容。HTTP協議是一種資源訪問協議,通過HTTP協議也可以完成遠程請求并返回請求結果。HTTP的優點是簡單、易用,可理解性好、并且與語言無關;HTTP協議的缺點是協議頭比較重,一般請求到具體服務器的鏈路較長(可能會有dns解析、nginx代理等)。 相對于HTTP來說,通信層只是RPC協議的一部分,RPC可以使用TCP或者HTTP等作為通信協議。除了通信協議,RPC還包括請求序列化協議,一般RPC框架還會包括一些調度管理能力。RPC相對于HTTP的優點是能夠提供調度、管理能力,使用RPC服務的自動化程度比較高,性能也十分優秀。缺點就是相對復雜,學習成本稍高。 下面就以平臺的RPC框架Motan為例,介紹一下RPC服務的基本實現及使用方式。 ## 二、Motan RPC服務框架 ### 1、RPC服務框架 一般RPC協議中僅僅包含了client與server之間點對點的調用,在實際的使用當中,還需要考慮服務的發現與服務注銷、提供服務的多臺server的負載均衡、服務的高可用等等一系列的問題。 目前業界比較成熟的RPC框架有阿里開源的Dubbo、Facebook開源的Thrift,以及Avro、Hetty、Grpc等等,其中Thrift、Avro、Hetty、Grpc等都是性能優秀的RPC框架,偏重于跨語言序列化傳輸、在序列化方式、協議擴展、同步異步調用等方面有各自不同的優點,但在RPC服務管理方面功能較少,在分布式服務應用時還需要進行一些輔助開發。Dubbo則是一個比較完備的服務治理框架,能夠提供高性能、透明化的RPC調用,并且擁有強大的服務管理功能。Dubbo雖然功能強大,但是整個框架有些過重,應用起來略微復雜。 考慮到微服務化、動態服務治理等需求,并結合自身業務高并發、服務性能、穩定性要求較高等特點,微博平臺開發了自己的Motan RPC框架。Motan偏重于簡潔實用的服務治理功能和優秀的RPC協議擴展能力,既可以提供高效的RPC遠程調用,又能提供服務發現、服務高可用(High Available)、負載均衡、服務監控、管理等服務治理功能。通過SPI機制提供強大的擴展能力,可以支持不同的RPC協議、傳輸協議。Motan能夠無縫支持Spring配置方式使用RPC服務,通過簡單、靈活的配置就可以提供或使用RPC服務。通過使用Motan框架,可以十分方便的進行服務拆分、分布式服務部署。 ### 2、MotanRPC框架中的三個角色 在Motan框架中,RPC服務調用是由三個角色的交互完成的。首先需要一個服務的提供方Service(也可以叫做Provider),Service對外提供各種可以遠程調用的方法(Method);另外一個角色叫Client(也可以叫做Referer或Consumer),Client需要使用Service提供的遠程服務。如果僅有這兩個角色,還不能實現自動化的RPC服務,還需要第三個角色--注冊中心Registry,Registry是用來提供服務發現功能的。 當Service準備對外提供一個RPC服務時,首先需要跟Registry進行服務注冊。當Client需要使用RPC服務時,則需要跟Registry訂閱RPC服務,Registry會把對應服務信息給Client,并且在服務信息變更時,及時通知Client。Client根據Registry提供的服務信息,請求具體的一臺能夠提供指定RPC服務的服務器,完成遠程調用。Service、Client、Registry這三個角色的交互如下圖: ![](https://box.kancloud.cn/2015-09-14_55f66a0da8d8d.jpg) 例如,Server1這臺服務器跟Registry注冊了“S”這個RPC服務,Registry就保存了“Server1提供S服務”這樣一條信息。Server2也可以提供“S”服務,也向Register注冊了“S”服務。這時Register中的信息變成了“Server1和Server2都提供S服務”。當Client1需要使用S服務了,它向Register訂閱了S服務,Register告訴Client1:“Server1和Server2都提供S服務”,Client1根據某個策略選擇了調用Server1的S服務完成了RPC調用。后來,Server1不在提供S服務了,Register把這個變化告訴給了Client1,Client1就不再使用Server1的S服務,而是使用Server2的S服務完成RPC調用。 java語言在使用Motan時,Client與Service通過java接口類來進行RPC調用。例如Service端實現了com.weibo.demo.TestService接口, ?Client可以通過Motan來使用這個接口類中聲明的方法。 ### 3、Motan RPC調用流程 Motan框架中Registry、Service、Client三個角色包含的模塊以及各模塊的交互流程如下: ![](https://box.kancloud.cn/2015-09-14_55f66a12da23c.jpg) ? ? ?其中register模塊用來和注冊中心進行交互,包括注冊服務、訂閱服務、服務變更通知、服務心跳發送等功能;transport模塊用來進行遠程通信;serialize模塊將rpc請求中的參數、結果等對象進行序列化與反序列化,即進行對象與字節流的互相轉換;protocol模塊用來進行RPC服務的描述和RPC服務的配置管理;cluster模塊包含一組可以提供RPC服務的具體Server,實際請求時會根據不同的HA與負載均衡策略在一組Server中選擇一個可用的發起遠程調用。各模塊的詳細情況將在下一節進行介紹。 ## 三、Motan中各角色介紹 ### 1、Registry Motan可以支持多種Registry模塊,例如zookeeper、consul等都可以作為注冊中心使用,默認的Registry模塊使用平臺開發的Vintage配置服務。Vintage是一個基于redis的輕量級KV存儲系統,能夠提供命名空間服務、服務注冊、服務訂閱等功能。Vintage中的服務是以分組(Group)保存的,一般一個分組以機房+業務線進行命名,如yf-user-rpc。一個分組中包含若干的Service,一個Service即表示java中的一個接口類,能夠提供其中的多個方法。 每個Service下有一組能夠提供對應服務的Server,每個Server在向Registry注冊后,會定時發送心跳,向Registry匯報健康狀態。Server通過心跳開關的開啟與關閉,可以控制是否對外提供RPC服務。 Client端訂閱Service后,會從Registry中得到能夠提供對應Service的一組Server,Client把這一組Server看作一個提供服務的cluster。當cluster中的Server發生變更時,Client端的register模塊會通知Client進行更新。 ### 2、Motan Service Service端在啟動RPC服務時的主要步驟如下: 1)、首先通過配置文件生成對應的protocol信息,包括對外提供服務的端口、服務名稱、工作線程數等等 2)、向Vintage(即Registry)注冊RPC服務,包括提供服務的protocol信息、Server的ip、提供服務的端口等。 3)、打開并監聽聲明的RPC服務端口。此時服務處于已經注冊,但未正式提供服務的狀態。 4)、服務驗證通過后,打開心跳開關,Server會定時向Vintage注冊中心匯報健康狀態,此時就能正式對外提供RPC服務了。 在Service端提供服務后,由transport模塊負責監聽rpc服務的端口,并接收client端發送過來的RPC請求。一次完整的Service端處理RPC請求流程如下: 1)、監聽RPC服務端口,由transport模塊接收RPC request,transport模塊默認是使用Netty nio通過TCP長鏈接方式與Client進行通信。transport模塊收到請求后將請求轉交給serialize模塊進行解析。 2)、serialize模塊默認使用Hession對RPC請求進行解碼,將請求由字節流轉化為java對象。 3)、fliter模塊會根據請求的參數做一下過濾策略,例如調用統計、日志、請求限制等。 4)、protocol負責解析通過filter后的請求對象,根據協議分析出請求想要調用的方法及參數,然后找到提供對應服務的具體對象。 5)、具體服務對象通過反射機制完成服務中方法的調用并返回處理結果。 6)、返回結果通過filter后,在通過serialize模塊將結果對象轉換為字節流,由transport模塊發送給Client端,完成一次RPC請求的處理。 ### 3、Motan Client Motan Client端的初始化流程如下: 1)、與Service端一樣,首先會通過配置文件生成對應的protocol信息。 2)、向Registry訂閱所需的RPC服務,獲取提供對應服務的全部Server,這一組Server和HA策略模塊、負載均衡模塊一起組成了一個cluster。 3)、對每個Server建立初始鏈接。 在Client完成了初始化流程后,在調用RPC服務時,會有一個選擇Server的過程,當Server選定后的處理過程跟Server端類似。Client調用RPC的流程如下圖: ![](https://box.kancloud.cn/2015-09-14_55f66a131980c.jpg) 1)、當進行RPC請求時,會首先通過HA模塊選擇一種高可用策略,例如快速失敗、失敗選擇其他Server重試等策略,各種策略的參數可以根據需要進行設置。 2)、然后會通過負載均衡模塊從一組提供服務的Server中選擇一個可用的Server。負載均衡的策略包括一致性哈希、輪詢、并發度、權重等等。 3)、選出Server后,就對這個Server進行RPC請求,圖中的netty client是用來進行點對點的RPC請求,包含了protocol、serialize、transport模塊,請求的處理流程與Service端的流程基本一致,也是通過serialize模塊轉換請求對象,transport模塊來進行通信。 ## 四、Motan實戰 ### 1、Motan RPC基本使用方式 Motan RPC是按接口提供和調用服務,以java服務為例,一般由服務提供方聲明服務的接口類,并同時提供一個默認的RPC Client調用配置,然后將接口類與默認的Client配置xml文件一起封裝成jar包。服務提供方和服務使用方共同引入這個jar包,服務提供方對接口類進行實現并對外提供RPC服務;服務使用方加載默認Client端配置文件,直接使用RPC服務。 除了xml配置方式外,Motan也支持API方式,因為xml配置方式比較靈活,并且與spring配置加載完全兼容,一般推薦使用xml方式配置Motan服務。下面就以xml配置方式分別介紹使用Motan提供、調用RPC服務的具體步驟。 ### 2、使用Motan提供RPC服務 使用Motan提供RPC服務大致需要如下幾步: 1)、聲明RPC接口類,并實現該接口類。 2)、引入Motan相關jar包。 3)、配置服務端xml配置。 4)、部署、啟動服務,驗證服務。 5)、打開心跳開關,正式提供RPC服務 一份基礎的Service端xml配置如下: ? ![](https://box.kancloud.cn/2015-09-14_55f66a1343ad6.jpg) Motan使用了自定義的xml schema,在xml中需要引入對應的schema。Motan的xml配置中包括registry、protocol、service、referer幾個部分,其中registry與protocol是Service端與Client端都要使用的。 registry配置了注冊中心相關的屬性,包括注冊中心ip、prot、超時等;protocol配置了RPC服務相關的屬性,如工作線程數、請求超時、消息長度等;basicService配置了不同服務的公共屬性,當一個工程對外提供多個RPC Service的時候,可以把這些Service的公共屬性配置在basicService中;service則配置了具體的服務屬性,包括對外提供服務的端口、對外提供服務的具體服務實現類bean等。 除了這些基礎屬性外,每個配置標簽下還支持大量的高級屬性,如訪問控制、filter策略等等,這里就不在一一講解了。 ### 3、使用Motan調用RPC服務 使用Motan RPC服務就相對簡單一些,一般服務提供方已經給出了默認的client配置,只需要在項目中加載xml配置,就可以像使用本地的spring bean一樣直接使用RPC服務了。步驟如下: 1)、引入Motan相關jar包及RPC服務接口jar包。 2)、加載RPC接口jar包中的默認xml配置 3)、直接使用xml中聲明的refer bean。 Client端基本配置如下: ![](https://box.kancloud.cn/2015-09-14_55f66a13b73b1.jpg) 其中registry、protocol部分與Service端的配置一致。basicRefer配置是多個RPC服務時的公共配置,例如請求超時控制、服務端異常是否拋出等;referer表示對服務實現類的遠程引用,配置了使用的服務接口類等屬性。 如果想使用自定義的Client端配置,也可以按schema中的屬性單獨配置xml,加載后就可以生效。另外在Client端還可以進行一些更細化的配置包括對一個接口類中不同方法的詳細配置,可以根據具體的業務場景進行配置。 ## 五、總結 ? ? ?RPC服務在分布式系統中有著越來越廣泛的應用,本文簡單介紹了RPC的基本概念、平臺RPC框架Motan的基本結構、Motan中的三個角色的交互流程以及基本的使用方式。通過簡單配置就能夠使用RPC服務了。當然,如果需要對RPC服務進行更精細的控制,可以通過schema中的特定屬性進行配置或者使用不同擴展模塊來實現。 ## 六、課后思考 1、遠程服務的不同調用方式、RPC與HTTP的區別以及適用的場景。 2、Motan RPC框架中的三個角色及各角色之間的交互過程。 3、RPC請求的調用過程。 ------------------新兵訓練營簡介------------------ 微博平臺新兵訓練營活動是微博平臺內部組織的針對新入職同學的團隊融入培訓課程,目標是團隊融入,包括人的融入,氛圍融入,技術融入。當前已經進行4期活動,很多學員迅速成長為平臺技術骨干。 微博平臺是非常注重團隊成員融入與成長的團隊,在這里有人幫你融入,有人和你一起成長,也歡迎小伙伴們加入微博平臺,歡迎私信咨詢。 ------------------講師簡介------------------ 張雷,[@rayzhang0603](http://weibo.com/n/rayzhang0603)?微博平臺及大數據部——平臺研發高級系統研發工程師,2012年7月畢業于太原科技大學,13年加入微博平臺,先后負責開放平臺、粉服開發者、MotanRPC等后端服務架構工作,有著豐富的系統的架構設計與優化經驗。新兵訓練營第二期學員。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看