PRC框架學習(一)

RPC概述

RPC(Remote Procedure Call)即遠程過程調用,容許一臺計算機調用另外一臺計算機上的程序獲得結果,而代碼中不須要作額外的編程,就像在本地調用同樣。如今互聯網應用的量級愈來愈大,單臺計算機的能力有限,須要藉助可擴展的計算機集羣來完成,分佈式的應用能夠藉助RPC來完成機器之間的調用。git

RPC框架原理

在RPC框架中主要有三個角色:Provider、Consumer和Registry。以下圖所示: github

節點角色說明: 
* Server: 暴露服務的服務提供方。 
* Client: 調用遠程服務的服務消費方。 
* Registry: 服務註冊與發現的註冊中心。web

RPC調用流程

RPC基本流程圖: 
 redis

一次完整的RPC調用流程(同步調用,異步另說)以下: 
1)服務消費方(client)調用以本地調用方式調用服務; 
2)client stub接收到調用後負責將方法、參數等組裝成可以進行網絡傳輸的消息體; 
3)client stub找到服務地址,並將消息發送到服務端; 
4)server stub收到消息後進行解碼; 
5)server stub根據解碼結果調用本地的服務; 
6)本地服務執行並將結果返回給server stub; 
7)server stub將返回結果打包成消息併發送至消費方; 
8)client stub接收到消息,並進行解碼; 
9)服務消費方獲得最終結果。spring

RPC框架的目標就是要2~8這些步驟都封裝起來,讓用戶對這些細節透明。編程

服務註冊&發現

服務提供者啓動後主動向註冊中心註冊機器ip、port以及提供的服務列表; 
服務消費者啓動時向註冊中心獲取服務提供方地址列表,可實現軟負載均衡和Failover;緩存

使用到的技術

一、動態代理 
生成 client stub和server stub須要用到 Java 動態代理技術 ,咱們可使用JDK原生的動態代理機制,可使用一些開源字節碼工具框架 如:CgLib、Javassist等。服務器

二、序列化 
爲了能在網絡上傳輸和接收 Java對象,咱們須要對它進行 序列化和反序列化操做。 
* 序列化:將Java對象轉換成byte[]的過程,也就是編碼的過程; 
* 反序列化:將byte[]轉換成Java對象的過程;網絡

可使用Java原生的序列化機制,可是效率很是低,推薦使用一些開源的、成熟的序列化技術,例如:protobuf、Thrift、hessian、Kryo、Msgpack架構

關於序列化工具性能比較能夠參考:jvm-serializers

三、NIO 
當前不少RPC框架都直接基於netty這一IO通訊框架,好比阿里巴巴的HSF、dubbo,Hadoop Avro,推薦使用Netty 做爲底層通訊框架。

四、服務註冊中心 
可選技術: 
* Redis 
* Zookeeper 
* Consul 
* Etcd

負載均衡:

Nginx:高性能、高併發的web服務器;功能包括負載均衡、反向代理、靜態內容緩存、訪問控制;工做在應用層

LVS: Linux virtual server,基於集羣技術和Linux操做系統實現一個高性能、高可用的服務器;工做在網絡層

cache:

memcache、redis等

rpc框架:

grpc、dubbo、brpc

dubbo是阿里開源的Java語言開發的高性能RPC框架,在阿里系的諸多架構中,都使用了dubbo + spring boot

消息隊列:

kafka、rabbitMQ、rocketMQ、QSP

消息隊列的應用場景:異步處理、應用解耦、流量削鋒和消息通信

實時數據平臺:

storm、akka

離線數據平臺:

hadoop、spark

PS: apark、akka、kafka都是scala語言寫的,看到這個語言仍是很牛逼的

日誌:

rsyslog、elk、flume

相關文章
相關標籤/搜索