您的位置:首页 > 编程语言 > Java开发

dubbo(分布式架构)+zookeeper(注册中心)+spring(provider和consumer) 基本使用

2015-07-24 14:44 971 查看
1.前言

看到网上各种dubbo的教程,应该基本上都是从一个地方贴过来的,一看到千篇一律的provider中main方法中的system.in.read()就头疼了,随便找找都是一个样,估计都没自己认真写过吧!工作之余,今天就写一个基于tomcat容器的provider、基于zookeeper单节点注册中心来玩玩儿。

2.准备工作

1>由于项目都是在maven下构建的,请先安装maven、开发工具eclipse以及maven插件

2>由于注册中心、监控中心、provider以及consumer都部署到不同的服务器,请先安装virtualbox,用虚拟机安装一个Linux系统,centos mini即可

3>虚拟机安装的centos我将其ip配置为静态,且与我本机位同一网段, 保证本机与虚拟机centos之间可以相互访问.

4>下载zookeeper的tar包导centos并解压到/usr/local/program/zookeeper

5>下载jdk7的tar包导centos并解压到/usr/local/program/jdk

6>下载dubbo建议监控中心的zip包并解压到本机E:\software\dobbo\monitor

3.配置

1>配置jdk

2>配置zookeeper 进入zookeeper的bin目录下 ./zkServer.sh start 运行上述命令 以默认配置开启zookeeper服务即可

3>配置监控中心 进入monitor的conf目录 编辑dubbo配置文件 配置注册中心信息dubbo.registry.address=zookeeper://10.4.2.254:2181 修改jetty的端口为8081保存 进入bin目录 点击start即可启动 由于是弄着玩儿的 直接将centos的防火墙关闭即可 省的配置端口开发 service iptables stop运行这条命令即可

4>浏览器中访问http://localhost:8081即可看到监控中心界面 点击services即可看到一个provider 就是监控中心本身的信息 后续开发provider启动之后会在这里看到provider的信息

4.开发

1>配置maven、安装eclipse以及maven插件

2>新建一个maven(webapp)工程 配置如下

1>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: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         ">
<!--此处主要使用注解方式,xml中配置了bean的话 此处可直接注释掉-->
<!--<dubbo:annotation package="com.dubbo.provider" />-->
    <!-- 具体的实现bean -->
    <bean id="demoService" class="com.dubbo.provider.service.DemoServiceImpl" />
    
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="test_provider"  />
  
  	<!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://10.4.2.254:2181" /> 
  
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    
    
    <!-- <dubbo:monitor protocol="registry" address="127.0.0.1:7070"/> -->
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.dubbo.provider.service.DemoService" ref="demoService" version="1.0.0"/>
    
</beans>


2>web.xml配置



<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
	<display-name>dubbo-webservice</display-name>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:provider.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>dubbo</servlet-name>
		<servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dubbo</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>


4>pom.xml配置



<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 	<modelVersion>4.0.0</modelVersion>
	<groupId>demo-provider</groupId>
	<artifactId>demo-provider</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo-provider Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<spring.version>4.1.7.RELEASE</spring.version>
		<cxf.version>3.1.1</cxf.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- <dependency> <groupId>com.bubugao.framework</groupId> <artifactId>bubugao-framework</artifactId> 
			<version>0.9.0-SNAPSHOT</version> </dependency> -->
		<!-- dubbo dependency -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.5.3</version>
		</dependency>
		<dependency>
			<groupId>org.javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.18.1-GA</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.netty</groupId>
			<artifactId>netty</artifactId>
			<version>3.2.9.Final</version>
		</dependency>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.6</version>
		</dependency>

		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.12</version>
		</dependency>
		
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.12</version>
		</dependency>
		
		<dependency>
			<groupId>org.jboss.netty</groupId>
			<artifactId>netty</artifactId>
			<version>3.2.10.Final</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>demo-provider</finalName>
	</build>
</project>


3>代码以及结构

1>包结构

com.dubbo.provider

------bean

----------------Users

------service

----------------DemoService

----------------DemoServiceImpl



2>代码

package com.dubbo.provider.bean;

public class User {
	private String name;
	private int age;
	private String sex;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

}


package com.dubbo.provider.service;

import java.util.List;

import com.dubbo.provider.bean.User;

public interface DemoService {
	
	public String sayHello(String name);

	public List<User> getUsers();

}


package com.dubbo.provider.service;

import java.util.ArrayList;

import java.util.List;

import com.alibaba.dubbo.config.annotation.Service;

import com.dubbo.provider.bean.User;

//注解方式

//@Service(interfaceClass = DemoService.class, version = "1.0.0")

public class DemoServiceImpl implements DemoService {

public String sayHello(String id) {

// TODO Auto-generated method stub

System.out.println("调用sayHell成功...");

return "hello:" + id;

}

public List<User> getUsers() {

System.out.println("调用getUsers成功...");

List<User> list = new ArrayList<User>();

list.add(new User("jianglong", 28, "nan"));

list.add(new User("tianqq", 25, "nv"));

return list;

}

}

3>新建一个普通的maven工程 demo-consumer

1>consumer.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         ">


<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="test_consumer" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://10.4.2.254:2181" />

<!-- <dubbo:monitor protocol="registry" address="127.0.0.1:7070"/> -->

<!-- 声明需要暴露的服务接口 -->
<dubbo:reference interface="com.dubbo.provider.service.DemoService" id="demoService" version="1.0.0"/>

</beans>


2>pom.xml与provider相同

3>将provider打成jar包导入到consumer以备调用

4>写一个main方法调用dubboprovider的接口 代码如下

package com.dubbo.consumer.boot;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dubbo.provider.service.DemoService;

public class Boot {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
		context.start();
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		DemoService demoService=(DemoService) context.getBean("demoService");
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		System.out.println(demoService.sayHello("jianglong"));
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
	}

}


最后将privider用tomcat容器启动,在监控中心即可看到新添加了一条provider的信息 说明provider在注册中心注册成功。此时运行consumer的main方法 即可看到控制台有成功调用的提示 调用成功 简单的使用方式就成功了

遇到的问题:可以看到
DemoService demoService=(DemoService) context.getBean("demoService");这句代码耗时有5秒左右 目前还没查出耗时这么久的原因来 后来我将provider zookeeper consumer以及monitor都放到本机来测试 耗时依然是5秒左右屡试不爽 目前为止还没有找到原因 若有知道的同仁 请多多请教和指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: