一、dubbo服务是基于zookeeper提供服务、提供消费
1、Zookeeper的作用:
zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是ip地址和服务名称的对应关系。当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现,但是如果提供服务的机器挂掉调用者无法知晓,如果不更改代码会继续请求挂掉的机器提供服务。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除。至于支持高并发,简单来说就是横向扩展,在不更改代码的情况通过添加机器来提高运算能力。通过添加新的机器向zookeeper注册服务,服务的提供者多了能服务的客户就多了。
2、dubbo:
是管理中间层的工具,在业务层到数据仓库间有非常多服务的接入和服务提供者需要调度,dubbo提供一个框架解决这个问题。
注意这里的dubbo只是一个框架,至于你架子上放什么是完全取决于你的,就像一个汽车骨架,你需要配你的轮子引擎。这个框架中要完成调度必须要有一个分布式的注册中心,储存所有服务的元数据,你可以用zk,也可以用别的,只是大家都用zk。
3、zookeeper和dubbo的关系:
Dubbo的将注册中心进行抽象,是得它可以外接不同的存储媒介给注册中心提供服务,有ZooKeeper,Memcached,Redis等。
引入了ZooKeeper作为存储媒介,也就把ZooKeeper的特性引进来。首先是负载均衡,单注册中心的承载能力是有限的,在流量达到一定程度的时候就需要分流,负载均衡就是为了分流而存在的,一个ZooKeeper群配合相应的Web应用就可以很容易达到负载均衡;资源同步,单单有负载均衡还不够,节点之间的数据和资源需要同步,ZooKeeper集群就天然具备有这样的功能;命名服务,将树状结构用于维护全局的服务地址列表,服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。其他特性还有Mast选举,分布式锁等。
二、安装zookeeper
1、下载安装包:http://zookeeper.apache.org/releases.html
2、解压 tar -zxvf zookeeper-3.4.6.tar.gz
3、修改配置
mv zookeeper-3.4.6/conf/zoo_sample.cfg zoo.cfg
vi zookeeper-3.4.6/conf/zoo.cfg
修改成自己的地址,没有文件需要创建文件夹
4、启动zookeeper
启动 ./zookeeper-3.4.6/bin/zkServer.sh start
停止 ./zookeeper-3.4.6/bin/zkServer.sh stop
查看是否启动正常 ./zookeeper-3.4.6/bin/zkServer.sh status
说明启动成功,单机模式
三、安装dubbo-admin控制台客户端
1、war下载地址:http://code.alibabatech.com/mvn/releases/com/alibaba/dubbo-admin/2.4.1/dubbo-admin-2.4.1.war
2、修改配置../dubbo-admin/WEB-INF/dubbo.properties
3、将war包放入tomcat,启动tomcat
输入用户名密码 默认是root root
启动成功。
四、添加服务生产者
我采用的是spring+dubbo+maven整合,这里我贴出部分代码配置,在文章最后我会将源码地址分享出来
1、这是项目目录,首先需要制定一个服务接口:
package com.cc.dubbo.service; public interface DemoService { String sayHello(String name); }
2、实现类:
package com.cc.dubbo.service.impl; import com.cc.dubbo.service.DemoService; public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) { return "hello "+name; } }
3、spring关于dubbo配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 具体的实现bean --> <bean id="demoService" class="com.cc.dubbo.service.impl.DemoServiceImpl" /> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="demo_provider" /> <!-- 使用zookeeper注册中心暴露服务地址 即zookeeper的所在服务器ip地址和端口号 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 这个name不需要改 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.cc.dubbo.service.DemoService" ref="demoService" /> </beans>
4、启动,将项目运行起来,在打开dubbo控制台,你会发现多了一个项目,到此我们的服务已经暴露出去了,等待消费者消费了
五、添加服务消费者
1、消费者同样采用的是spring+dubbo+maven,需要修改的是pom.xml需要将生产者的代码打成jar添加到消费这中去。
2、配置spring关于dubbo文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="demo_consumer" /> <!-- 使用zookeeper注册中心暴露服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.cc.dubbo.service.DemoService" /> </beans>
3、编写Controller
package com.cc.dubbo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.cc.dubbo.service.DemoService; @Controller public class DemoController { @Autowired private DemoService demoService; @ResponseBody @RequestMapping("/demo") public String say(@RequestParam("name")String name){ return demoService.sayHello(name); } }
4、启动项目
这是就能看到服务的消费者和生产者了。。。到此编码就结束了,谢谢,如果那里不对欢迎扔砖QQ:369355497
六、源码地址
这是我项目的源码地址,已经分享到github上了https://github.com/gitboke/dubbo.git
最后分享一个微信公众帐号骑猪上树 这是我自己开发的微信机器人谢谢大家