1. 概述
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。主要核心部件
Remoting: 网络通信框架,实现了sync-over-async 和 request-response 消息机制.
RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能
Registry: 服务目录框架用于服务的注册和服务事件发布和订阅。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
dubbo架构图如下所示:
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo的一些属性:
<dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
eg、<dubbo:service ref="demoService" interface="com.unj.dubbotest.provider.DemoService" />
<dubbo:reference/> 引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
eg、<dubbo:reference id="demoService" interface="com.unj.dubbotest.provider.DemoService" />
<dubbo:protocol/> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
eg、<dubbo:protocol name="dubbo" port="20880" />
<dubbo:application/> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
eg、<dubbo:application name="xixi_provider" />
<dubbo:application name="hehe_consumer" />
<dubbo:module/> 模块配置,用于配置当前模块信息,可选。
<dubbo:registry/> 注册中心配置,用于配置连接注册中心相关信息。
eg、<dubbo:registry address="zookeeper://192.168.2.249:2181" />
<dubbo:monitor/> 监控中心配置,用于配置连接监控中心相关信息,可选。
<dubbo:provider/> 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。
<dubbo:consumer/> 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。
<dubbo:method/> 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。
<dubbo:argument/> 用于指定方法参数配置。
注意:
服务端客户端的区分
服务端:dubbo:service
<dubbo:service protocol="dubbo" interface="com.chainfin.loan.service.LonApplicationService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}"
timeout="${dubbo.protocol.timeout}" ref="loanAppService" retries="0"/>
客户端:dubbo:reference
<!--消费方(用户注册) -->
<dubbo:reference id="loanAppDubboService" interface="com.chainfin.loan.service.LonApplicationService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
流程:服务端提供接口供客户端调用。理论上是服务端提供的接口外人是不知道的,也不知道项目的真实架构流程。
一般分为三步:1.服务端提供接口,一般部署在自己的内网。2、对外网暴漏在外的客户端接口,供别的项目调用接口。中间涉及到了黑白名单。不细说(我也没学会呢。)
服务端代码:
1、config.properties配置文件(包含数据库的,zk的,redis的等等一些配置信息)。
2、applicationContext.xml spring 配置文件,加载了配置文件。如
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:config.properties" />
3、applicationContext_dubbo_main_server.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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
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="dubbo_main_server" />
<!--注册中心 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" />
<!-- 用dubbo协议在20886端口暴露服务 -->
<dubbo:protocol name="dubbo" port="${dubbo_server_port}"
host="${dubbo_server_address}" />
<dubbo:protocol name="hessian" port="20887" host="${dubbo_server_address}" threadpool="${dubbo_server_threadpool_type}" threads="${dubbo_server_threadpool_threads}"/>
<dubbo:provider threads="2500" threadpool="cached"/>
<!-- 订单信息bean -->
<bean id="loanAppService"
class="com.chainfin.loan.modules.application.service.LonApplicationServiceImpl" />
<!-- 消息推送服务 -->
<bean id="messagePushService"
class="com.chainfin.loan.modules.msgPush.MessagePushServiceImpl" />
<!-- 订单信息暴露的服务接口 -->
<dubbo:service protocol="dubbo" interface="com.chainfin.loan.service.LonApplicationService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}"
timeout="${dubbo.protocol.timeout}" ref="loanAppService" retries="0"/>
<!-- 消息推送暴露的服务接口 -->
<dubbo:service protocol="dubbo" interface="com.chainfin.loan.service.MessagePushService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}"
timeout="${dubbo.protocol.timeout}" ref="messagePushService" retries="0"/>
</beans>
客户端代码:
1、config.properties,一些属性的配置文件信息
2、spring-context.xml spring的配置文件信息,里面加载了config.properties配置文件。
<context:property-placeholder ignore-unresolvable="true" location="classpath:config.properties" />
3、spring-context-dubbo-client.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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
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="loanDubbo-client-118" />
<!--注册中心-->
<dubbo:registry id="userzk" protocol="zookeeper" address="${dubbo.registry.address}" check="false"/>
<!--消费方(用户注册) -->
<dubbo:reference id="loanAppDubboService" interface="com.chainfin.loan.service.LonApplicationService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="smsSenderService" interface="com.chainfin.loan.service.SmsSenderService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="userContactService" interface="com.chainfin.loan.service.UserContactService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="userCommissionService" interface="com.chainfin.loan.service.UserCommissionService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="mgtUserDubboService" interface="com.chainfin.loan.service.MgtUserService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="commissionService" interface="com.chainfin.loan.service.CommissionService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<!-- 短信发送 -->
<dubbo:reference id="phoneCheckService" interface="com.chainfin.loan.service.PhoneCheckService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<!-- 用户活动奖励Service -->
<dubbo:reference id="commissionPromotionService" interface="com.chainfin.loan.service.CommissionPromotionService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<dubbo:reference id="userTreeService" interface="com.chainfin.loan.service.MgtUserTreeService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<!-- 分享链接短链接 -->
<dubbo:reference id="shortUrlService" interface="com.chainfin.loan.service.ShortUrlService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/>
<!-- 操作日志 -->
<!-- <dubbo:reference id="operateHistoryService" interface="com.chainfin.loan.service.OperateHistoryService"
group="${dubbo.protocol.group}" version="${dubbo.protocol.version}" timeout="${dubbo.protocol.timeout}" registry="userzk" check="false"/> -->
</beans>
4、注意:我接口中虽然提供了消息推送的接口。但是dubbo没有消息推送的功能。都是自己写的接口,然后根据业务来实现的。你可以接口消息中间件之类的实现。
5、黑白名单可以参考文档。比如:http://itindex.net/detail/56167-dubbo-%E6%8E%A5%E5%8F%A3-dubbo