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

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

准备工作

创建maven工程

dubbo学习总结-(1)dubbo快速体验_第1张图片

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. 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. 4.0.0
  4. com.mocoline.demo
  5. dubbo-demo-parent
  6. 0.0.1-SNAPSHOT
  7. pom
  8. dubbo-demo-api
  9. dubbo-demo-consumer
  10. dubbo-demo-provider
  11. org.springframework
  12. spring-framework-bom
  13. 4.3.8.RELEASE
  14. pom
  15. import
  16. com.alibaba
  17. dubbo
  18. 2.8.4
  19. org.apache.maven.plugins
  20. maven-compiler-plugin
  21. 3.6.1
  22. 1.6
  23. 1.6


dubbo-demo-api

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

pom.xml非常简单:

 
  
  1. 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.  4.0.0
  5.  
  6.    com.mocoline.demo
  7.    dubbo-demo-parent
  8.    0.0.1-SNAPSHOT
  9.  
  10.  dubbo-demo-api

接口定义:

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

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


dubbo-demo-provider

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

 
  
  1. 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.    4.0.0
  4.    
  5.        com.mocoline.demo
  6.        dubbo-demo-parent
  7.        0.0.1-SNAPSHOT
  8.    
  9.    dubbo-demo-provider
  10.    
  11.        
  12.            com.mocoline.demo
  13.            dubbo-demo-api
  14.            ${project.parent.version}
  15.        
  16.    
  17.        
  18.            com.alibaba
  19.            dubbo
  20.        
  21.    

实现服务接口:

 
  
  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. 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.     name="hello-world-app"  />
  11.    
  12.     address="multicast://224.5.6.7:1234" />
  13.    
  14.     name="dubbo" port="20880" />
  15.    
  16.     interface="com.mocoline.demo.dubbo.DemoService" ref="demoService" />
  17.    
  18.     id="demoService" class="com.mocoline.demo.dubbo.impl.DemoServiceImpl" />


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

dubbo学习总结-(1)dubbo快速体验_第2张图片

dubbo-demo-consumer

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

 
   
  1. 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. 4.0.0
  4. com.mocoline.demo
  5. dubbo-demo-parent
  6. 0.0.1-SNAPSHOT
  7. dubbo-demo-consumer
  8. com.mocoline.demo
  9. dubbo-demo-api
  10. ${project.parent.version}
  11. com.alibaba
  12. dubbo

具体的调用过程:

 
   
  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. 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.     name="consumer-of-helloworld-app"  />
  11.    
  12.     address="multicast://224.5.6.7:1234" />
  13.    
  14.     id="demoService" interface="com.mocoline.demo.dubbo.DemoService" />

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

dubbo学习总结-(1)dubbo快速体验_第3张图片


回顾

从上面的例子可以看到:

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

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

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



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

你可能感兴趣的:(高并发,Java)