dubbo入门 - idea搭建一个简单Demo

个人理解:

在单机系统中我们可以通过配置spring,利用依赖注入@Autowired来使用我们需要的接口,但在分布式系统中,我们只能通过远程调用的方式来调用其他系统中的接口。这就需要我们把接口注册到zookeeper中,然后通过dubbo来实现远程调用。这一方式和spring的依赖注入并不冲突,我们可以只暴露一部分需要暴露给其它系统的接口(供他们调用),配置到dubbo的包扫描中。

一、创建Maven多模块项目

1. 创建root项目Dubbo_demos,把一些通用的依赖全部放置到这里,子模块通过new module创建:

root项目
创建三个子模块

2. 把root项目的src目录删除掉,只留下pom.xml

模块介绍:

  • dubbo-api            ----API接口
  • dubbo-consumer ----消费者
  • dubbo-provider    ----生产者

dubbo-api  Service 提供的接口,provider 实现了 api 接口,并对外开放http端口,consumer依赖 api 工程,但是不会直接依赖provider工程。 这种可以让消费者仅仅依赖api工程,而不需要对provider工程的依赖,也是松耦合的经典。

3. 修改root项目的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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.fendo</groupId>
  <artifactId>Dubbo_demos</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>dubbo</name>
  <description>dubbo示例</description>
  
  
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    
    <!-- spring版本号 -->
    <spring.version>4.2.5.RELEASE</spring.version>
    
    <!-- log4j日志包版本号 -->
    <slf4j.version>1.7.18</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
    
   </properties>
   
   
   
   <dependencyManagement>
      <dependencies>
	    
	    <!-- 添加junit4依赖 -->
	    <dependency>
	      <groupId>junit</groupId>
	      <artifactId>junit</artifactId>
	      <version>4.11</version>
	    </dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</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-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
   
	    <!-- 添加日志相关jar包 -->
	    <dependency>
	      <groupId>log4j</groupId>
	      <artifactId>log4j</artifactId>
	      <version>${log4j.version}</version>
	    </dependency>
	    <dependency>
	      <groupId>org.slf4j</groupId>
	      <artifactId>slf4j-api</artifactId>
	      <version>${slf4j.version}</version>
	    </dependency>
	    <dependency>
	      <groupId>org.slf4j</groupId>
	      <artifactId>slf4j-log4j12</artifactId>
	      <version>${slf4j.version}</version>
	    </dependency>
    
	     <dependency>
	         <groupId>commons-logging</groupId>
	         <artifactId>commons-logging</artifactId>
	         <version>1.2</version>
	     </dependency>
    
	    <!-- dubbo -->
	    <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 zkclient-->
		<dependency>
		    <groupId>com.github.sgroschupf</groupId>
		    <artifactId>zkclient</artifactId>
		    <version>0.1</version>
		</dependency>
    
   </dependencies>
  </dependencyManagement>
  
  
</project>

4. 修改provider的pom.xml如下成功如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  
  <parent>
    <artifactId>Dubbo_demos</artifactId>
    <groupId>com.fendo</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  
  <groupId>com.fendo</groupId>
  <artifactId>dubbo-provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>dubbo-provider</name>
  <url>http://maven.apache.org</url>
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  
  <dependencies>
  
  		<dependency>
	    	<groupId>com.fendo</groupId>
	    	<artifactId>dubbo-api</artifactId>
	    	<version>0.0.1-SNAPSHOT</version>
        </dependency>
  		
  
		<dependency>
	      <groupId>junit</groupId>
	      <artifactId>junit</artifactId>
	    </dependency>
 
    	<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		
		
		<!-- 添加日志相关jar包 -->
	    <dependency>
	      <groupId>log4j</groupId>
	      <artifactId>log4j</artifactId>
	    </dependency>
	    <dependency>
	      <groupId>org.slf4j</groupId>
	      <artifactId>slf4j-api</artifactId>
	    </dependency>
	    <dependency>
	      <groupId>org.slf4j</groupId>
	      <artifactId>slf4j-log4j12</artifactId>
	    </dependency>
    
	     <!-- dubbo -->
	    <dependency>
	      <groupId>com.alibaba</groupId>
	      <artifactId>dubbo</artifactId>
	      <exclusions>
	        <exclusion>
	          <groupId>org.springframework</groupId>
	          <artifactId>spring</artifactId>
	        </exclusion>
	      </exclusions>
	    </dependency>
    
    	<!-- Zookeeper zkclient-->
		<dependency>
		    <groupId>com.github.sgroschupf</groupId>
		    <artifactId>zkclient</artifactId>
		</dependency>
  </dependencies>
  
</project>

5. 修改consumer的pom.xml如下成功如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  
  
  <parent>
    <artifactId>Dubbo_demos</artifactId>
    <groupId>com.fendo</groupId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  
  <groupId>com.fendo</groupId>
  <artifactId>dubbo-consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>dubbo-consumer</name>
  <url>http://maven.apache.org</url>
  
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  
  <dependencies>
  
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    
     <dependency>
    	<groupId>com.fendo</groupId>
    	<artifactId>dubbo-api</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
     </dependency>
    
    <dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
    </dependency>
 
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
	</dependency>
	
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
	</dependency>
 
    <!-- dubbo -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.springframework</groupId>
          <artifactId>spring</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
   
   	<!-- Zookeeper zkclient-->
	<dependency>
	    <groupId>com.github.sgroschupf</groupId>
	    <artifactId>zkclient</artifactId>
	</dependency>
    
  </dependencies>
</project>

结构如图:

二、定义接口API、bo对象、公共类及方法,这些是要提供方和调用方都需要的。

在dubbo-api模块中创建一个DemoService接口对外开发

package org.dubbo.api;

import java.util.List;

public interface DemoService {
    List<String> getPermissions(Long id);
}

三、定义Dubbo服务service,实现dubbo-api中的api接口,书写业务逻辑及DB操作。通过spring暴露服务。

在provider模块下创建DemoService实现类DemoServiceImpl

package org.dubbo.provider.impl;

import org.dubbo.api.DemoService;

import java.util.ArrayList;
import java.util.List;

public class DemoServiceImpl implements DemoService {

    public List<String> getPermissions(Long id) {
        List<String> demo = new ArrayList<String>();
        demo.add(String.format("Permission_%d", id - 1));
        demo.add(String.format("Permission_%d", id));
        demo.add(String.format("Permission_%d", id + 1));
        return demo;
    }
}

以及消费者启动类 Provider 

package org.dubbo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;

public class Provider {

    public static void main(String[] args) throws IOException {

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:provider.xml");

        context.start();
        System.out.println("provider服务已经启动...");
        System.in.read();
    }
}

然后resources目录下新建两个xml文件

provider.xml是dubbo的配置文件:

<?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-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
    <dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
    <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
    <dubbo:service interface="org.dubbo.api.DemoService" ref="demoService" protocol="dubbo" />
    <!--具体实现该接口的 bean-->
    <bean id="demoService" class="org.dubbo.provider.impl.DemoServiceImpl"/>
</beans>

四、定义调用端也叫消费端,实现对应的控制层。通过spring获取服务。

类似provider

创建消费者运行类:

package org.dubbo.consumer;

import org.dubbo.api.DemoService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer
{
    public static void main(String[] args) {
        //测试常规服务
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        System.out.println("consumer启动");
        DemoService demoService = (DemoService) context.getBean(DemoService.class);
        System.out.println(demoService.getPermissions(1L));
    }
}

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="demotest-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
    <dubbo:reference id="demoService" interface="org.dubbo.api.DemoService"/>

</beans>

五、使用zookeeper注册中心。

下载好zookeeper,运行zkServer.cmd挂着

六、启动Dubbo的service端,即provider。

启动zookeeper之后,然后运行dubbo-provider中的Provider类

启动portal端,即所谓的consumer,dubbo-consumer中的Consumer类

 至此,调用成功✌✌✌

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值