Dubbo 简介:

  Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

  主要核心部件:
  Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制;
  RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能;
  Registry: 服务目录框架用于服务的注册和服务事件发布和订阅。

  工作原理:

   

   Provider:暴露服务方称之为“服务提供者”。
   Consumer:调用远程服务方称之为“服务消费者”。
   Registry:服务注册与发现的中心目录服务称之为“服务注册中心”。
   Monitor:统计服务的调用次调和调用时间的日志服务称之为“服务监控中心”。

  Zookpeeper简介:

  ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
  ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

  在Linux上安装Zookeeper

  (1)下载Zookeeper-3.4.6.tar.gz  地址:http://www.apache.org/dist/zookeeper/
  (2)我们放到Linux的/usr/local下,然后解压: 
     #tar zxvf zookeeper-3.4.6.tar.gz
  (3)然后在对应的zookeeper-3.4.6/conf 下有一个文件zoo_sample.cfg的这个文件里面配置了监听客户端连接的端口等一些信息,Zookeeper 在启动时会找zoo.cfg这个文件作为默认配置文件,所以我们复制一个名称为zoo.cfg的文件,如图所示:

     

  由于之前已经成功配置zookpeer服务器,所以我的zookpeeper/conf目录下已经存在zoo.cfg文件。

  (4)启动Zookeeper服务,如图所示:
     
  到此Zookeeper的安装和配置完成。

  创建项目,测试远程调用,这里使用的Maven的管理项目

     项目目录:
     
  服务提供者的工程:
  dubbo-tgb-api定义接口:
package com.tgb.api;

public interface IProcessData {
	public String deal(String data);
}
        dubbo-tgb-provider 服务提供者:
package com.tgb.serviceImpl;

import com.tgb.api.IProcessData;

public class ProcessDataImpl implements IProcessData {

	public String deal(String data) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return "Finished:" + data;
	}

}
    applicationProvider.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: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  
        ">

	<!-- Application name -->
	<dubbo:application name="dubbo-tgb" />

	<!-- registry address, used for service to register itself -->
	<dubbo:registry address="zookeeper://192.168.24.244:2181" />

	<!-- expose this service through dubbo protocol, through port 20880 -->
	<!-- <dubbo:protocol name="dubbo" port="20880" /> <dubbo:protocol name="dubbo" 
		port="9090" server="netty" client="netty" codec="dubbo" serialization="hessian2" 
		charset="UTF-8" threadpool="fixed" threads="100" queues="0" iothreads="9" 
		buffer="8192" accepts="1000" payload="8388608" /> -->
	<!-- Service interface Concurrent Control -->
	<dubbo:service interface="com.tgb.api.IProcessData" ref="processDataService"
		executes="10" />

	<!-- Default Protocol -->
	<!-- <dubbo:protocol server="netty" /> -->

	<!-- designate implementation -->
	<bean id="processDataService" class="com.tgb.serviceImpl.ProcessDataImpl" />

</beans> 
    启动服务:
package com.tgb.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DubboProviderMain {
	public static void main(String[] args) throws Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationProvider.xml" });
		context.start();

		System.out.println("Press any key to exit.");
		System.in.read();
	}
}
        服务调用者的工程
  applicationConsumer.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: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  
        ">  
  
    <!-- consumer application name -->  
    <dubbo:application name="consumer-of-helloworld-app" />  
  
    <!-- registry address, used for consumer to discover services -->  
    <dubbo:registry address="zookeeper://192.168.24.244:2181" />  
    <dubbo:consumer timeout="5000"/>  
    <!-- which service to consume? -->  
    <dubbo:reference id="processDataService" interface="com.tgb.api.IProcessData" />  
</beans> 
  调用类:
package com.tgb.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.tgb.api.IProcessData;

public class ConsumerThd implements Runnable {

	public void run() {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "applicationConsumer.xml" });
		context.start();

		IProcessData processDataService = (IProcessData) context
				.getBean("processDataService"); // get

		// proxy
		String hello = processDataService.deal("nihao"); // do invoke!

		System.out.println(Thread.currentThread().getName() + " " + hello);
	}

	public static void main(String[] args) {
		new Thread(new ConsumerThd()).start();
	}
}
            到此,使用dubbo+zookeeper实现分布式调用的例子已讲解完,源码下载地址:http://pan.baidu.com/s/1qWveFwg
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐