1.背景
在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。
1 单一应用架构
2 应用和数据库单独部署
3 应用和数据库集群部署
4 数据库压力变大,读写分离
5 使用缓存技术加快速度
6 数据库分库分表
7 应用分为不同的类型拆分
发展到这个阶段的时候,我们发现,应用与应用之间的关系已经十分的复杂了,就会出现以下几个问题(以下摘录于官网):
① 当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。
② 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
③ 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
为了解决这由于架构的演变所产生的问题几个问题,于是,dubbo 产生了。当然,解决这个问题的技术不止 dubbo 。
二 Dubbo的结构图
从上图中我们可以看到,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>
未完待续。。。