1.背景

在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。

1 单一应用架构

2 应用和数据库单独部署

3 应用和数据库集群部署

4 数据库压力变大,读写分离

5 使用缓存技术加快速度

6 数据库分库分表

7 应用分为不同的类型拆分

发展到这个阶段的时候,我们发现,应用与应用之间的关系已经十分的复杂了,就会出现以下几个问题(以下摘录于官网):

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

为了解决这由于架构的演变所产生的问题几个问题,于是,dubbo 产生了。当然,解决这个问题的技术不止 dubbo 。

二 Dubbo的结构图

                                 

如何将dubbo转为long类型 dubbo详细教程_ide

 

从上图中我们可以看到,Dubbo结构很像生产者-消费者模型,只是在上面这个模型基础上,加了注册中心和监控模块,分别用于管理服务提供方的url,以及监控管理整个流程。生产者(Provider)

整个发布,订阅流程:

  • 启动容器,加载,运行服务提供者
  • 服务提供者在启动时,在注册中心发布注册自己提供的服务
  • 服务消费者在启动时,在注册中心订阅自己所需的服务。

如果存在服务失败或者变更的情况,Dubbo就进行如下的操作:

  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

三Dubbo实例教程

3.1导入Maven依赖

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.ouyangsihai</groupId>
 8     <artifactId>dubbo-provider</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <dependencies>
12         <dependency>
13             <groupId>junit</groupId>
14             <artifactId>junit</artifactId>
15             <version>3.8.1</version>
16             <scope>test</scope>
17         </dependency>
18         <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
19         <dependency>
20             <groupId>com.alibaba</groupId>
21             <artifactId>dubbo</artifactId>
22             <version>2.6.6</version>
23         </dependency>
24         <dependency>
25             <groupId>org.apache.zookeeper</groupId>
26             <artifactId>zookeeper</artifactId>
27             <version>3.4.10</version>
28         </dependency>
29         <dependency>
30             <groupId>com.101tec</groupId>
31             <artifactId>zkclient</artifactId>
32             <version>0.5</version>
33         </dependency>
34         <dependency>
35             <groupId>io.netty</groupId>
36             <artifactId>netty-all</artifactId>
37             <version>4.1.32.Final</version>
38         </dependency>
39         <dependency>
40             <groupId>org.apache.curator</groupId>
41             <artifactId>curator-framework</artifactId>
42             <version>2.8.0</version>
43         </dependency>
44         <dependency>
45             <groupId>org.apache.curator</groupId>
46             <artifactId>curator-recipes</artifactId>
47             <version>2.8.0</version>
48         </dependency>
49 
50     </dependencies>
51 </project>

3.2定义Provider接口

首先,定义Provider的接口,并实现provider接口, Dubbo 的作用简单来说就是给消费端提供接口。Dubbo将Provider接口在服务中心注册,Consumer端就可以调用该注册的接口。

/**
 * 定义provider接口 
 */
public interface ProviderService {

    String SayHello(String word);
}

/**
 * 定义provider接口的实现类
 */
public class ProviderServiceImpl implements ProviderService{

    public String SayHello(String word) {
        return word;
    }
}

3.3暴露Provider接口的配置方式

包括:xml配置,api配置和注解配置。下面只介绍下xml配置的方式,这种方式比较常用。

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 4        xmlns="http://www.springframework.org/schema/beans"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 6     http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
 7 
 8     <dubbo:application name="项目名" organization="项目部门"
 9                        owner="san.zhang"/>
10     <dubbo:protocol port="${端口号}" threadpool="dynamic.dubbo.thread.pool">
11         <dubbo:parameter key="threadname" value="dubbo.thread"/>
12         <dubbo:parameter key="corethreads" value="150"/>
13         <dubbo:parameter key="threads" value="250"/>
14         <dubbo:parameter key="queues" value="1000"/>
15     </dubbo:protocol>
16 
17   //注册需要暴露的服务providerServiceImp,
18     <dubbo:service ref="providerServiceImp"
19                    registry="ttsi_flight_detail"
20                    interface="com.api.ProviderService"
21                    version="1.0.0"
22                    timeout="30000">
27         <dubbo:parameter key="qloglevel" value="${dubboLog.level:10}"/>
28     </dubbo:service>
29  <!--Bean bean定义-->
30     <bean id="providerServiceImp" class="com.dubbo.ProviderServiceImp"/>
31 //dubbo.zk.address一般指定zk地址,dubbo.group指定项目的组,id作为标识
32     <dubbo:registry address="${dubbo.zk.address}" group="${dubbo.group}" protocol="zookeeper"
33                     id="oag"/>
34 
35 </beans>

3.4Consumer端

3.4.1 Maven配置跟Provider端配置一样

3.4.2 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="consumer" owner="jie"/>

    <!--dubbo这个服务所要暴露的服务地址所对应的注册中心-->
    <!--点对点的方式-->
    <!--<dubbo:registry address="N/A" />-->
    <dubbo:registry address="{zk.address}" port="{port}" check="false"/>

    <!--生成一个远程服务的调用代理-->
    <dubbo:reference id="providerService"
                     interface="Service.ProviderService"/>

</beans>

 未完待续。。。