Dubbo是什么?
Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
其核心部分包含:
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
- 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
- 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
- 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
----------------------------------------------------------------------------------------------------------------------------------------------------
****************************************************************************************************************************
----------------------------------------------------------------------------------------------------------------------------------------------------
以上内容来源Dubbo官网,另外深入学习Dubbo必须访问的站点就是它的官网.我这里只是写一个简单的使用教程,有一个快速入门的基础.
Dubbo官方资源(因为'墙'原因,部分资源无响应.图鉴使用github下载源码):
- Duboo的下载:https://github.com/alibaba/dubbo
- Dubbo的使用:http://dubbo.io/User+Guide-zh.htm
- Dubbo的扩展以及内部原理:http://dubbo.io/Developer+Guide-zh.htm
我这里讲解的dubbo2.4.11版本,其他各版本大体相同,具体差异可能也有.需要去查看相关的document:
生产者配置:
<description>dubbo配置示例之生产者配置</description>
<!-- 生产者的项目配置 -->
<dubbo:application id="demoApplication"
name="demoApplication"
owner="pan"
organization="cn"
logger="slf4j"
compiler="javassist"/>
<!--协议,可以配置多个-->
<dubbo:protocol id="demoServerProtocol"
name="dubbo"
port="-1"
dispatcher="message"
threadpool="limited"
threads="20">
</dubbo:protocol>
<!--注册中心-->
<dubbo:registry id="demoServerRegistry"
protocol="zookeeper"
address="zk地址"
client="zkclient"
group="族的位置"
session="60000"
register="false"
subscribe="false"
check="false" file="demo_erver-registry-cache.properties">
</dubbo:registry>
<!--生产者配置-->
<dubbo:provider id="demoServerProvider"
application="demoServerApplication"
registry="demoServerRegistry"
protocol="demoServerProtocol"
cluster="failover"
loadbalance="leastactive"
serialization="hessian2"
retries="0"
timeout="15000"
proxy="javassist"
delay="-1">
</dubbo:provider>
<!--生产者的接口提供远程调用的bean ref是对应的bean名-->
<dubbo:service interface="com.pan.demo.service.Service1" ref="demoService1"/>
<dubbo:service interface="com.pan.demo.service.Service2" ref="demoService2"/>
<dubbo:service interface="com.pan.demo.service.Service3" ref="demoService3"/>
(1)同一IP运行起来几个Provider,listen 端口号从默认端口号向大绑定:将port配置为-1
然后,消费者依赖生产者.
消费者的配置:
<description>dubbo示例之消费者配置</description>
<!--注册中心-->
<dubbo:registry id="demoClientRegistry"
protocol="zookeeper"
client="zkclient"
address="zk注册中心地址"
group="组地址"
subscribe="true"
check="false" file="demo_client_dubbo_registry_cache.properties">
</dubbo:registry>
<!--消费者配置-->
<dubbo:consumer id="demoServiceConsumer"
registry="demoClientRegistry"
init="false"
check="false"
timeout="15000"
retries="0">
</dubbo:consumer>
<!-- 消费者获取远程对象注入本地接口配置的bean -->
<dubbo:reference id="demoClientService1" interface="com.pan.demo.Service1" consumer="demoServiceConsumer"/>
<dubbo:reference id="demoClientService2" interface="com.pan.demo.Service2" consumer="demoServiceConsumer"/>
<dubbo:reference id="demoClientService3" interface="com.pan.demo.Service3" consumer="demoServiceConsumer"/>
总结,使用dubbo远程调用的前提:
1.安装配置好zookeeper或者其他服务监听框架.
2.引入jar包.
3.生产者与消费者都需要引入zookeeper,zkclient,dubbojar,spring,log4j包.
4.消费者依赖生产者或者他们共同依赖同一个接口.
4.其他一些异常处理...例如check文件共用了之类的.
好了,现在可以远程调用了.
@Resource("demoClientService1")//可以不指定名称,前提是bean配好.
private DemoService1 service ;
public static void main(String[] args){
sysoout(service.foo("word")) ;
}
OK,使用已经可以了.
具体配置的含义,请参照官方文档.这里写出来太多了.
之后会写一些阅读源码的心得,以及metaq的使用.
maven的基本依赖一份:
<!-- 基本配置 -->
<properties>
<spring.version>4.3.3.RELEASE</spring.version>
<zookeeper.version>3.4.9</zookeeper.version>
<zkclient.version>0.9</zkclient.version>
<dubbo.version>2.4.11</dubbo.version>
<junit.version>4.12</junit.version>
</properties>
<!-- 基本依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
项目依赖根据自己需要调用的接口加入.
来源:oschina
链接:https://my.oschina.net/u/2934716/blog/755005