dubbo项目搭建

环境:Windows7+MyEclipse10+Spring+SpringMVC+Mybatis+ Maven3.3.9+Tomcat

说明:这里我没安装zookeeper,是别人安装好了给我的端口和IP直接访问就好了

一、准备工作

  1、zookeeper部署

  2、安装dubbo-admin管理工具(直接将dubbo-admin项目放到服务器tomcat/webapps下面)

  上面两步可以参考:http://www.cnblogs.com/xylgp/p/5946725.html

二:项目梗概

  1.dubbo是用来解决分布式提供服务的,目的就是按照业务逻辑模块将一个大工程分成多个服务,可能每个服务就只为一个业务模块提供服务,这样一个大工程就可以拆分成多

  个小工程服务模块组装而成。由接口层Interface、服务层Provider、消费层Consumer三层,如下图:

  

  2.各层的分工职责:

   接口层Interface:仅仅提供service接口,

   服务层Provider:提供真正的服务实现

   消费层Consumer:消费服务

  Interface层是个jar包的形式,会在Provider和Consumer层pom文件中引入。Consumer层调用Interface层的服务接口,而不会直接去掉Provider层的服务实现。真正的

  Provider服务实现通过在zookeeper注册暴露服务接口的方式提供服务。

三:具体实现

  1、导入相应的jar包

<!-- dubbo所需jar包:dubbo、zookeeper、zkclient -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- Zookeeper 用于分布式服务管理 -->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.5</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.3</version>
    </dependency>

  2、配置服务提供方的xxx.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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="dubbodemo-provider"/>
    <!-- 连接到哪个本地注册中心 -->
    <dubbo:registry protocol="zookeeper" address="10.77.55.161:2181"/>
   
    <!-- 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受  -->
    <dubbo:protocol name="dubbo" server="netty" port="20882" serialization="hessian2" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service timeout="60000" interface="com.quicksure.insurance.service.InsuranceService" ref="insuranceService"/>
    <dubbo:service timeout="60000" interface="com.quicksure.insurance.service.MyAccountService" ref="myAccountService"/>
</beans>

  说明:address可以配置多个,若是zookeeper集群了,这里就应该配置多个zookeeper的地址

      <dubbo:protocol>标签是用来配置服务提供方和服务适用方的网络协议的,详细:dubbo支持的常见协议

      <dubbo:service>标签用来声明服务,timeout为超时时间

  3、在服务提供方将xxx-provider.xml配置到spring-context.xml内

<!-- 引入服务提供provider属性配置文件 -->
    <import resource="classpath:insurance-provider.xml"/>

  4、在provider项目pom.xml中添加

<!-- 打包 -->
  <build>
      <finalName>quicksure_Server_Provider</finalName>
      <resources>
          <resource>
              <targetPath>${project.build.directory}/classes</targetPath>
              <directory>src/main/resources</directory>
              <filtering>true</filtering>
              <includes>
                  <include>**/*.xml</include>
                  <include>**/*.properties</include>
              </includes>
          </resource>
          <!-- mapper.xml打进相应的文件夹 -->
          <resource>
              <targetPath>${project.build.directory}/classes/com/quicksure/insurance/mapper</targetPath>
              <directory>src/main/java/com/quicksure/insurance/mapper</directory>
              <filtering>true</filtering>
              <includes>
                  <include>**/*.xml</include>
              </includes>
          </resource>
          <!-- template.xml模板打进相应的文件夹 -->
          <resource>
              <targetPath>${project.build.directory}/classes/com/quicksure/insurance/velocity/template</targetPath>
              <directory>src/main/java/com/quicksure/insurance/velocity/template</directory>
              <filtering>true</filtering>
              <includes>
                  <include>**/*.xml</include>
              </includes>
          </resource>
          <!-- 结合com.alibaba.dubbo.container.Main -->
          <resource>
              <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
              <directory>src/main/resources</directory>
              <filtering>true</filtering>
              <includes>
                  <include>spring.xml</include>
              </includes>
          </resource>
      </resources>
      <pluginManagement>
          <plugins>
              <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jar-plugin</artifactId>
                  <version>2.6</version>
                  <configuration>
                      <classesDirectory>target/classes/</classesDirectory>
                      <archive>
                          <manifest>
                              <mainClass>com.alibaba.dubbo.container.Main</mainClass>
                              <!-- <mainClass>com.quicksure.test.util.Launcher</mainClass> -->
                              <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
                              <useUniqueVersions>false</useUniqueVersions>
                              <addClasspath>true</addClasspath>
                              <classpathPrefix>lib/</classpathPrefix>
                          </manifest>
                          <manifestEntries>
                              <Class-Path>.</Class-Path>
                          </manifestEntries>
                      </archive>
                  </configuration>
              </plugin>
              <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 -->
              <plugin>
                  <groupId>org.eclipse.m2e</groupId>
                  <artifactId>lifecycle-mapping</artifactId>
                  <version>1.0.0</version>
                  <configuration>
                      <lifecycleMappingMetadata>
                          <pluginExecutions>
                              <pluginExecution>
                                  <pluginExecutionFilter>
                                      <groupId>org.apache.maven.plugins</groupId>
                                      <artifactId>maven-dependency-plugin</artifactId>
                                      <versionRange>[2.0,)</versionRange>
                                      <goals>
                                          <goal>copy-dependencies</goal>
                                      </goals>
                                  </pluginExecutionFilter>
                                  <action>
                                      <ignore />
                                  </action>
                              </pluginExecution>
                          </pluginExecutions>
                      </lifecycleMappingMetadata>
                  </configuration>
              </plugin>
          </plugins>
      </pluginManagement>
  </build>

  5、配置服务消费方的xxx-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 添加 DUBBO SCHEMA -->
<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="dubbodemo-consumer"/>
    
    <!-- 连接到哪个注册中心(连接到本机的2181端口zookeeper) -->
    <dubbo:registry protocol="zookeeper" address="10.77.55.161:2181"/>
    
    <!-- 消费方用什么协议获取服务(用dubbo协议在20881端口暴露服务) -->
    <dubbo:protocol name="dubbo" port="20881" />
    
    <!-- 提供哪些接口给消费者调用 -->
    <dubbo:reference id="insuranceService" timeout="60000" interface="com.quicksure.insurance.service.InsuranceService" url="dubbo://10.77.55.161:20881"/>
    <dubbo:reference id="myAccountService" timeout="60000" interface="com.quicksure.insurance.service.MyAccountService" url="dubbo://10.77.55.161:20881"/>
</beans>

  说明:这里address和提供方一样,不用过多阐述

    <dubbo:prorocol>内的port与服务提供方端口一致就行了

    <dubbo:reference>标签内的url,这个参数很重要,当一个团队有多个人在开发时,每个人都要把自己本机的服务注册到zookeeper上,若不加这个url参数的话,就会默认调一个服务,大家都会去调同一个服务,为防止这样的事情,加上url就好了,同一个zookeeper上port也不能重复,url配置模板:url=“dubbo://ip:服务端口”

  6、将消费方的xxx-consumer.xml配置进消费方的spring.xml中

<!-- 加载dubbo的消费层xml配置文件 -->
    <import resource="spring-consumer.xml"/>

  7、开发阶段启动dubbo服务,需要写一个主方法启动,但是如果打成jar包启动,dubbo会使用自己封装的启动方法去启动(也就可以将自己写的这个主方法删除了),这也是为什么会在pom.xml里面配置将spring.xml打包到classpath:spring/xxx.xml,这是dubbo封装的启动类指定路径(xxx.xml文件名没有要求) 

dubbo项目打包可以参考:dubbo打包教程

public class Launcher {
    private static Log logger = LogFactory.getLog(Launcher.class);

    /**
     * @param args
     * 本地启动所需的主方法
     */
    public static void main(String[] args) {
      getLocalip();
      logger.info("---****Provider 启动****-----");
      ClassPathXmlApplicationContext context = 
              new ClassPathXmlApplicationContext("classpath:spring.xml");
      context.start();
      System.out.println("Provider Server Started!");
      try{
          System.in.read();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
}

四:dubbo项目部署

  1、先将interface接口层打包成jar,直接打包到相应的maven本地库下

    命令:mvn clean install

  2、将provider服务提供项目打包成jar,然后将该项目所需的第三方依赖jar包手动copy到一个新建的lib文件夹(这个文件是在provider项目的pom.xml内指定了第三方jar包的获取路径),把provider项目jar包和lib文件夹放在同一目录下

  启动:

    a、若是本机上的话,cmd命令:Java -jar xxx.jar

      b、Linux下,命令:nohup java -jar xxx.jar &   (这是可在后台执行的,即使Ctrl+C也不会影响程序的后台运行)

  3、将consumer项目打成war包,然后放在tomcat内启动就行了

    Linux下命令:ps -ef | grep tomcat 

            kill -9 pid

            ./startup.sh 

posted @ 2017-02-23 17:46  编码龟  阅读(148)  评论(0编辑  收藏  举报