15.Dubbo版本
l Dubbo版本:
dubbo-2.5.3
l Dubbo下载地址:
http://alibaba.github.io/dubbo-doc-static/Download-zh.htm
15.Dubbo基本架构
l Dubbo节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
15.Dubbo 注册中心
l Dubbo 注册中心:
使用zookeeper作为dubbo的注册中心,暴露服务地址
zkServer.sh start 启动zookeeper服务。
15.Dubbo 监控中心
l Dubbo 监控中心:
官方提供了一个war包,可发布到web容器中进行监控也可以使用官方提供的工具dubbo-monitor-simple-2.5.3-assembly.tar,进行监控,工具默认使用的事jetty web容器,可在conf/dubbo.properties,配置相关信息。
l 使用Tomcat 成为Dubbo 监控中心:
删除ROOT目录下的文件。
把war包解压到ROOT目录。
编辑文件ROOT/WEB-INF/dubbo.properties文件,内容如下:
dubbo.registry.address=zookeeper://10.2.48.185:2181 #注册中心地址
dubbo.admin.root.password=root #root账户的密码
dubbo.admin.guest.password=guest # guest账户的密码
启动tomcat
打开地址如:10.2.48.185:8080 ,进入tomcat跟目录
输入root用户的密码,进入监控中心。
15.Dubbo java项目搭建
l Dubbo java项目搭建基础:
创建普通的java项目
导入依赖的jar文件
commons-logging-1.1.jar
dubbo-2.5.3.jar
javassist-3.4.GA.jar
log4j-1.2.12.jar
netty-3.2.5.Final.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
spring-test.jar
spring.jar
zkclient-0.1.jar
zookeeper-3.4.5.jar
创建基本的spring,log4j等配置
l 创建Provider java项目:
创建接口文件DemoService,内容如下:package com.cmcc.dubbotest.provider;
public interface DemoService {
String sayHello(String name);
}
创建接口文件DemoService的实现DemoServiceImpl,内容如下:
package com.cmcc.dubbotest.provider.impl;
import com.cmcc.dubbotest.provider.DemoService;
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
创建spring的配置文件spring-dubbo.xml,用来配置dubbo,加入dubbo的配置信息:
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="provider" owner='jingshuai' organization='cmcc' logger="log4j" />
<!-- 使用multicast广播注册中心暴露服务地址
<dubbo:registry address="multicast://224.5.6.7:1234" />
-->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://10.2.48.185:2181" protocol="dubbo" port="9090" timeout="5000" session="60000"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 使用监控中心 -->
<dubbo:monitor protocol="registry" />
<!-- 注册整体的超时时间 -->
<dubbo:provider timeout="6000" />
暴露的服务接口
<dubbo:service
interface="com.cmcc.dubbotest.provider.DemoService"
ref="demoService"
protocol="dubbo"
version="1.0.0"
owner="jingshuai"
timeout="5000"
group="demo"
delay="1"
loadbalance="random"/>
创建Provider类运行测试,内容如下:
package com.cmcc.dubbotest.provider.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "spring*.xml" });
context.start();
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
}
l 创建Consumer java项目:
创建接口文件DemoService,内容和Provider项目中的接口一样
创建spring的配置文件spring.xml,用来配置dubbo,加入dubbo的配置信息:
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<dubbo:registry address="zookeeper://10.2.48.185:2181" />
<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.cmcc.dubbotest.provider.DemoService" version="1.0.0" group="demo"/>
创建Consumer 类运行测试,内容如下:
package com.cmcc.dubbotest.provider.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.cmcc.dubbotest.provider.DemoService;
public class Consumer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "spring.xml" });
context.start();
DemoService demoService = (DemoService) context.getBean("demoService");
String hello = demoService.sayHello("tom");
System.out.println(hello);
System.in.read();
}
}
l Dubbo 服务分组:
当一个接口有多个实现,可以用分组区分。
在provider 项目中,做如下更改
在DemoService的同目录下,新建一个MergeService借口,内容如下:
package com.cmcc.dubbotest.provider.impl;
import java.util.ArrayList;
import java.util.List;
import com.cmcc.dubbotest.provider.MergeService;
public class MergeServiceImpl implements MergeService {
@Override
public List<String> getItems() {
List<String> sl = new ArrayList<String>();
sl.add("wangwu");
sl.add("lisi");
return sl;
}
}
package com.cmcc.dubbotest.provider.impl;
import java.util.ArrayList;
import java.util.List;
import com.cmcc.dubbotest.provider.MergeService;
public class Merge2ServiceImpl implements MergeService {
@Override
public List<String> getItems() {
List<String> sl=new ArrayList<String>();
sl.add("zhangsan");
sl.add("lisi");
return sl;
}
}
修改spring-dubbo.xml文件:
<!-- 服务分组,当一个接口有多个实现,可以用分组区分 -->
<dubbo:service
interface="com.cmcc.dubbotest.provider.MergeService"
ref="merge1"
protocol="dubbo"
version="1.0.0"
owner="jingshuai"
timeout="4000"
group="merge1" /> #用于区分组
<dubbo:service
interface="com.cmcc.dubbotest.provider.MergeService"
ref="merge2"
protocol="dubbo"
version="1.0.0"
owner="jingshuai"
timeout="4000"
group="merge2" /> #用于区分组
在consumer 项目中,做如下更改
新建一个MergeService接口,内容和provider项目中的一样
修改spring.xml文件 加入如下信息:
<dubbo:reference id="mergeService1" interface="com.cmcc.dubbotest.provider.MergeService" version="1.0.0" group="merge1"/>
<dubbo:reference id="mergeService2" interface="com.cmcc.dubbotest.provider.MergeService" version="1.0.0" group="merge2"/>
修改Consumer类,加入如下内容 测试:
MergeService mergeService1 = (MergeService) context.getBean("mergeService1");
System.out.println(mergeService1.getItems());
MergeService mergeService2 = (MergeService) context.getBean("mergeService2");
System.out.println(mergeService2.getItems());
l Dubbo 服务回调:
如果想在dubbio中使用回调函数,可以做如下新增:
在provider 项目中,做如下更改
新建一个监听类CallbackListener:
package com.cmcc.dubbotest.provider.listener;
public interface CallbackListener {
public void change(String change);
}
新建一个接口类CallbackService:
package com.cmcc.dubbotest.provider;
import com.cmcc.dubbotest.provider.listener.CallbackListener;
public interface CallbackService {
void addListener(String key, CallbackListener listener);
}
新建接口类CallbackService的实现类:
package com.cmcc.dubbotest.provider.impl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.cmcc.dubbotest.provider.CallbackService;
import com.cmcc.dubbotest.provider.listener.CallbackListener;
public class CallbackServiceImpl implements CallbackService {
private final Map<String, CallbackListener> listeners = new ConcurrentHashMap<String, CallbackListener>();
public CallbackServiceImpl() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
for (Map.Entry<String, CallbackListener> entry : listeners
.entrySet()) {
try {
entry.getValue().change(getChange(entry.getKey()));
} catch (Throwable t) {
listeners.remove(entry.getKey());
}
}
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
}
@Override
public void addListener(String key, CallbackListener listener) {
listeners.put(key, listener);
listener.change(getChange(key));
}
private String getChange(String msg) {
return "Changed:"
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date());
}
}
在spring-dubbo.xml文件中新增如下内容,声明接口和方法:
<dubbo:service
interface="com.cmcc.dubbotest.provider.CallbackService"
ref="callbackService"
callbacks="1000"
version="1.0.0"
connections="1"
protocol="dubbo"
group="callback"
owner="jingshuai">
<dubbo:method name="addListener">
<dubbo:argument index="1" callback="true" />
</dubbo:method>
</dubbo:service>
在consumer 项目中,做如下更改
新建CallbackService接口和provider中一样
新建CallbackListener接口和provider中一样
在spring.xml中新增如下内容:
<dubbo:reference id="callbackService" interface="com.cmcc.dubbotest.provider.CallbackService" version="1.0.0" group="callback"/>
修改Consumer类,加入如下内容 测试:
CallbackService callbackService = (CallbackService) context.getBean("callbackService");
callbackService.addListener("aaa", new CallbackListener() {
public void change(String change) {
System.out.println("Consumer执行------------->"+change);
}
});
l Dubbo 服务注解:
如果想在dubbo中使用注解配置,可以做如下新增:
在provider 项目中,做如下更改
新建接口类AnnoService
package com.cmcc.dubbotest.provider;
/**
* 注解方式配置
* @author jingshuai
*
*/
public interface AnnoService {
public String sayHello(String name);
}
新建接口类AnnoService的实现类AnnoServiceImpl
package com.cmcc.dubbotest.provider.impl;
import com.alibaba.dubbo.config.annotation.Service;
/**
* 注解方式配置
*
* @author jingshuai
*
*/
@Service(interfaceClass = com.cmcc.dubbotest.provider.AnnoService.class,version = "1.0.0", group = "annotation", interfaceName = "com.cmcc.dubbotest.provider.AnnoService", protocol = "dubbo", owner = "jingshuai", timeout = 5000)
public class AnnoServiceImpl implements AnnoService {
@Override
public String sayHello(String name) {
return "Hello," + name;
}
}
在spring-dubbo.xml中加入扫描注解包路径
<!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<dubbo:annotation package="com.cmcc.dubbotest.provider" />
在consumer 项目中,做如下更改
在spring中增加如下数据
<dubbo:reference id="annoService" interface="com.cmcc.dubbotest.provider.AnnoService" version="1.0.0" group="annotation"/>
修改Consumer类,加入如下内容 测试:
AnnoService annoService = (AnnoService) context.getBean("annoService");
System.out.println(annoService.sayHello("jingshuai---------->"));
15.Dubbo 启动顺序
创建文件目录
编写服务接口
编写服务提供者实现代码
配置服务提供者spring配置
配置服务消费者spring配置
将服务消费者接口及配置导出到服务消费者项目
启动监控中心
启动注册中心
启动服务提供者服务
启动服务消费者服务
完成服务调用