在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
所以,RPC的框架來了,阿里內部使用HSF,以及開源的RPC 框架:Dubbo。
RPC框架的核心設計
前面Mike提到了RPC的核心目標:主要是解決分佈式系統中服務之間的調用問題。
其實,走到這一步涉及的知識體系非常的多:要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所採用的語言的實現都有清楚的理解。
1.RPC框架三個核心角色
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
所以,RPC的框架來了,阿里內部使用HSF,以及開源的RPC 框架:Dubbo。
RPC框架的核心設計
前面Mike提到了RPC的核心目標:主要是解決分佈式系統中服務之間的調用問題。
其實,走到這一步涉及的知識體系非常的多:要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所採用的語言的實現都有清楚的理解。
1.RPC框架三個核心角色
1)服務提供者(Server)
對外提供後臺服務,將自己的服務信息,註冊到註冊中心
2)註冊中心(Registry)
用於服務端註冊遠程服務以及客戶端發現服務。
目前主要的註冊中心可以藉由 zookeeper,eureka,consul,etcd 等開源框架實現。
比如:阿里的Dubbo就是採用zookeeper實現註冊中心。
3)服務消費者(Client)
從註冊中心獲取遠程服務的註冊信息,然後進行遠程過程調用。
2.RPC遠程調用過程
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
所以,RPC的框架來了,阿里內部使用HSF,以及開源的RPC 框架:Dubbo。
RPC框架的核心設計
前面Mike提到了RPC的核心目標:主要是解決分佈式系統中服務之間的調用問題。
其實,走到這一步涉及的知識體系非常的多:要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所採用的語言的實現都有清楚的理解。
1.RPC框架三個核心角色
1)服務提供者(Server)
對外提供後臺服務,將自己的服務信息,註冊到註冊中心
2)註冊中心(Registry)
用於服務端註冊遠程服務以及客戶端發現服務。
目前主要的註冊中心可以藉由 zookeeper,eureka,consul,etcd 等開源框架實現。
比如:阿里的Dubbo就是採用zookeeper實現註冊中心。
3)服務消費者(Client)
從註冊中心獲取遠程服務的註冊信息,然後進行遠程過程調用。
2.RPC遠程調用過程
1)服務調用方(client)調用以本地調用方式調用服務;
2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;在Java裡就是序列化的過程
3)client stub找到服務地址,並將消息通過網絡發送到服務端;
4)server stub收到消息後進行解碼,在Java裡就是反序列化的過程;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行處理邏輯;
7)本地服務將結果返回給server stub;
8)server stub將返回結果打包成消息,Java裡的序列化;
9)server stub將打包後的消息通過網絡併發送至消費方
10)client stub接收到消息,並進行解碼, Java裡的反序列化;
11)服務調用方(client)得到最終結果。
RPC框架的目標就是要2~10這些步驟都封裝起來。
RPC框架涉及技術
1.建立通信
首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裡傳輸。
2.服務尋址
1)服務註冊
首先需要把服務註冊到服務中心。其實就是在註冊中心進行一個登記,註冊中心存儲了該服務的IP、端口、調用方式(協議、序列化方式)等。在zookeeper中,進行服務註冊,實際上就是在zookeeper中創建了一個znode節點,該節點存儲了上面所說的服務信息。
2)服務發現
服務消費者在第一次調用服務時,會通過註冊中心找到相應的服務的IP地址列表,並緩存到本地,以供後續使用。當消費者調用服務時,不會再去請求註冊中心,而是直接通過負載均衡算法從IP列表中取一個服務提供者的服務器調用服務。
3)註冊服務
可靠的尋址方式(主要是提供服務的發現)是RPC的實現基石,比如可以zookeeper來實現註冊服務等等。
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
所以,RPC的框架來了,阿里內部使用HSF,以及開源的RPC 框架:Dubbo。
RPC框架的核心設計
前面Mike提到了RPC的核心目標:主要是解決分佈式系統中服務之間的調用問題。
其實,走到這一步涉及的知識體系非常的多:要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所採用的語言的實現都有清楚的理解。
1.RPC框架三個核心角色
1)服務提供者(Server)
對外提供後臺服務,將自己的服務信息,註冊到註冊中心
2)註冊中心(Registry)
用於服務端註冊遠程服務以及客戶端發現服務。
目前主要的註冊中心可以藉由 zookeeper,eureka,consul,etcd 等開源框架實現。
比如:阿里的Dubbo就是採用zookeeper實現註冊中心。
3)服務消費者(Client)
從註冊中心獲取遠程服務的註冊信息,然後進行遠程過程調用。
2.RPC遠程調用過程
1)服務調用方(client)調用以本地調用方式調用服務;
2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;在Java裡就是序列化的過程
3)client stub找到服務地址,並將消息通過網絡發送到服務端;
4)server stub收到消息後進行解碼,在Java裡就是反序列化的過程;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行處理邏輯;
7)本地服務將結果返回給server stub;
8)server stub將返回結果打包成消息,Java裡的序列化;
9)server stub將打包後的消息通過網絡併發送至消費方
10)client stub接收到消息,並進行解碼, Java裡的反序列化;
11)服務調用方(client)得到最終結果。
RPC框架的目標就是要2~10這些步驟都封裝起來。
RPC框架涉及技術
1.建立通信
首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裡傳輸。
2.服務尋址
1)服務註冊
首先需要把服務註冊到服務中心。其實就是在註冊中心進行一個登記,註冊中心存儲了該服務的IP、端口、調用方式(協議、序列化方式)等。在zookeeper中,進行服務註冊,實際上就是在zookeeper中創建了一個znode節點,該節點存儲了上面所說的服務信息。
2)服務發現
服務消費者在第一次調用服務時,會通過註冊中心找到相應的服務的IP地址列表,並緩存到本地,以供後續使用。當消費者調用服務時,不會再去請求註冊中心,而是直接通過負載均衡算法從IP列表中取一個服務提供者的服務器調用服務。
3)註冊服務
可靠的尋址方式(主要是提供服務的發現)是RPC的實現基石,比如可以zookeeper來實現註冊服務等等。
- 服務提供者啟動後主動向服務(註冊)中心註冊機器ip、端口以及提供的服務列表。服務消費者啟動時向服務(註冊)中心獲取服務提供方地址列表,可實現軟負載均衡和Failover。提供者需要定時向註冊中心發送心跳,一段時間未收到來自提供者的心跳後,認為提供者已經停止服務,從註冊中心上摘取掉對應的服務等等。
3.網絡傳輸
數據傳輸採用什麼協議,數據該如何序列化和反序列化
4.NIO通信
當前很多RPC框架都直接基於netty這一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。
5.服務調用
比如:B機器進行本地調用(通過代理Proxy)之後得到了返回值,此時還需要再把返回值發送回A機器,同樣也需要經過序列化操作,然後再經過網絡傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值之後,則再次進行反序列化操作
總之,要實現一個RPC不算難,難的是實現一個高性能高可靠的RPC框架,後續將結合Dubbo的實現一起再探討。
覺得不錯請點贊支持下。
----end----
Mike的《架構進階專題》又更新干貨了,目前該專題已超過100期+。內容涵蓋:數據結構和算法、Java高級特性、Java web核心、數據庫、Java框架與必備工具、系統架構設計等,希望能真正幫助到想要從程序員進階為高級Java、架構師之路的朋友。
領取過的童鞋,按照之前提供鏈接即可訪問獲取。還沒領過的童鞋,文末有鏈接獲取方法。
在Mike過去持續分享的阿里Java面試題及面經中,幾乎每次的面試題目中都會問到Dubbo相關問題,比如:“從0到1設計一個Dubbo的RPC框架,說說你的方法與步驟”,這個問題主要考察以下幾個方面:
- 你對RPC框架的底層原理掌握程度。
- 考驗你的整體RPC框架系統設計能力。
Mike將這部分知識棧進行了梳理並分享給大家,希望對擴充知識棧、通過技術面試有所助力。
RPC和RPC框架
1.RPC(Remote Procedure Call)
即遠程過程調用, 主要解決遠程通信間的問題,不需要了解底層網絡的通信機制。
2.RPC框架
RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式、以及通信細節。
實際使用中,並不需要關心底層通信細節和調用過程,讓業務端專注於業務代碼的實現。
國內大家熟知的PRC框架,阿里的HSF和Dubbo(開源)
Dubbo的發展由來
1. 業務規模小
比如早期一個應用Java War包,將所有功能都打包,部署在一個單機服務器,調用接口也比較方便,不涉及到任何分佈式場景。
2.業務規模變大
隨著業務的快速發展,業務越來越多、子系統也越來越多時。比如:淘寶的交易系統、商品系統、用戶系統、評價系統...上百個系統的出現。
系統變得越來越複雜,業務代碼依然耦合在一起。比如最早期的淘寶denali工程,包含所有業務系統的代碼,就僅打包部署都需要很長的時間。
並且,隨著每個業務線的快速發展,業務代碼耦合在一起,上線後出現問題急需要回滾代碼,拉分支、大量的代碼merge工作,這個過程極其痛苦。
這個時候,你會發現技術已經成了業務的瓶頸,急需把業務單獨抽離出來,各自單獨部署。
3.Dubbo和HSF的出現
應用系統一旦涉及到拆分部署,問題就來了,急需一種高效的應用程序間的通訊手段來完成這種需求,這就會涉及到分佈式遠程調用。
於是,淘寶就把denali按照業務為單位拆分成了類似這樣的系統:UM(UserManger)、SM(ShopManager)..等等幾十個工程代碼。
再按照業務為單位,把所有調用相關的接口以業務為單元進行拆分:UIC(用戶中心服務)、SIC(店鋪中心服務)...等等以業務為單位集群部署,按照業務提供服務。
所以,RPC的框架來了,阿里內部使用HSF,以及開源的RPC 框架:Dubbo。
RPC框架的核心設計
前面Mike提到了RPC的核心目標:主要是解決分佈式系統中服務之間的調用問題。
其實,走到這一步涉及的知識體系非常的多:要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所採用的語言的實現都有清楚的理解。
1.RPC框架三個核心角色
1)服務提供者(Server)
對外提供後臺服務,將自己的服務信息,註冊到註冊中心
2)註冊中心(Registry)
用於服務端註冊遠程服務以及客戶端發現服務。
目前主要的註冊中心可以藉由 zookeeper,eureka,consul,etcd 等開源框架實現。
比如:阿里的Dubbo就是採用zookeeper實現註冊中心。
3)服務消費者(Client)
從註冊中心獲取遠程服務的註冊信息,然後進行遠程過程調用。
2.RPC遠程調用過程
1)服務調用方(client)調用以本地調用方式調用服務;
2)client stub接收到調用後負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;在Java裡就是序列化的過程
3)client stub找到服務地址,並將消息通過網絡發送到服務端;
4)server stub收到消息後進行解碼,在Java裡就是反序列化的過程;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行處理邏輯;
7)本地服務將結果返回給server stub;
8)server stub將返回結果打包成消息,Java裡的序列化;
9)server stub將打包後的消息通過網絡併發送至消費方
10)client stub接收到消息,並進行解碼, Java裡的反序列化;
11)服務調用方(client)得到最終結果。
RPC框架的目標就是要2~10這些步驟都封裝起來。
RPC框架涉及技術
1.建立通信
首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接裡傳輸。
2.服務尋址
1)服務註冊
首先需要把服務註冊到服務中心。其實就是在註冊中心進行一個登記,註冊中心存儲了該服務的IP、端口、調用方式(協議、序列化方式)等。在zookeeper中,進行服務註冊,實際上就是在zookeeper中創建了一個znode節點,該節點存儲了上面所說的服務信息。
2)服務發現
服務消費者在第一次調用服務時,會通過註冊中心找到相應的服務的IP地址列表,並緩存到本地,以供後續使用。當消費者調用服務時,不會再去請求註冊中心,而是直接通過負載均衡算法從IP列表中取一個服務提供者的服務器調用服務。
3)註冊服務
可靠的尋址方式(主要是提供服務的發現)是RPC的實現基石,比如可以zookeeper來實現註冊服務等等。
- 服務提供者啟動後主動向服務(註冊)中心註冊機器ip、端口以及提供的服務列表。服務消費者啟動時向服務(註冊)中心獲取服務提供方地址列表,可實現軟負載均衡和Failover。提供者需要定時向註冊中心發送心跳,一段時間未收到來自提供者的心跳後,認為提供者已經停止服務,從註冊中心上摘取掉對應的服務等等。
3.網絡傳輸
數據傳輸採用什麼協議,數據該如何序列化和反序列化
4.NIO通信
當前很多RPC框架都直接基於netty這一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 作為底層通信框架。
5.服務調用
比如:B機器進行本地調用(通過代理Proxy)之後得到了返回值,此時還需要再把返回值發送回A機器,同樣也需要經過序列化操作,然後再經過網絡傳輸將二進制數據發送回A機器,而當A機器接收到這些返回值之後,則再次進行反序列化操作
總之,要實現一個RPC不算難,難的是實現一個高性能高可靠的RPC框架,後續將結合Dubbo的實現一起再探討。
覺得不錯請點贊支持下。
----end----
Mike的《架構進階專題》又更新干貨了,目前該專題已超過100期+。內容涵蓋:數據結構和算法、Java高級特性、Java web核心、數據庫、Java框架與必備工具、系統架構設計等,希望能真正幫助到想要從程序員進階為高級Java、架構師之路的朋友。
領取過的童鞋,按照之前提供鏈接即可訪問獲取。還沒領過的童鞋,文末有鏈接獲取方法。
《架構師進階專題》領取方法
關注+轉發本篇文章,然後私信關鍵詞 【架構】,即可獲取。
重要的事情說三遍,關注+轉發、關注+轉發、關注+轉發,然後私信關鍵詞 【架構】,即可獲取~