随着互联网的不断发展,网站的应用规模越来越大,常规的垂直架构已经无法应对,尤其是类似电商的项目,所以分布式架构和流动计算架构已经势在必行。

Dubbo就是资源调度和服务治理中心的管理工具。

 

1.webservice:效率不高基于soap协议,项目中不建议使用,但它的优点在于跨语言通信,适用于不同公司相互调用接口。

2.使用restful形式服务:http+json。很多项目中的应用,如果服务太多,系统之间调用关系混乱,需要治疗服务。

3.使用dubbo。使用rpc协议进行远程调用,之间使用socket通信,传输效率高,并且可以统计出系统之间的调用关系、调用次数。

说白了dubbo就是一个服务治理工具,是一个服务的中间件,由于dubbo是通过java编写的,dubbo最大的缺点就出现了,它只适用于java系统间的通信。

 

角色说明

Provider:暴露服务的服务提供方

Container:服务运行容器

Consumer:调用服务的消费方

Registry:注册服务与发现服务中心

Monitor:统计服务调用的监控中心(可有可无)

调用关系说明

0:服务运行容器启动,加载服务提供者

1:在启动时告诉注册中心服务方有什么服务

2:消费者调用服务时,先到注册中心订阅所需要服务

3:注册中心返回结果即该服务的地址

4:消费者通过地址调用服务(此时注册中心没用了)

5:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次到监控中心

 

如何使用Dubbo

Dubbo使用Spring配置方式,只需用Spring加载Dubbo的配置即可。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置包扫描器,扫描所有带@Service注解的类 -->
<context:component-scan base-package="xxxx.service"/>
<!-- 发布dubbo服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="xxxx" />
<!-- 注册中心的地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.224.50:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="xxxx.ItemService" ref="itemServiceImpl" timeout="300000"/>
<dubbo:service interface="xxxx.ItemCatService" ref="itemCatServiceImpl" timeout="300000"/>
</beans>

 

applicationContext-dubbo-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="dubbo-provider" owner="dubbo" />
    <!-- 延迟暴露:delay="-1"延迟到spring初始化完成后,再暴露服务 -->
    <dubbo:provider delay="-1" />

    <!--使用 zookeeper 注册中心暴露服务,会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true" -->
    <dubbo:registry protocol="zookeeper" check="true" address="127.0.0.1:2181" />
    
    <!-- 服务提供者协议配置,服务线程池大小(固定大小) ,默认为100,threadpool:线程池类型,可选:fixed/cached ,默认fixed  -->
    <dubbo:protocol  name="dubbo"  port="20880" threads="200" accesslog="true" /> 
    <dubbo:protocol name="hessian" port="20881" threads="200" accesslog="true" />
    <!-- 服务提供者暴露服务,当一个接口有多种实现时,可以用group区分 -->
    <dubbo:service interface="com.wang.api.service.LogService" ref="logService" timeout="3000" loadbalance="random" protocol="dubbo"/>
</beans>

 

 

首先引入Dubbo的dtd文件头,上述配置文件为服务提供者,通过zookeeper暴露服务,timeout=“300000”为debug调试时候使用。下面则是消费者引用dubbo服务。

<!-- 引用dubbo服务 -->
<dubbo:application name="xxxx"/>
<dubbo:registry protocol="zookeeper" address="192.168.224.50:2181" />
<dubbo:reference interface="xxxx.ItemService" id="itemService" />

 

applicationContext-dubbo-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="dubbo-consumer" owner="dubbo" />
    <!-- 延迟暴露:delay="-1"延迟到spring初始化完成后,再暴露服务 -->
    <dubbo:provider delay="-1" />

    <!--使用 zookeeper 注册中心暴露服务,会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check="true" -->
    <dubbo:registry protocol="zookeeper" check="true" address="172.0.0.1:2181" />
    
    <!-- 服务提供者协议配置,服务线程池大小(固定大小) ,默认为100,threadpool:线程池类型,可选:fixed/cached ,默认fixed  -->
    <dubbo:protocol  name="dubbo"  port="20880" threads="200" accesslog="true" /> 
    <dubbo:protocol name="hessian" port="20881" threads="200" accesslog="true" />
    <!-- 远程服务 -->
    <dubbo:reference protocol="dubbo" check="false" id="logService" interface="com.wang.api.service.LogService" />
</beans>

 

Dubbo使用相对简单

 

pom.xml:

 <dubbodemo.version>0.0.1-SNAPSHOT</dubbodemo.version>

<dependency>
            <groupId>com.wang.dubbo</groupId>
            <artifactId>spring-dubbo-api</artifactId>
            <version>${dubbodemo.version}</version>
        </dependency>

 

<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>