实现dubbo+zookeeper+spring 纯maven项目开发
参考: https://zhuanlan.zhihu.com/p/66482965
首先,1. dubbo+spring 2.dubbo+SpringBoot,这一次我介绍的是第一种 dubbo+spring
整个工程的架构分为三个部分:
第一部分:接口,面向接口编程的思想
第二部分:服务消费者,Consumer
第三部分:服务提供者,Provider
我们为了试验这三个东西,创建maven项目,然后在里面添加三个模块,操作步骤如下:
首先创建一个maven项目,如果出现maven项目中没有pom.xml和SRC文件目录,参考本作者得其他的博客
然后在项目中创建模块(module),如下图所示,因为是在maven项目下的两个maven作为两个项目,所以不需要存在父类工程,所以父工程设置为none

这就是面向接口的编程思想,在dubbo-service里面是接口,dubbo-consumer和dubbo-provider都是依赖于dubbo-service,需要引入依赖来建立dubbo-consumer和dubbo-servicer,dubbo-provider和dubbo-service的关系。


第一部分:1.在接口里写我们的方法,然后这就是面向接口的编程

2.
2.1 分别在dubbo-consemer和dubbo-provider里面添加依赖,就是把dubbo-service添加到dubbo-consemer和dubbo-provider里面去,参加下图左边,这是作为两者与dubbo-service的连接的地方
2.2 然后,先在dubbo-provider,添加dubbo的依赖和zookeeper客户端的依赖(见下图)
在项目中resources里面添加配置文件 dubbo-provider.xml文件,主要是定义 应用服务名称,协议和接口, 以及发布到哪里(注册中心的地址), 以及发送什么(定义服务的提供者)
2.3 然后需要在项目中添加main函数,来启动dubbo,上传服务到zookeeper。这里记住要关闭防火墙,记住报错的类型,一般需要连接虚拟机的时候需设置防火墙

<dependencies>
<dependency>
<groupId>com.cn</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.2步骤:


这里面的 dubbo:application name 就是给应用起一个名字, dubbo:protocol port 协议的端口需要固定设置,
<dubbo:registry protocol="zookeeper" address="192.168.0.22:2181"/> 这里面的address是安装zookeeper的虚拟机的地址和端口, 这个端口需要在虚拟机里面防火墙里面打开,不然会提示下面的无法连接的错误。<bean id="userServices" class="com.qingfeng.services.impl.UserServiceImp"/> 这里面是实现类,即指的是dubbo-provider下的实现类,这是服务提供者
<dubbo:service interface="coms.qingfeng.servicess.IUserServices" ref="userServices"/> 定义接口,指的是 dubbo-provider所依赖的接口dubbo-service里面的东西,这里做了测试,三个项目的目录结构不一样也是没有问题的,照样可以发布出去。
2.3 main函数

启动之后会出现的问题是:
错误提示:
Caused by: java.lang.IllegalStateException: Zookeeper is not connected yet!
表示,就是防火墙把访问拦截了, 我们需要的重现设置一下防火墙
我们找到iptables,然后编辑设置, 防火墙是在系统设置里面,所以我们先找到 cd /etc/sysconfig/iptables 然后编辑防火墙 vim iptables 然后重启防火墙,
如果不知道重庆命令,看报错的提示的,service iptables testart 如果报错,则选择 systemctl restart iptables.service

到注册中心我们可以看到,已经有服务了,
2.4 消费者
首先也是添加dubbo和zookeeper的依赖, 因为都是要使用到注册中心的, 具体的可以参看图,参见2.3步骤
我们向dubbo-consumer里面的pom.xml添加dubbo和zkclient的依赖,然后配置一下端口(在resources里面新建一个xml文件,在该文件里面添加端口)

这里面是配置的文件的

这是main函数里面开始调用我们的东西,

在上图所在的编辑页面加上 System.in.read();来进行编辑查看


负载均衡,
当存在应用名字一样的服务的时候,我们应该选哪一个提供者?
下图是服务不同提供者提供的相同的应用

首先了解一下,负载均衡的几种方式:
Random LoadBlance 随机,按照权重设置随机概率, 在一个截面上碰撞的概率高,但是调用量越大,分布越均匀。(一般不推荐使用)
RoundRobin LoadBlance 轮询政策, 存在 慢的提供者 累积请求的问题, 因为是消费者去请求服务,而服务的提供者去提供服务,相同应用名称的服务,不同的提供者之间是相互的轮换提供, 如果采取轮询政策,由于提供者的效率不同,效率慢的提供者会存在请求的积累,到你了就给你,不会考虑其他的东西。
LeastActive LoadBlance 最少活跃调用数, 根据能力,快的提供者多分配请求, 慢的提供者少分配请求。
ConsistentHash LoadBlance 一致性哈希 参见维基百科, 当某一台提供者挂掉时,原本发往该提供者的请求,基于虚拟的节点,平摊到其他的提供者,不会引起剧烈的变动。
如何设置 负载均衡 :
服务端设置:
客户端设置: 在dubbo-consumer.xml里面设置,LoadBlance=“roundrobin” 就是随机的意思

效果如下:

浙公网安备 33010602011771号