Dubbo,阿里巴巴旗下的开源产品,以前由于团队解散体中止了更新,不过最近我看maven仓库又开始发布新版本,估计开发团队又回来继续更新了java
首先说下dubbo的简介:
dubbo是分布式服务治理框架,也是RPC远程服务调用框架
什么是服务治理呢,好比负责均衡,服务注册,容错机制等等
RPC远程调用框架有不少,好比SpringCloud,dubbo,dubbox,Hessian等等git
首先来看下官方给出的dubbo工做流程图:github
我来简单讲解下:(看不明白的先往下看,最后回来阅读便会恍然大悟)redis
1.服务提供者把本身的IP,名称等信息注册到注册中心
(默认使用zookeeper,所谓注册就是在zookeeper上建立一个持久化节点,存储本身的信息)spring
2.服务消费者订阅注册中心
(当消费者订阅了,一旦注册中心注册了新节点,消费者就会立刻知道,这就是为何用zookeeper的缘由,由于zookeeper有循环监听事件的功能,这也是为何能够用redis作注册中心,redis也有此功能)segmentfault
3.消费者在注册中心拿到服务提供者的IP等信息,而后再与提供者服务器链接,调用接口实现类api
4.监控中心会监控操做的相关信息,并记录tomcat
那么怎样才能最快的了解dubbo框架?我以为code才是最重要的
这里用一个小项目来进行演示
最基本的demo有三个基本模块:
1.服务提供者(provider)
2.服务消费者(consumer)
3.前二者的公用接口(api)
看下目录结构:安全
首先安装zookeeper,能够参考个人另外一篇博客:分布式协调服务:zookeeper
开启zookeeper服务,打开2181端口服务器
单独构建一个模块,叫作api,只须要在此模块中写入共享接口:
package com.dubbo.api; public interface UserService { public String test(Integer userId); }
必须引入的maven库和依赖api模块
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.8</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>com.dubbo</groupId> <artifactId>api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
服务提供者模块的配置文件:
dubbo-provider.xml
服务提供者应用信息,用于计算依赖关系 <dubbo:application name="provider" /> 向注册中心暴露服务 <dubbo:registry address="zookeeper://127.0.0.1:2181" /> 使用指定协议以及指定端口暴露服务 <dubbo:protocol name="dubbo" port="20880" /> 声明须要暴露的服务接口 <dubbo:service interface="com.dubbo.api.UserService" ref="UserService"/> <bean id="UserService" class="com.dubbo.service.Impl.UserServiceImpl"/>
test类进行启动:
providerTest.java
public class providerTest { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml"); applicationContext.start(); System.out.println("服务已启动"); System.in.read(); //让程序阻塞 } }
请注意:provider中的实体类须要实现序列化,不然dubbo协议没法传输
服务消费者模块的配置文件:
dubbo-consume.xm
<dubbo:application name="consumer"/> 协议配置由服务提供方指定,消费方被动接受 <dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181"/> 生成远程服务代理,引用api的接口 <dubbo:reference id="UserService" interface="com.dubbo.api.UserService"/>
消费者测试启动类:
consumerTest.java
public class consumerTest { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml"); applicationContext.start(); UserService userService = (UserService) applicationContext.getBean("UserService"); String name = userService.test(1); System.out.println("========="+name+"========="); System.in.read(); } }
请注意:服务消费者要设置超时设置,不然可能没法调用到数据量较大的接口
<dubbo:consumer timeout="5000"/>
打开zookeeper:zkServer.sh start
监控zookeeper日志:tail -f zookeeper.out
运行providerTest.java
zookeeper日志:
说明此服务提供者已在zookeeper注册
启动服务消费者:
说明经过dubbo框架的dubbo协议,成功远程调用了consumer服务
先来看一张官方的图:
节点解释:
集群提供了不少容错方案(如:Failover,Failfast,Failsafe....)
缺省是Failover方案,也就是出现失败时,调用其余服务器的服务,获取重试次数,参数retries,默认重试两次
invoker(调用器):他是Provider的service的抽象,封装了provider的地址和service的接口
Directory(目录):至关于一个list,元素为invuker实例,不一样于list的是,它的元素是动态的
Router:进行路由的选择
LoadBalance:负载均衡
容错方案:
1.Failover Cluster
当出现失败时,调用其余服务器服务
设置调用次数:
<dubbo:service retries="2"/> 或者 <dubbo:reference retries="2"/>
2.Failfast Cluster
只容许发起一次调用,失败当即报错
3.Failsafe Cluster
异常安全处理,当出现异常时,直接忽略
4.Failback Cluster
失败当即回滚
5.Forking Cluster
并行调用多个服务器服务,只要一个成功返回便可
经过 forks=“2”
设置并行数
6.Broadcast Cluster
广播调用全部provider,遂个调用,任意一个失败就报错
容错方案的模式选择:
<dubbo:service cluster="failsafe"/> 或者 <dubbo:reference cluster="failsafe"/>
具体操做流程:
1.首先调用MockClusterInvoker.invoke方法,判断是调用Mock功能仍是具体的集群策略类
2.调用Directory.list获取Invoker列表;
3.调用Router.route进行路由选择;
4.LoadBalance进行负载均衡选择;
5.最后获取Invoker对象;
当全部的服务提供者都宕机,dubbo会启动keepalived,不断重启service服务
官方给出了四种负载均衡策略
咱们能够在dubbo-admin模块使用图形界面来进行策略选择
在github上clone下dubbo源码:dubbo
mvn命令(mvn package)打包dubbo-admin的war包
使用tomcat启动:
能够看到咱们刚才启动的两个应用
选择某服务的负载均衡策略:
相比于如今社区很是活跃的SpringClouddubbo没有网关和断路由等功能可是它支持多种协议,而SpringCloud只支持http协议而且SpringCloud逐渐成为主流在中小型企业也广泛使用SpringCloud,由于dubbo过重,许多功能须要本身实现虽然spring这么厉害,但咱们仍是要支持国产