Dubbo(1)——入门基础与实例讲解

来源:互联网 发布:整型数组转换成字符串 编辑:程序博客网 时间:2024/06/06 01:29

 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

           Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

一、Dubbo简介

1.1、Dubbo是什么?

        Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

1.2. Dubbo能做什么?

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

1.3. dubbo的架构

dubbo架构图如下所示:

节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

1.4. dubbo使用方法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。如果不想使用Spring配置,而希望通过API的方式进行调用(不推荐)
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

下面以一个实例来做说明,看这个实例前,建议先看看这里 Dubbo-Admin管理平台和Zookeeper注册中心的搭建

二、服务提供者

提供者的目录如下:工程下载地址:http://download.csdn.NET/detail/evankaka/9054253

其中初始化工程的创建如下:

首先,选择创建

然后,next,记得红框打上,这里直接快速

最后,输入项目名等

好了,项目有了,接下来就是加代码了

1、service代码

接口层如下:ProviderService.Java

[java] view plain copy
  1. package com.lin.service;  
  2.   
  3. /** 
  4.  * 功能概要:提供者service接口层 
  5.  *  
  6.  * @author linbingwen 
  7.  * @since  2015年8月26日  
  8.  */  
  9. public interface ProviderService {  
  10.     public String sayHello(String name);  
  11.   
  12. }  

实现层如下:ProviderServiceImpl.java

[java] view plain copy
  1. package com.lin.service;  
  2. /** 
  3.  * 功能概要:功能概要:提供者service实现层 
  4.  *  
  5.  * @author linbingwen 
  6.  * @since  2015年8月26日  
  7.  */  
  8. public class ProviderServiceImpl implements ProviderService {  
  9.   
  10.     public String sayHello(String name) {         
  11.         return "Hello:~~~~~~~~~~~~~~~~~~~~~~~~"+name+"你好,你好~~";  
  12.     }  
  13.   
  14. }  

2、spring配置文件-applicationProvider.xml

[java] view plain copy
  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" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.         http://www.springframework.org/schema/beans/spring-beans.xsd    
  6.         http://code.alibabatech.com/schema/dubbo    
  7.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">     
  8.     <!-- 具体的实现bean -->    
  9.     <bean id="providerService" class="com.lin.service.ProviderServiceImpl" />    
  10.     <!-- 提供方应用信息,用于计算依赖关系 -->    
  11.     <dubbo:application name="dubbo_provider"  />      
  12.     <!-- 使用multicast广播注册中心暴露服务地址     
  13.     <dubbo:registry address="multicast://localhost:1234" />-->     
  14.     <!-- 使用zookeeper注册中心暴露服务地址 -->    
  15.     <dubbo:registry address="zookeeper://127.0.0.1:2181" />       
  16.     <!-- 用dubbo协议在20880端口暴露服务 -->    
  17.     <dubbo:protocol name="dubbo" port="29014" />    
  18.     <!-- 声明需要暴露的服务接口 -->    
  19.     <dubbo:service interface="com.lin.service.ProviderService" ref="providerService" />    
  20. </beans>   

3、pom.xml中依赖文件

[html] view plain copy
  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.lin</groupId>  
  5.     <artifactId>dubbo_provider</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.     <properties>  
  8.         <spring.version>3.2.8.RELEASE</spring.version>  
  9.     </properties>  
  10.   
  11.     <dependencies>  
  12.         <dependency>  
  13.             <groupId>com.alibaba</groupId>  
  14.             <artifactId>dubbo</artifactId>  
  15.             <version>2.5.3</version>  
  16.             <exclusions>  
  17.                 <exclusion>  
  18.                     <groupId>org.springframework</groupId>  
  19.                     <artifactId>spring</artifactId>  
  20.                 </exclusion>  
  21.             </exclusions>  
  22.         </dependency>  
  23.         <dependency>  
  24.             <groupId>com.github.sgroschupf</groupId>  
  25.             <artifactId>zkclient</artifactId>  
  26.             <version>0.1</version>  
  27.         </dependency>  
  28.         <!-- spring相关 -->  
  29.         <dependency>  
  30.             <groupId>org.springframework</groupId>  
  31.             <artifactId>spring-core</artifactId>  
  32.             <version>${spring.version}</version>  
  33.         </dependency>  
  34.         <dependency>  
  35.             <groupId>org.springframework</groupId>  
  36.             <artifactId>spring-beans</artifactId>  
  37.             <version>${spring.version}</version>  
  38.         </dependency>  
  39.         <dependency>  
  40.             <groupId>org.springframework</groupId>  
  41.             <artifactId>spring-context</artifactId>  
  42.             <version>${spring.version}</version>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>org.springframework</groupId>  
  46.             <artifactId>spring-jdbc</artifactId>  
  47.             <version>${spring.version}</version>  
  48.         </dependency>  
  49.         <dependency>  
  50.             <groupId>org.springframework</groupId>  
  51.             <artifactId>spring-web</artifactId>  
  52.             <version>${spring.version}</version>  
  53.         </dependency>  
  54.         <dependency>  
  55.             <groupId>org.springframework</groupId>  
  56.             <artifactId>spring-webmvc</artifactId>  
  57.             <version>${spring.version}</version>  
  58.         </dependency>  
  59.         <dependency>  
  60.             <groupId>org.springframework</groupId>  
  61.             <artifactId>spring-aop</artifactId>  
  62.             <version>${spring.version}</version>  
  63.         </dependency>  
  64.         <dependency>  
  65.             <groupId>org.springframework</groupId>  
  66.             <artifactId>spring-tx</artifactId>  
  67.             <version>${spring.version}</version>  
  68.         </dependency>  
  69.         <dependency>  
  70.             <groupId>org.springframework</groupId>  
  71.             <artifactId>spring-orm</artifactId>  
  72.             <version>${spring.version}</version>  
  73.         </dependency>  
  74.         <dependency>  
  75.             <groupId>org.springframework</groupId>  
  76.             <artifactId>spring-context-support</artifactId>  
  77.             <version>${spring.version}</version>  
  78.         </dependency>  
  79.         <dependency>  
  80.             <groupId>org.springframework</groupId>  
  81.             <artifactId>spring-test</artifactId>  
  82.             <version>${spring.version}</version>  
  83.         </dependency>  
  84.         <dependency>  
  85.             <groupId>org.springframework</groupId>  
  86.             <artifactId>spring-jms</artifactId>  
  87.             <version>${spring.version}</version>  
  88.         </dependency>  
  89.     </dependencies>  
  90. </project>  

4、启动提供者服务

在src/test/java下添加

ProviderServiceTest.java内容如下:

[java] view plain copy
  1. package com.lin.service;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. /** 
  8.  * 功能概要: 
  9.  *  
  10.  * @author linbingwen 
  11.  * @since  2015年8月26日  
  12.  */  
  13. public class ProviderServiceTest {  
  14.   
  15.     /** 
  16.      * @author linbingwen 
  17.      * @since  2015年8月26日  
  18.      * @param args     
  19.      */  
  20.     public static void main(String[] args) {  
  21.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(    
  22.                 new String[]{"applicationProvider.xml"});    
  23.         context.start();   
  24.         System.out.println("提供者服务已注册成功");    
  25.         System.out.println("请按任意键取消提供者服务");    
  26.         try {  
  27.             System.in.read();//让此程序一直跑,表示一直提供服务  
  28.         } catch (IOException e) {         
  29.             e.printStackTrace();  
  30.         }    
  31.     }  
  32.   
  33. }  

运行结果:

因为我这里使用的是本地的zookeeper注册中心,所以一定要先打开它!!!一定要先打开它!!!一定要先打开它!!!打开D:\Java\Tool\zookeeper-3.4.6\bin下的zkServer.cmd,然后一直开着,不要关了!!!!!!!!!!!!!然后一直开着,不要关了!!!!!!!!!!!!!


接着运行上面的main方法,输出如下:

然后我们可以到注册中心去看看服务注册上去了没有。(注意,这里的zookeper注册中心在我本地电脑已搭建好,搭建过程看这里Dubbo-Admin管理平台和Zookeeper注册中心的搭建)



可以看到,提供者已注册成功。

三、消费者

1、还是一个maven项目,整个结构如下,工程下载地址:http://download.csdn.net/detail/evankaka/9054253


2、Spring配置文件applicationConsumer.xml

[html] view plain copy
  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" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans    
  5.         http://www.springframework.org/schema/beans/spring-beans.xsd    
  6.         http://code.alibabatech.com/schema/dubbo    
  7.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">          
  8.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->    
  9.     <dubbo:application name="dubbo_consumer" />       
  10.       <!-- 使用multicast广播注册中心暴露发现服务地址 -->    
  11.     <dubbo:registry  protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />         
  12.       <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->    
  13.     <dubbo:reference id="providerService" interface="com.lin.service.ProviderService" />    
  14. </beans>   

3、pom.xml文件如下

[java] view plain copy
  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.lin</groupId>  
  5.     <artifactId>dubbo_consumer</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.   
  8.     <properties>  
  9.         <spring.version>3.2.8.RELEASE</spring.version>  
  10.     </properties>  
  11.   
  12.     <dependencies>  
  13.         <!-- 添加provider的jar包 -->  
  14.         <dependency>  
  15.             <groupId>com.lin</groupId>  
  16.             <artifactId>dubbo_provider</artifactId>  
  17.             <version>0.0.1-SNAPSHOT</version>  
  18.         </dependency>  
  19.         <!-- 添加dubbo依赖 -->  
  20.         <dependency>  
  21.             <groupId>com.alibaba</groupId>  
  22.             <artifactId>dubbo</artifactId>  
  23.             <version>2.5.3</version>  
  24.             <exclusions>  
  25.                 <exclusion>  
  26.                     <groupId>org.springframework</groupId>  
  27.                     <artifactId>spring</artifactId>  
  28.                 </exclusion>  
  29.             </exclusions>  
  30.         </dependency>  
  31.         <!-- 添加zk客户端依赖 -->  
  32.         <dependency>  
  33.             <groupId>com.github.sgroschupf</groupId>  
  34.             <artifactId>zkclient</artifactId>  
  35.             <version>0.1</version>  
  36.         </dependency>  
  37.         <!-- spring相关 -->  
  38.         <dependency>  
  39.             <groupId>org.springframework</groupId>  
  40.             <artifactId>spring-core</artifactId>  
  41.             <version>${spring.version}</version>  
  42.         </dependency>  
  43.         <dependency>  
  44.             <groupId>org.springframework</groupId>  
  45.             <artifactId>spring-beans</artifactId>  
  46.             <version>${spring.version}</version>  
  47.         </dependency>  
  48.         <dependency>  
  49.             <groupId>org.springframework</groupId>  
  50.             <artifactId>spring-context</artifactId>  
  51.             <version>${spring.version}</version>  
  52.         </dependency>  
  53.         <dependency>  
  54.             <groupId>org.springframework</groupId>  
  55.             <artifactId>spring-jdbc</artifactId>  
  56.             <version>${spring.version}</version>  
  57.         </dependency>  
  58.         <dependency>  
  59.             <groupId>org.springframework</groupId>  
  60.             <artifactId>spring-web</artifactId>  
  61.             <version>${spring.version}</version>  
  62.         </dependency>  
  63.         <dependency>  
  64.             <groupId>org.springframework</groupId>  
  65.             <artifactId>spring-webmvc</artifactId>  
  66.             <version>${spring.version}</version>  
  67.         </dependency>  
  68.         <dependency>  
  69.             <groupId>org.springframework</groupId>  
  70.             <artifactId>spring-aop</artifactId>  
  71.             <version>${spring.version}</version>  
  72.         </dependency>  
  73.         <dependency>  
  74.             <groupId>org.springframework</groupId>  
  75.             <artifactId>spring-tx</artifactId>  
  76.             <version>${spring.version}</version>  
  77.         </dependency>  
  78.         <dependency>  
  79.             <groupId>org.springframework</groupId>  
  80.             <artifactId>spring-orm</artifactId>  
  81.             <version>${spring.version}</version>  
  82.         </dependency>  
  83.         <dependency>  
  84.             <groupId>org.springframework</groupId>  
  85.             <artifactId>spring-context-support</artifactId>  
  86.             <version>${spring.version}</version>  
  87.         </dependency>  
  88.         <dependency>  
  89.             <groupId>org.springframework</groupId>  
  90.             <artifactId>spring-test</artifactId>  
  91.             <version>${spring.version}</version>  
  92.         </dependency>  
  93.         <dependency>  
  94.             <groupId>org.springframework</groupId>  
  95.             <artifactId>spring-jms</artifactId>  
  96.             <version>${spring.version}</version>  
  97.         </dependency>  
  98.     </dependencies>  
  99. </project>  
和提供者的POM文件基本上是一样的,只不过加了对提供者的依赖。

4、消费者调用提供者

在src/test/java写一个ConsumerServiceTest.java

[java] view plain copy
  1. package com.lin.service;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. /** 
  8.  * 功能概要: 
  9.  *  
  10.  * @author linbingwen 
  11.  * @since  2015年8月26日  
  12.  */  
  13. public class ConsumerServiceTest {  
  14.   
  15.     /** 
  16.      * @author linbingwen 
  17.      * @since  2015年8月26日  
  18.      * @param args     
  19.      */  
  20.     public static void main(String[] args) {  
  21.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
  22.                 new String[] { "applicationConsumer.xml" });  
  23.           
  24.         context.start();  
  25.         ProviderService providerService = (ProviderService) context.getBean("providerService");  
  26.   
  27.         System.out.println(providerService.sayHello("林炳文Evankaka"));  
  28.         System.out.println("Press any key to exit.");    
  29.         try {  
  30.             System.in.read();  
  31.         } catch (IOException e) {         
  32.             e.printStackTrace();  
  33.         }    
  34.   
  35.     }  
  36.   
  37. }  
然后启动:


再打开注册中心,发面有消费者在使用提供者,因为都是一个电脑,所以IP都一样。当然。其它电脑也可以访问这个提供者的!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奶奶出钱由孙子抓奖中奖后怎么办 我不想学车了驾校不同意退学怎么办 2017年大学挂科面临退学怎么办 微信重新登录后东西全没了怎么办 宝宝吃鸡蛋过敏全身起红疹怎么办 180在产蛋鸡因断鸡减产怎么办 住友39熔接机熔接损耗大怎么办 支付宝实名认证刷脸失败怎么办 支付宝注册刷脸不是本人怎么办 小学科学只考88分中学怎么办 收银机关机时才上传数据是怎么办 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办