前言
Dubbo,阿里巴巴旗下的开源产品,之前因为团队解散体停止了更新,不过最近我看maven仓库又开始发布新版本,估计开发团队又回来继续更新了
首先说下dubbo的简介:
dubbo是分布式服务治理框架,也是RPC远程服务调用框架
什么是服务治理呢,比如负责均衡,服务注册,容错机制等等
RPC远程调用框架有很多,比如SpringCloud,dubbo,dubbox,Hessian等等
首先来看下官方给出的dubbo工作流程图:
我来简单讲解下:(看不明白的先往下看,最后回来阅读便会恍然大悟)
1.服务提供者把自己的IP,名称等信息注册到注册中心
(默认使用zookeeper,所谓注册就是在zookeeper上创建一个持久化节点,存储自己的信息)
2.服务消费者订阅注册中心
(当消费者订阅了,一旦注册中心注册了新节点,消费者就会马上知道,这就是为什么用zookeeper的原因,因为zookeeper有循环监听事件的功能,这也是为什么可以用redis做注册中心,redis也有此功能)
3.消费者在注册中心拿到服务提供者的IP等信息,然后再与提供者服务器连接,调用接口实现类
4.监控中心会监控操作的相关信息,并记录
那么怎样才能最快的了解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服务
dubbo的服务治理
容错流程
先来看一张官方的图:
节点解释:
集群提供了很多容错方案(如: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启动:
可以看到我们刚才启动的两个应用
选择某服务的负载均衡策略:
与SpringCloud对比
相比于现在社区非常活跃的SpringCloud
dubbo没有网关和断路由等功能
但是它支持多种协议,而SpringCloud只支持http协议
并且SpringCloud逐渐成为主流
在中小型企业也普遍使用SpringCloud,因为dubbo太重,许多功能需要自己实现
虽然spring这么厉害,但我们还是要支持国产
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。