dubbo学习总结-(1)dubbo快速体验

梳理这篇文章的目的很简单,duboo官方已经不在维护,里面的各种第三方库依赖的版本很老。dubbox的官方demo又太复杂,因此结合dubbox的新版本和duboo官方的demo文档梳理了一个最简单入门程序,目的是能让没用过duboo的同学,可以快速的体验一下。

准备工作

创建maven工程


dubbo-deom-parent:父项目,主要用来统一管理包的版本,是一个pom工程

dubbo-demo-api:子项目,定义了服务接口,本列中是一个jar工程

dubbo-demo-provider:子项目,定义了服务的提供者,有些地方称为服务端,本列中是一个jar工程

dubbo-demo-consumer:子项目,定义了服务消费者,有些地方称为客户端,本列中是一个jar工程

为了快速体验,注册中心采用multicast,之后的文章,会切换到zookeeper。


由于dubbo官方的版本停留在2.5.3,且停止了维护,所以这里我采用自己在本地编译dubbox最新的版本2.8.4,编译很简单:

  
  
  
  
  1. git clone https://github.com/dangdangdotcom/dubbox
  2. mvn clean install -Dmaven.test.skip=true


到此,所有的准备工作就做好了,接下来一步一步的实现每个工程,每个工程都以pom文件->代码->配置文件的


dubbo-demo-parent

注意: 

  • 父工程就是一个pom工程,其中dependencyManagement主要是包管理的目的,以便在子项目中不用再指定版本号。

  • 虽然我们指定了spring版本为4.3.8.RELEASE,但是由于通过spring-framework-bom,最终我们得到还是dubbo工程里用到的spring3版本

  • demo非常简单,所以只需要引入dubbo就可以了,其他的maven会自动通过依赖传递引入

pom.xml文件如下:

  
  
  
  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.mocoline.demo</groupId>
  5. <artifactId>dubbo-demo-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>pom</packaging>
  8. <modules>
  9. <module>dubbo-demo-api</module>
  10. <module>dubbo-demo-consumer</module>
  11. <module>dubbo-demo-provider</module>
  12. </modules>
  13. <dependencyManagement>
  14. <dependencies>
  15. <dependency>
  16. <groupId>org.springframework</groupId>
  17. <artifactId>spring-framework-bom</artifactId>
  18. <version>4.3.8.RELEASE</version>
  19. <type>pom</type>
  20. <scope>import</scope>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.alibaba</groupId>
  24. <artifactId>dubbo</artifactId>
  25. <version>2.8.4</version>
  26. </dependency>
  27. </dependencies>
  28. </dependencyManagement>
  29. <build>
  30. <plugins>
  31. <plugin>
  32. <groupId>org.apache.maven.plugins</groupId>
  33. <artifactId>maven-compiler-plugin</artifactId>
  34. <version>3.6.1</version>
  35. <configuration>
  36. <source>1.6</source>
  37. <target>1.6</target>
  38. </configuration>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>


dubbo-demo-api

接口定义,这一层通常都是定义业务需要调用的实体和方法,不包含具体的业务逻辑。

pom.xml非常简单:

  
  
  
  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.  <modelVersion>4.0.0</modelVersion>
  5.  <parent>
  6.    <groupId>com.mocoline.demo</groupId>
  7.    <artifactId>dubbo-demo-parent</artifactId>
  8.    <version>0.0.1-SNAPSHOT</version>
  9.  </parent>
  10.  <artifactId>dubbo-demo-api</artifactId>
  11. </project>

接口定义:

  
  
  
  
  1. package com.mocoline.demo.dubbo;
  2. public interface DemoService {
  3.    String sayHello(String name);
  4. }

接口非常简单,就是返回一句话,没有其他的配置依赖。


dubbo-demo-provider

接口的实现,这一层通常是实现具体的业务逻辑的地方,由于要暴露服务接口,所以需要依赖dubbo的接口,具体pom文件如下:

  
  
  
  
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.    <modelVersion>4.0.0</modelVersion>
  4.    <parent>
  5.        <groupId>com.mocoline.demo</groupId>
  6.        <artifactId>dubbo-demo-parent</artifactId>
  7.        <version>0.0.1-SNAPSHOT</version>
  8.    </parent>
  9.    <artifactId>dubbo-demo-provider</artifactId>
  10.    <dependencies>
  11.        <dependency>
  12.            <groupId>com.mocoline.demo</groupId>
  13.            <artifactId>dubbo-demo-api</artifactId>
  14.            <version>${project.parent.version}</version>
  15.        </dependency>
  16.    
  17.        <dependency>
  18.            <groupId>com.alibaba</groupId>
  19.            <artifactId>dubbo</artifactId>
  20.        </dependency>
  21.    </dependencies>
  22. </project>

实现服务接口:

  
  
  
  
  1. package com.mocoline.demo.dubbo.impl;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import com.mocoline.demo.dubbo.DemoService;
  5. public class DemoServiceImpl implements DemoService {
  6.    public String sayHello(String name) {
  7.        System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name);
  8.        return "Hello " + name;
  9.    }
  10.    
  11. }

通过dubbo将服务发布出去:

  
  
  
  
  1. package com.mocoline.demo.dubbo;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class Provider {
  4.    public static void main(String[] args) throws Exception {
  5.        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "provider.xml" });
  6.        context.start();
  7.        System.out.println("provider is running, press any key to exit");
  8.        System.in.read();
  9.        System.out.println("provider exits");
  10.    }
  11. }

依赖关系和dubbo信息的配置都在provider.xml里,内容如下:

  
  
  
  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans
  6.    http://www.springframework.org/schema/beans/spring-beans.xsd
  7.    http://code.alibabatech.com/schema/dubbo
  8.    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  9.    <!-- 提供方应用信息,用于计算依赖关系 -->
  10.    <dubbo:application name="hello-world-app"  />
  11.    <!-- 使用multicast广播注册中心暴露服务地址 -->
  12.    <dubbo:registry address="multicast://224.5.6.7:1234" />
  13.    <!-- 用dubbo协议在20880端口暴露服务 -->
  14.    <dubbo:protocol name="dubbo" port="20880" />
  15.    <!-- 声明需要暴露的服务接口 -->
  16.    <dubbo:service interface="com.mocoline.demo.dubbo.DemoService" ref="demoService" />
  17.    <!-- 和本地bean一样实现服务 -->
  18.    <bean id="demoService" class="com.mocoline.demo.dubbo.impl.DemoServiceImpl" />
  19. </beans>


直接运行Provider,看到如下提示说明服务已经运行,处于等待消费的状态:


dubbo-demo-consumer

接口的调用者,由于要通过duboo调用服务提供者,所以要依赖duboo,具体pom如下:

   
   
   
   
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <parent>
  5. <groupId>com.mocoline.demo</groupId>
  6. <artifactId>dubbo-demo-parent</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. </parent>
  9. <artifactId>dubbo-demo-consumer</artifactId>
  10. <dependencies>
  11. <dependency>
  12. <groupId>com.mocoline.demo</groupId>
  13. <artifactId>dubbo-demo-api</artifactId>
  14. <version>${project.parent.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.alibaba</groupId>
  18. <artifactId>dubbo</artifactId>
  19. </dependency>
  20. </dependencies>
  21. </project>

具体的调用过程:

   
   
   
   
  1. package com.mocoline.demo.dubbo;
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;
  3. public class Consumer {
  4.    public static void main(String[] args) throws Exception {
  5.        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"consumer.xml"});
  6.        context.start();
  7.        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
  8.        String hello = demoService.sayHello("world"); // 执行远程方法
  9.        System.out.println( hello ); // 显示调用结果
  10.    }
  11. }

可以看出,调用远程服务的时候,和普通本地调用完全一样。具体的依赖关系通过配置文件consumer.xml完成,具体配置如下:

   
   
   
   
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://code.alibabatech.com/schema/dubbo
  8. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  9.    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
  10.    <dubbo:application name="consumer-of-helloworld-app"  />
  11.    <!-- 使用multicast广播注册中心暴露发现服务地址 -->
  12.    <dubbo:registry address="multicast://224.5.6.7:1234" />
  13.    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
  14.    <dubbo:reference id="demoService" interface="com.mocoline.demo.dubbo.DemoService" />
  15. </beans>

代码完成,如果刚才的provider还没退出,那么运行Consumer可以看到:



回顾

从上面的例子可以看到:

  • Consumer成功调用了Provider实现的api接口。

  • 在代码结构上,Consumer和Provider是完全独立的,这一点通过pom的配置文件可以看出,两个工程是没有任何依赖,他们共同依赖的只有api的声明和dubbo相关的内容。

  • dubbo会将服务提供着的业务实现发布到指定的端口;同时在消费者本地创建一个远程调用的代理,具体的调用过程,完全由dubbo去完成。



您还想了解或讨论dubbo的哪些内容,请在评论中留言,或者发送邮件到[email protected],后面的文章会根据大家反馈来进行编写。

你可能感兴趣的:(高并发,DUBBO,SOA,dubbox)