dubbo+zookeeper+SpringMVC详解
最近研究dubbo和zookeeper在csdn看了很多文章发现好的说的都是不全的或者关键部分代码缺失所以下定决心写一个完整的demo。
下载地址:
Zookeeper:https://zookeeper.apache.org/releases.html
dubbo-admin-2.5.3.war:http://pan.baidu.com/s/1c2Egctq
源码:http://download.csdn.net/detail/qq_29582193/9865579
-
Zookeeper环境搭建
1、下载Zookeeper
下载地址:https://zookeeper.apache.org/releases.html 选择你想要的版本
-
配置Zookeeper
将下载的Zookeeper解压到你想要放置的文件夹
修改配置文件\dubboZookeeper\zookeeper-3.4.8\conf下面有个zoo_sample.cfg把这 个文件复制一份修改名为zoo.cfg Zookeeper默认加载这个配置文件如果没有这个 文件启动时会提示无法加载该文件
打开zoo.cfg添加修改数据 日志的存储位置
启动Zookeeper
到此Zookeeper就已经成功启动 让它一直保持运行后面我们会在上面注册服务
-
代码编写
1、创建Maven项目
项目分为5个子项目
分别为dubbo(父工程),dubbo-api(这里只有接口,最终会打成jar),dubbo-provider(生产者,最终会打成war),dubbo-service(接口的实现都在这里,最终会被打成jar),dubbo_customer(消费者,最终会打成war)
重点是提供者和消费者配置xml这里把它们贴出来
dubbo_provider.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="test_provider" />
<!--使用zookeeper注册中心暴露服务地址-->
<!--消费者端不用声明ip通过zookeeper分配服务-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!--消费者端声明url点对点调用-->
<!-- <dubbo:registry address="N/A" protocol="zookeeper"/> -->
<!--用dubbo协议在20880端口暴露服务-->
<dubbo:protocol name="dubbo" />
<!--用dubbo协议在40001端口暴露服务-->
<!-- <dubbo:protocol name="dubbo" port="40001" /> -->
<!--给提供者添加组 -->
<dubbo:provider retries="0" threads="100" timeout="40000" loadbalance="random" group="testGroup" />
<!--声明需要暴露的服务接口 -->
<dubbo:service interface="com.dubbo.demo.service.TestService" ref="testService" />
<!--具体的实现bean -->
<bean id="testService" class="com.dubbo.demo.service.impl.TestServiceImpl" />
</beans>
dubbo_customer.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="test_consumer" />
<!--使用zookeeper注册中心暴露服务地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!--声明需要暴露的服务接口 -->
<!--如果不配置url表示使用注册中心自动分配服务
提供者端配置:注册到Zookeeper
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
填写则通过点对点调用对应ip端口的服务
提供者端配置:不注册到Zookeeper
<dubbo:registry address="N/A" protocol="zookeeper"/>
-->
<dubbo:reference interface="com.dubbo.demo.service.TestService" id="testService" group="testGroup" check="false" />
<!-- <dubbo:reference id="testService" interface="com.dubbo.demo.service.TestService" timeout="40000" check="false" url="dubbo://127.0.0.1:20880"/>
-->
</beans>
具体代码我已经上传到csdn地址:
http://download.csdn.NET/detail/qq_29582193/9865579
-
部署消费者和提供者(均为web项目)
-
dubbo管理平台环境搭建(实际就是一个web应用可视化查看服务者消费者)
-
下载dubbo-admin-2.5.3.war 下载地址:
http://pan.baidu.com/s/1c2Egctq
-
下载后放在tomcat的webapps文件夹下运行tomcat或者通过eclipse部署
-
访问管理端用户名密码为 root/root
-
访问步骤二中启动的消费者的web应用 成功
-
不用web项目启动通过Java main方法启动
提供者
1、加载配置
2、保持运行状态
消费者
1、加载springContext配置
-
获取接口对象
-
调用接口方法
代码详情
启动提供者线程
Provider.java
package com.dubbo.demo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
@SuppressWarnings("resource")
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "servlet-context.xml" });
context.start();
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
}
消费者
TestCustomer.java
package com.dubbo.demo.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.demo.service.TestService;
public class TestCustomer {
public static void main(String[] args) throws Exception {
@SuppressWarnings("resource")
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "servlet-context.xml" });
context.start();
TestService testService = (TestService) context.getBean("testService");
String hello = testService.say("lichengdu");
String dubbo = testService.testSayDubbo();
System.out.println(hello);
System.out.println(dubbo);
//System.in.read();
}
}
总结:
Dubbo是一个分布式服务框架,解决了上面的所面对的问题,Dubbo的架构如图
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。