RPC是什么?
RPC是指远程过程调⽤,也就是说两台服务器A,B,⼀个应⽤部署在A服务器上,想要调⽤B 服务器上应⽤提供的函数/⽅法,由于不在⼀个内存空间,不能直接调⽤,需要通过⽹络来表 达调⽤的语义和传达调⽤的数据
RPC怎么做?
连接:通过在客户端和服务器之间建⽴TCP连接,远程过程调⽤的所有交换的数据都在这个连 接⾥传输
寻址:A服务器上的应⽤怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址) 以及特定的端⼝
编码:⽹络协议是基于⼆进制的,内存中的参数的值要序列化成⼆进制的形式,也就是序列 化(Serialize)或编组(marshal),通过寻址和传输将序列化的⼆进制发送给B服务器
解码:B服务器收到请求后,需要对参数进⾏反序列化(序列化的逆操作),恢复为内存中的 表达⽅式,然后找到对应的⽅法(寻址的⼀部分)进⾏本地调⽤,然后得到返回值 处理返回值:返回值还要发送回服务器A上的应⽤,也要经过序列化的⽅式发送,服务器A接 到后,再反序列化,恢复为内存中的表达⽅式,交给A服务器上的应⽤
RPC的协议有很多,⽐如最早的CORBA,Java RMI,Web Service的RPC⻛格,Hessian,Thrift, 甚⾄Rest API
Dubbo是什么?
Apache Dubbo 是⼀个⾼性能,轻量级,基于Java的RPC框架。Dubbo提供三个关键功能,包括基 于接⼝的远程调⽤,容错和负载平衡以及⾃动服务注册和发现。
1.Container:一个普通的springboot项目 引入Dubbot的Provider:提供者
2.Registry:服务注册中心 一般使用Zookeeper 提供者向注册中心注册服务 注册中心提供服务地址
3.Consumer:消费者 向注册中心拉取服务地址 也可以注册中心向消费者发送通知
4.Consumer拿到提供者地址后发起调用
5.Monitor:统计 消费者的调用次数以及提供者的调用次数以及执行的时间
Dubbo所做的事情
-
服务容器负责启动,加载,运行服务提供者(Container没接入dubbo只是一个普通的springboot项目)
-
服务提供者在启动时,向注册中心注册自己提供的服务。
-
服务消费者在启动时,向注册中⼼订阅⾃⼰所需的服务。
-
注册中⼼返回服务提供者地址列表给消费者,如果有变更,注册中⼼将基于⻓连接推送变更 数据给消费者。
-
服务消费者,从提供者地址列表中,基于软负载均衡算法,选⼀台提供者进⾏调⽤,如果调⽤失败,再选另⼀台调⽤。
软负载均衡区分于硬负载均衡(例如F5硬负均衡器),是⼀种基于软件实现的负载均衡 (例如:nginx负载均衡)
-
服务消费者和提供者,在内存中累计调⽤次数和调⽤时间,定时每分钟发送⼀次统计数据到 监控中⼼
map(调⽤id,times) map(调⽤id,int),防⽌于集装箱进⾏汇总再上报到注册中⼼
问题:为什么不是每次提供或消费就发送,而是累计定时发送呢?
如果每次都将结果和次数发到负载均衡的话,就会产生很大的网络io消耗
ZooKeeper是什么?
ZooKeeper是⼀种集中式服务,⽤于维护配置信息,命名,提供分布式同步和提供组服务
Zookeeper在Dubbo中的主要功能
当提供者出现断电等异常停机时,注册中⼼能⾃动删除提供者信息。
当注册中⼼重启时,能⾃动恢复注册数据,以及订阅请求。
当会话过期时,能⾃动恢复注册数据,以及订阅请求。
当设置时,记录失败注册和订阅请求,后台定时重试
问题:如果zookeeper挂掉了,那服务还会正常调用么?
正常是可以正常调用的,消费者会本地缓存一份调用地址,但如果提供者新增服务,那么消费者就拿不到
ZooKeeper的搭建
Linux用wget
Zookeeper下载:http://www.apache.org/dyn/closer.cgi/zookeeper
Zookeeper安装
tar -zxvf zookeeper-3.4.8.tar.gz
配置在“conf”⽬录下,新建⼀个名为“zoo.cfg”的⽂件,其中内容如下:
我是直接在当前zookeeper目录下新建了文件夹
tickTime=2000
dataDir= /usr/local/zookeeper/data (填写⾃⼰的data⽬录)
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181
Zookeeper启动
sudo ./bin/zkServer.sh start
检查启动端口
netstat -an|grep 2181
windows命令:netstat -aon|findstr “2181”
参数解析
ickTime:以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持⼼跳的时间间隔
dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的⽬录,默认 情况下,Zookeeper 将写数据的⽇志⽂件也保存到这个⽬录⾥
clientPort:这个端⼝就是客户端连接 Zookeeper 服务器的端⼝,Zookeeper 会监听这个端 ⼝,接受客户
,默认 情况下,Zookeeper 将写数据的⽇志⽂件也保存到这个⽬录⾥
clientPort:这个端⼝就是客户端连接 Zookeeper 服务器的端⼝,Zookeeper 会监听这个端 ⼝,接受客户
端的访问请求