Dubbo讲解以及RPC远程调用协议以及Zookeeper讲解和搭建

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 会监听这个端 ⼝,接受客户

端的访问请求

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113575798