RPC是什麼
RPC(Remote Procedure Call,遠程過程調用)容許程序調用另一個地址空間的過程或者函數。
RPC的實現方式很多,可以基於常見的HTTP協議,也可以在TCP上層封裝自己的協議,由於HTTP報頭較爲冗長,性能較差,基於TCP協議的RPC可以建立長連接,速度和效率明顯。
在分佈式系統中,最重要的就是各個服務之間的RPC調用。
RPC從通信協議層面可以分爲:
- 基於HTTP文本協議
- 基於二進制協議
第一代RPC
- CORBA
- DCOM
- Java RMI
實現複雜,沒有統一標準第二代RPC
- PHPRPC
- HProse
- Thrift
實現了跨平臺和多語言第三代RPC
- dubbo
- gRPC
偏重服務治理功能
服務發現與服務註冊
客戶端發現模式
客戶端從一個服務註冊服務表中查詢,客戶端利用負載均衡算法從多個服務實例中選擇出一個,然後發出請求。
服務端發現模式
客戶端通過向代理服務器提出請求,代理服務器通過負載均衡算法,查詢服務器列表,實現服務轉發。
服務發現關鍵的服務註冊表,服務註冊表提供管理請求api的功能,常用的:
- Apache ZooKeeper
- etcd
- consul
ZooKeeper
工作模式
單點模式。有單點故障問題。
爲分佈式。在一臺機器運行多個Zookeeper實例,仍然有單點故障問題。
完全分佈式。多臺機器部署zk集羣,適合線上環境使用。
配置
tickTime=2000:客戶端與服務端維護心跳的時間間隔
dataDir:zk保存數據的目錄
clientPort:zk服務端口號
initLimit:zk服務器集羣中Follower服務器連接到Leader服務器最長能忍受的心跳時間間隔數
syncLimit:Leader與Follower之間發送數據,最長不能超過多少個tickTime
server.n=A:B:n是數字,代表是第幾臺服務器,A/B代表zk服務的ip地址
安裝
brew install zookeeper
啓動服務端
找到zk的安裝目錄,執行
./zkServer start-foreground
啓動客戶端
./zkCli
常用命令:
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: localhost:2181(CONNECTED) 1] create /server "baidu.com" //創建節點
Created /server
[zk: localhost:2181(CONNECTED) 2] get /server //獲取節點
baidu.com
cZxid = 0x10
ctime = Wed May 29 13:30:31 CST 2019
mZxid = 0x10
mtime = Wed May 29 13:30:31 CST 2019
pZxid = 0x10
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0