Dubbo使用教程
http://dubbo.apache.org/zh-cn/docs/dev/implementation.html
https://www.cnblogs.com/tiancai/p/9573912.html
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>
未完待续。。。