Dubbo(一) -- 初体验
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架。
一、Dubbo出现的背景
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进;

1.当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
2.当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
3.接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
二、Dubbo架构

1.节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
2.调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
三、Dubbo后台部署管理
1.源码下载
1. 访问www.github.com 网站
2. 搜索dubbo服务框架
3. 搜索到git的地址:https://github.com/alibaba/dubbo.git
4. 通过git客户端clone代码
5. Dubbo源码导入到Eclipse遇到的问题:http://www.cnblogs.com/xbq8080/p/6792375.html
2.dubbo控制台部署
方式一:
启动dubbo源码中的dubbo-admin模块:
1. 找到dubbo-admin 模块
2. 修改dubbo.properties的配置,包括注册中心的配置,以下是zookeeper的示例
dubbo.registry.address=zookeeper://101.200.129.112:2181;zookeeper://101.200.129.112:2182;zookeeper://101.200.129.112:2183
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
3. 部署到web容器中,启动服务即可,启动服务需要很久一段时间。

4.服务启动成功后,登录到控制台

5.查看zookeeper中的节点: ls /,发现产生了dubbo节点

方式二:
直接下载dubbot.war,修改修改dubbo.properties的配置(和方式一修改方式一样),放到tomcat中启动,下载地址:http://download.csdn.net/download/u010821757/10030525
方式二更加简单方便,而且支持JDK1.8。
四、实例:Hello World
架构如下所示:

1.建立三个maven工程,分别是 provider,api,consumer。
直接在Eclipse中建立、或者直接使用Maven索架来生成。
这里在Eclipse中分别新建三个项目,当然也可以不新建三个项目,分为三个模块也可以:
1).新建DubboApiDemo项目
2).新建DubboProviderDemo 项目
3).新建DubboConsumerDemo项目
2.Api工程,此工程用于提供接口服务
1)新建 IHelloWorld 接口:
package com.dubbo.demo.api; /**
* 提供接口服务
* @author xbq
*/
public interface IHelloWorld {
// 接口
public String sayHello(String name);
}
2) 使用maven工具打包到Maven私服,即Maven install
成功后,会成成一个jar包,如下图所示:

3.Provider工程,生产者
1)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.dubbo.demo.provider</groupId>
<artifactId>DubboPrividerDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>DubboPrividerDemo</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>
<version>4.10</version>
<scope>test</scope>
</dependency> <dependency> <!-- 刚刚打包的api jar,在这里引用 -->
<groupId>com.dubbo.demo.api</groupId>
<artifactId>DubboApiDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.16</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>7.0.0.pre5</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
2)provider.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="hello-world-provider"/> <!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.242.130:2181?backup=192.168.242.130:2182,192.168.242.130:2183" id="zk"/> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/> <!-- 具体的bean实现 -->
<bean id="helloWorldService" class="com.dubbo.demo.provider.HelloWorldServiceImpl" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.dubbo.demo.api.IHelloWorld" ref="helloWorldService" protocol="dubbo" registry="zk"/>
</beans>
dubbo:registry 标签一些属性的说明:
1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
2)check注册中心不存在时,是否报错。
3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
4)timeout注册中心请求超时时间(毫秒)。
5)address可以Zookeeper集群配置,地址可以多个以分号隔开等。
dubbo:service标签的一些属性说明:
1)interface服务接口的路径
2)ref引用对应的实现类的Bean的ID
3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
4)register 默认true ,该协议的服务是否注册到注册中心。
3)实现接口
package com.dubbo.demo.provider; import com.dubbo.demo.api.IHelloWorld; /**
* 实现接口
* @author xbq
* 可以调用 IHelloWorld ,是因为 引入了的 api项目的依赖
*/
public class HelloWorldServiceImpl implements IHelloWorld{ @Override
public String sayHello(String name) {
return "Hello World!" + name;
} }
4)启动生产者服务
package com.dubbo.demo.provider; import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 启动生产者服务
* @author xbq
*/
public class Main { public static void main(String[] args) {
// 引用xml文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");
context.start(); try {
// 为保证服务一直开着,利用输入流的阻塞来模拟
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.Consumer工程,消费者
1)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.dubbo.demo.consumer</groupId>
<artifactId>DubboConsumerDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>DubboConsumerDemo</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>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
<dependency> <!-- 刚刚打包的api jar,在这里引用 -->
<groupId>com.dubbo.demo.api</groupId>
<artifactId>DubboApiDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
</project>
2)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="hello-world-consumer"/> <!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://192.168.242.130:2181?backup=192.168.242.130:2182,192.168.242.130:2183" id="zk"/> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881"/> <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
<dubbo:reference interface="com.dubbo.demo.api.IHelloWorld" id="helloService" protocol="dubbo" registry="zk" />
</beans>
dubbo:reference 的一些属性的说明:
1)interface调用的服务接口
2)check 启动时检查提供者是否存在,true报错,false忽略
3)registry 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔
4)loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
3)启动消费者服务
package com.dubbo.demo.consumer; import java.io.IOException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dubbo.demo.api.IHelloWorld; /**
* 启动消费者服务
* @author xbq
*/
public class Main { public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start(); IHelloWorld helloWorld = (IHelloWorld)context.getBean("helloService");
String str = helloWorld.sayHello("Joe");
System.out.println(str); try {
// 为保证服务一直开着,利用输入流的阻塞来模拟
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
五、启动生产者和消费者
1.启动生产者,执行生产者的 main方法
2.查看dubbo控制台开启的服务,可以看到发布的生产者是正常状态,下图:

3.查看zookeeper中dubbo节点下的节点: ls /dubbo

4.启动消费者,执行消费者的main方法
5.查看Eclipse控制台打印的消息,则说明接口调用成功:

6.查看dubbo控制台中的应用,既有生产者,又有消费者,如下图:

六、源码下载
dubbo接口:http://git.oschina.net/xbq168/DubboApiDemo
dubbo生产者:http://git.oschina.net/xbq168/DubboPrividerDemo
dubbo消费者:http://git.oschina.net/xbq168/DubboConsumerDemo
Dubbo(一) -- 初体验的更多相关文章
- Dubbo基础一之实战初体验
本以为写这个小作文没什么难度的,可是好像并不是.前段时间重心放在驾考科目二,就想着小作文科二考过了再写也不是事,因为都实战过了.今天想着写却发现脑袋里啥都想不起来了,得翻项目和笔记回忆一下.所以还是那 ...
- 阿里 RPC 框架 DUBBO 初体验
最近研究了一下阿里开源的分布式RPC框架dubbo,楼主写了一个 demo,体验了一下dubbo的功能. 快速开始 实际上,dubbo的官方文档已经提供了如何使用这个RPC框架example代码,基于 ...
- dubbo实战之一:准备和初体验
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 蚂蚁 RPC 框架 SOFA-RPC 初体验
前言 最近蚂蚁金服开源了分布式框架 SOFA,楼主写了一个 demo,体验了一下 SOFA 的功能,SOFA 完全兼容 SpringBoot(当然 Dubbo 也是可以兼容的). 项目地址:Alipa ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
随机推荐
- 解决Sublime Text 3 中文乱码
1.按ctrl+~快捷键,调出一个小文本款,然后粘贴以下代码: import urllib.request, os, hashlib; h = '7183a2d3e96f11eeadd761d777e ...
- Linux Shell sort排序常用命令(转载)
转载自:http://blog.csdn.net/monkeyduck/article/details/10097829 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则 ...
- springmvc集成Freemarke配置的几点
项目结构图 废话不多说, 集成步骤: 1.web.xml spring-mvc配置 <?xml version="1.0" encoding="UTF-8&quo ...
- iOS键盘类型以及样式展示
UIKeyboardTypeDefault: UIKeyboardTypeASCIICapable: UIKeyboardTypeNumbersAndPunctuation: UIKeyboardTy ...
- win8 X64 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序
操作系统是Windows 8 64位,安装了Microsoft Office 2013,从SQL Server 2008中导入Excel文件时出现提示: 未在本地计算机上注册“Microsoft.AC ...
- python基础系列教程——Python库的安装与卸载
python基础系列教程——Python库的安装与卸载 2.1 Python库的安装 window下python2.python3安装包的方法 2.1.1在线安装 安装好python.设置好环境变量后 ...
- jsp c标签不遍历的方法
生产中遇到过不需要遍历的事情. 一般遍历必须要 <c:forEach items="${resultObj.xxx}" var="data" varSta ...
- C# Winform获取bin目录的路径
//获取到bin目录的下层路径:bin\Debug\ string aa = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBa ...
- PHP中Array的hash函数实现
PHP中使用最多的非Array莫属了,那Array是如何实现的? 在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂 ...
- PS_图象调整_太暗/过亮_曝光不足/过度
对于曝光不足,图像太暗. 1.调整[色阶] 图象>调整>色阶 clrl+L 然后拖动"黑","灰","白"三个滑块. 2.使 ...