Dubbo 安装和使用

15.Dubbo版本

Dubbo版本

dubbo-2.5.3

Dubbo下载地址

http://alibaba.github.io/dubbo-doc-static/Download-zh.htm

15.Dubbo基本架构

Dubbo节点角色说明:

Provider: 暴露服务的服务提供方。 
Consumer: 调用远程服务的服务消费方。 
Registry: 服务注册与发现的注册中心。 
Monitor: 统计服务的调用次调和调用时间的监控中心。 
Container: 服务运行容器。 

15.Dubbo 注册中心

Dubbo 注册中心:

使用zookeeper作为dubbo的注册中心,暴露服务地址
zkServer.sh start 启动zookeeper服务。

15.Dubbo 监控中心

Dubbo 监控中心:

官方提供了一个war包,可发布到web容器中进行监控也可以使用官方提供的工具dubbo-monitor-simple-2.5.3-assembly.tar,进行监控,工具默认使用的事jetty web容器,可在conf/dubbo.properties,配置相关信息。

使用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项目搭建

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等配置

创建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(); // 为保证服务一直开着,利用输入流的阻塞来模拟
	}
}

创建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();
	}
}

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());

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);
			}
		});

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配置
将服务消费者接口及配置导出到服务消费者项目
启动监控中心
启动注册中心
启动服务提供者服务
启动服务消费者服务
完成服务调用



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值