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

来源:互联网 发布:游戏计时器软件 编辑:程序博客网 时间:2024/06/08 15:31

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 stubClassPathXmlApplicationContext 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秒左右屡试不爽 目前为止还没有找到原因 若有知道的同仁 请多多请教和指正

1 0