Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
其中RPC全称为remote procedure call,即远程过程调用。Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。
节点角色说明:
Provider:暴露服务的服务提供方
Container:服务运行容器
Consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次数和调用时间的监控中心
dubbo实现远程调用提升性能最关键的是序列化和网络通信,本地对象要在网络中传输就必须要序列化,也就是实现Serializable接口,序列化的方式有很多,比如常用的json、xml、二进制流等等,其中效率最高的就是二进制流,Dubbo就是采用的二进制流。
对于网络通信来讲,不同于http需要七步(三握四挥),Dubbo采用的是Socket通信机制,可以实现长连接,反复传输数据。
是这样的zookeeper的话可以在windows或者linux下安装,其实两个的方式差不多,都是解压后简单的配置就可以,都是修改配置文件zoo_sample.cfg,可以复制一份然后重名zoo.cfg。然后编辑这个配置文件,修改修改存储目录。
将安装包拷贝到虚拟鸡,然后可以使用finalshell上传文件,这里建议把这些文件存放在一个统一的路径,不要这里装一个jdk,哪里装一个tomcat,不好管理!
找到你上传的文件,然后使用mv命令移动到你想要安装的路径第一步就是解压文件:
tar -zxvf apache-ZooKeeper-3.5.6-bin.tar.gz
第二步:配置文件
进入到conf目录拷贝一个zoo_sample.cfg并完成配置,这里也可重名,命名为zoo.cof。
#进入到conf目录
cd /software/zookeeper/apache-zooKeeper-3.5.6-bin/conf/
#拷贝
cp zoo_sample.cfg zoo.cfg
然后可以修改配置文件zoo.cfg,这里主要修改的是存储目录
#打开目录
cd /software/zookeeper/
#创建zooKeeper存储目录
mkdir zkdata
#修改zoo.cfg
vim /software/zookeeper/apache-zooKeeper-3.5.6-bin/conf/zoo.cfg
然后修改文件为刚刚创建的目录:
修改存储目录:dataDir=/software/zookeeper/zkdata
退出保存就可以了
第三步尝试启动:
cd /software/zookeeper/apache-zooKeeper-3.5.6-bin/bin/
#启动
./zkServer.sh start
然后停止呀stop、查看状态status。其实到这里就已经完成安装啦,但是对于每次启动的话,都要切换到指定的目录然后才可以使用命令启动,太麻烦啦!我们可以配置一个环境变量,方便我们快速启动服务!
#软连接
ln -s /software/zookeeper/apache-zookeeper-3.5.9-bin /software/zookeeper/zookeeper
这里有一点小坑,一定要使用绝对路径,不然会报错的!!!
然后编辑环境变量的配置文件,记得保存退出。
#打开编辑器
vim /etc/profile
#在最后
export ZOOKEEPER_HOME=/software/zookeeper/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
#保存退出后执行
source /etc/profile
检查一下环境变量是不是已经设置好了,echo $PATH,查看一下是不是配置成功。最后测试在任意的路径下能不能正常启动zookeeper。
zkServer.sh start
在windows下更好操作,解压然后编辑文件就可以,同样也是复制配置,然后修改名字,创建目录,配置存储目录,然后就是启动的话是zkServer.cmd start。环境变量的话就是想配置的话可以配置一下。
就是一个图形话的项目,然后可以方便的看到服务的消费者和提供者,以及提供的服务,测试服务等。很直观清楚的观察!下载路径apache/dubbo-admin: The ops and reference implementation for Apache Dubbo (github.com)。反正俺不建议下载最新的!找一个中间的版本下载就可以。然后下载下来后解压文件。需要安装node.js!!!
然后配置文件的话,就是修改一下注册中心的IP,如果是本机的话,不用修改就可以,如果是linux系统下的话,修改成虚拟机的ip,查看虚拟鸡的ip所使用的命令是ifconfig。
其实这里我把后面的注释啦,是因为加载不出来元数据。看的别人的教程,实际上大概可能不需要注释掉就可以。只需要加一个配置(后面讲!)
在:D:\dubbo-admin\dubbo-admin-0.6.0打开命令行窗口
运行:mvn clean package -Dmaven.test.skip=true
打包好后就可以运行啦!切换路径
cd dubbo-admin-distribution/target
执行打包后的jar包
java -jar dubbo-admin-${project.version}.jar
访问: http://localhost:38080 默认用户名和密码为 : root
首先检查一下dubbo的版本,小于2.7的更换版本就可以啦,配置文件不用修改,只需要在spring项目中添加:
不同的机器之间传递的数据怎么保证是一个,是这样的dubbo 内部已经将序列化和反序列化的过程内部封装了
我们只需要在定义pojo类时实现Serializable接口即可,一般会定义一个公共模块,让生产者和消费者都依赖该模块。
地址缓存可以体现在什么地方呐,说就是假设是这样的,注册中心挂掉啦,我们的服务是否还可以正常的进行?这是一个好问题,这么一想,注册中心不就是提供服务的吗,注册中心就挂了,那里面的服务自然也是不能在使用啦,但是事实上,注册中心挂掉后,我们的服务还是可以正常的访问的,是这样的,dubbo服务的消费者在第一次调用服务的同时会将服务的提供方的地址缓存到本地,然后以后的服务调用的话不会访问注册中心,这也可以解释在项目刚刚启动的时候,项目要加载很久!
当服务的提供者的地址发生变化的时候,注册中心会提醒服务的消费者,然后重新调用服务的同时更新地址!
[root@localhost zookeeper]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /software/zookeeper/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@localhost zookeeper]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /software/zookeeper/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
[root@localhost zookeeper]#
然后测试服务是否可以正常的进行
之前存在且访问过的服务调用是没有问题的,但是不说注册中心挂啦,所有的服务都可以正常的访问,既然挂啦就是说明坏掉了,肯定要修复的,这里只是介绍这个地址缓存的机制,不是说可以挂,没事!
服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。然后在某一时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。
dubbo 利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。使用timeout属性配置超时时间,默认值1000,单位毫秒。
超时时间的设值可以在服务的提供者设置,也可以在服务的消费者中设置,如果同时设置的话,以消费者的为主,但是不建议这样设置在消费者上,消费者不知道服务的响应大概需要多少时间,所以说超时的时间可以由服务提供!
测试:
超时时间放在服务的提供者
超时时间设置在服务的消费者
然后在调用服务的时候让当前的线程睡上两三秒,然后模拟网络延迟。然后控制台把报错。
重试的机制就是,当服务调用响应超时的情况下,dubbo会提供重试机制来重新调用服务,这样可以避免如果出现网络不好的情况下,一次请求完成,无法完成服务访问就自动断开连接,重连次数默认时2次。
设置重连次数:
@Service(interfaceClass = UserService.class,timeout = 2000,retries = 2)
测试结果:
重连次数为两次!加上之前正常的一共三次!!!
多版本就是,比如一个项目的某一个功能,在后期实行升级,但是项目已经上线了,那么就可以利用这多版本,先让一小部分的服务的消费者使用升级的服务,等正常使用然后全面实行升级后的版本。
上面的方式是灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
dubbo 中使用version 属性来设置和调用同一个接口的不同版本,
设置:
服务的提供者low
服务的提供者plus
服务的消费者:
测试结果:
想要更换版本的话只需要切换消费者调用的服务版本!!!
dubbo中的负载均衡策略一共有四种:权重随机、权重轮询、一致性Hash、最后一个我姑且叫他最优叭!
Random :按权重随机,默认值。按权重设置随机概率,按照权重然后随机,一次两次肯定看不出来呀,很多次后才能展示这种规律!
RoundRobin :按权重轮询。轮询的话就是很好理解,每一个服务轮这来,你一个我一个,但是加了权重后,比如我的权重是200,你的权重是100,然后分苹果,你一个,我一个,下一个不是你的,是我的!!!
LeastActive:最少活跃调用数,相同活跃数的随机,每次调用的时候会问问最后响应的时间,然后选择最优得!如果时一样的,那么就随机!
ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者,这也也很好理解,就是如果请求时一样的话就调用之前调用的服务。
集群容错模式:
Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。
Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。
Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster :并行调用多个服务器,只要一个成功即返回。
Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。