Dubbo一文入门
一、简介
系统的架构,已从最早的单体式架构(一个war包完事)逐渐发展到目前的微服务式架构。微服务,将一个大型的复杂的应用系统,拆分成若干独立的松耦合的小的服务工程,每个服务工程可独立部署,每个服务只需要关注一类任务即可。微服务式架构目前比较代表性的技术有:Dubbo、SpringCloud等。
Dubbo 最初由阿里巴巴开发使用,后捐献给Apache基金会。Dubbo基于Spring容器运行,提供了面向接口的远程方法调用。官方网站:http://dubbo.apache.org/zh-cn/
Dubbo的框架结构如下:
1、Registry
注册中心,是用于发布和订阅服务的一个平台。官方推荐注册中心 ZooKeeper。注册中心ZooKeeper集群搭建详见:https://www.cnblogs.com/eric-fang/p/9283904.html
(1)发布:服务端开发完毕,将服务的相关信息公开出去。公开的信息包括:服务端所在机器地址、接口名、方法、方法参数、返回、超时时间等。
(2)订阅:客户端从注册中心去获取公开的服务信息
2、consumer
服务的消费者,也即客户端程序。
3、Provider
服务提供者,也即服务端程序
4、Container
服务端运行容器。Dubbo默认依赖Spring容器启动
5、Monitor
监控中心。Dubbo提供的一个jar工程。主要功能是监控统计服务端和客户端的相关使用数据的,比如:服务端多少接口、多少方法,调用次数等。客户端调用哪些服务接口、次数等
6、管理控制台admin
Dubbo提供一个war工程,用于实现Dubbo 服务端和客户端的管理,比如:集群负载、均衡策略。服务端可用性等。
二、Dubbo的服务发布与订阅
Dubbo的开发中,接口推荐的是单独建立个工程,这样便于服务实现的对外透明化,消费端直接依赖接口工程即可。
详细示例代码详见 github:https://github.com/qiuhan00/dubbo
其中,服务提供者注册后,zookeeper中显示如下:
消费者注册信息:
三、服务打包发布
通常,推荐的服务启动方式为Dubbo框架默认提供的 Main 类启动,其中考虑了Dubbo的高级特性以及异常处理,并且实现优雅关机。但是注意的是,Main类启动扫描的Spring配置文件的路径为:/META-INF/spring/*.xml。
1、使用assembly打包服务
将代码打成 jar 包,并提供相应的启动文件,比如 start.sh等。执行启动脚本,自动加载执行Main类中的main方法。
此种方式的打包,需要修改maven配置,新增打包插件,并且install功能也会修改。
2、assembly打包服务步骤(下述中相关配置文件,详见 github:https://github.com/qiuhan00/dubbo)
(i)新建assembly文件夹,在assembly文件夹中,提供assembly.xml配置文件
(ii)修改maven配置文件:提供指定打包配置
(iii)执行 maven clean install。将会在target目录中生成tar.gz的压缩文件,解压后,执行bin目录中相应的启动文件即可:windows中start.bat,linux中start.sh
四、Dubbo admin管理控制台服务
老版本的Dubbo发布包中,有个DubboAdmin管理控制台项目,可打包成war,放到tomcat中运行。最新的Dubbo,已经抽出该控制台项目,发布正式版0.1,前后端分离技术,前端采用Vue,后端采用SpringBoot,发布可以使用 jar 运行启动,也可以前后端单独部署运行。相比较而言,新版本的控制台对于开发人员特别是后端程序员不是太友好,工具这东西,还是简单快捷点比较好。
下面基于老版本的war包部署管理控制台应用,将war包复制到tomcat中webapps目录下,修改工程中的WEB-INF/dubbo.properties配置文件:
# 注册中心位置. 配置格式为: 协议://IP:port访问. 可以传递参数.
dubbo.registry.address=zookeeper://111.231.51.200:2181?backup=1111.231.51.200:2182,111.231.51.200:2183
# 设定监控中心访问用户.
# dubbo.admin.用户名.password=密码
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
注意,tomcat在每次启动的时候,都会去解压webapps目录中的war包文件,所以,第一次修改启动完成后,必须删除相应的war包。
tomcat启动完成后,使用 http://localhost:8080/dubboadmin/ 访问,输入上面配置的用户名密码即可,出现下面画面即为启动成功
可以很清晰的看出,目前应用数、提供者、消费者统计数信息。具体使用,在服务治理中有很多具体的子项目,可以自己尝试使用。
五、Dubbo Monitor监控中心
用于监控在dubbo开发的接口暴露,注册情况,也可以看接口的调用明细,调用时间等。监控中心挂掉并不会影响生成者和消费者。
六、集群与负载均衡
Dubbo本身支持服务的集群部署,无需其他特殊处理。只需要相同的服务接口注册多份,即实现集群。每个服务应用必须唯一性协议访问标识,即 ip + port的唯一性。
集群即是为了避免单点故障导致的系统不可用,那么集群必然的需要提供集群的容错性配置。Dubbo提供了多种容错性配置,默认是failover失败转移。
1、节点信息
Invoker : 是provider的一个可调用的service抽象,封装了provider的地址信息和接口信息
Directory:是Invoker的集合,根据注册中心推送的注册信息动态变更
Cluster:封装层,将集群的多个Invoker伪装成一个Invoker,对外层透明(外部看起来就是一个服务提供方,无需关注具体调用哪个环境的)。集群的容错逻辑机在此进行
Router:从多个Invoker按照路由规则选出子集
LoadBalance:负责从多个Invoker中选出一个用于本次的调用处理,此过程包含了负载均衡算法。
2、集群配置
2.1、集群配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,所以一般不推荐使用。
2.2、配置cluster标签属性:
cluster标签属性可选值:failover、failfast、failsafe、failback、forking。默认值为failover。
(i)failover :失败转移。当调用过程失败后,自动转移调用其他的服务。通常用于读操作。重试会影响调用的效率。重试可通过属性retries来进行配置。retries的默认值为2,即最多重试2次(不包含首次调用,即最多会发生3次调用)
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="" loadbalance="roundrobin"></dubbo:service>
或者可以再具体到方法:
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover">
<dubbo:method name="sayHello" retries="" loadbalance="roundrobin"></dubbo:method>
</dubbo:service>
(ii)failfast:快速失败。只调用一次,失败即报错。通常,用于非幂等性操作,比如用户新增。配置方法及修改 cluster="failfast"
(iii)failsafe:失败安全。调用过程,出现异常,直接忽略。
(iiii)failback:失败回复。调用过程失败的话,后台自动记录失败请求并定时重发。
forking:并行调用多个服务,只要一个返回即认为调用成功。可通过forks="2"来设置并行请求数
3、负载均衡配置
3.1、负载均衡配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,一般不推荐使用。
3.2、配置loadbalance标签属性:
loadbalance标签属性可选值:random、roundrobin、leastactive、consistenthash。默认值为random。
(i)random:随机,按权重设置随机几率。权重可以通过管理控制台即时调整或者通过标签weight属性来进行设置
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="" loadbalance="random"></dubbo:service>
或者可以再具体到方法:
<dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover">
<dubbo:method name="sayHello" retries="" loadbalance="random"></dubbo:method>
</dubbo:service>
(ii)RoundRobin:轮询,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求第二台时就卡在那,久而久之,所有请求都卡在调到第二台上
(iii)LeastActive:最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
(iiii)ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
七、高级特性
1、服务启动时检查(消费者配置)
Dubbo默认在启动的时候会检查依赖的服务是否可用,不可用时会抛出 java.lang.IllegalStateException :No provider available的异常,以便生产上线时候,能及早的发现问题。默认check="true"。
可通过check="false"关闭检查,开发测试的时候,如果依赖的部分服务不可用时,可关闭检查保证应用的正常启动。如果应用中Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,必须关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false"
,总是会返回引用,当服务恢复时,能自动连上。
推荐配置方式:
<dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false"/>
2、直连提供者
开发测试过程中,可能需要绕过注册中心,直接测试指定的服务提供者,这时候,可配置点对点直连调用,忽略注册中心中的服务提供者列表。
配置方式:
<dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false" url="dubbo://172.31.31.2:20881"/>
3、服务只订阅只注册
3.1、只订阅
通常一个应用可以即是服务的提供方也是服务的订阅者,当正在测试调试某服务接口的时候,如果注册到了注册中心中去,可能会导致服务消费的不正常。所以,此时,可以设置只订阅服务而不进行注册发布服务,配合直连测试正在开发的服务。
配置方式为:
<dubbo:registry address="111.231.51.200:2181,111.231.51.200:2182,111.231.51.200:2183" protocol="zookeeper" register="false"></dubbo:registry>
3.2、只注册
说太多不如一张图来的直接明了:
推荐配置方式为:
<dubbo:registry id="Registry1" address="111.231.51.200:2181" />
<dubbo:registry id="Registry2" address="111.231.51.200:2185" subscribe="false" />
八、配置文件高级属性定义
1、version版本
定义服务的版本。推荐使用三个位数来表示,如1.0.0、1.0.1等。通常在服务的不断升级过程中,用于多版本服务的兼容。消费者配置中的version必须与服务提供方保持一致,否则会报错 may be version or group mismatch。推荐配置如下:
<!-- 服务提供者 -->
<dubbo:service interface="IA" ref="a" version="1.0.0" /> <!-- 服务消费 -->
<dubbo:reference interface="IA" id="consumer" version="1.0.0" />
2、group服务分组
当一个服务接口有多个服务接口实现类的时候,可以使用服务接口分组来定义。比如接口 IA 有实现A1和A2
那么服务提供者配置如下:
<dubbo:service interface="IA" ref="com.xxx.xxx.A1" group="g1" />
<dubbo:service interface="IA" ref="com.xxx.xxx.A2" group="g2" />
服务消费者配置:
<dubbo:reference interface="IA" group="g1" id="consumer1" />
<dubbo:reference interface="IA" group="g2" id="consumer2" />
3、retries调用重试
dubbo,调用服务可以自动重试多次,默认的重试次数为 2(加上初始调用,也就是最多3次)。推荐配置见上面的集群配置failover中。一般,重试用于幂等的查询操作中,而在增删改中建议将重试次数retreis设置为0。
九、总结
简单的介绍了Dubbo的使用配置过程,Dubbo目前是越来越活,更详细的使用可以去进一步的研究官方网站,而由于有中文,所以,看起来就很节省一部分力气了。
Dubbo一文入门的更多相关文章
- 一文入门HTML5
1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...
- 一文入门Redis
一文入门Redis 目录 一文入门Redis 一.Redis简介 二.常用数据类型 1.String(字符串) 2.Hash(哈希) 3.List(列表) 4.Set(集合) 5.Zset(有序集合) ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- Maven+SpringMVC+Dubbo 简单的入门demo配置
转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...
- Dubbo实战快速入门 (转)
Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...
- Dubbo3 源码系列 Dubbo“纠葛”(入门篇)
日期 更新说明 2022年5月28日 spring xml部分解读 2022年6月3日 spring annotation部分解读 人生不相见, 动如参与商. 今夕复何夕, 共此灯烛光. 少壮能几时, ...
- 一文入门NodeJS
NodeJS¶ 1.环境配置¶ 之前讲ES6的时候有提过一部分Node的知识,简单回顾下:一文读懂ES6 1.1.NPM国内镜像¶ npm国内镜像:https://npm.taobao.org 配 ...
- 深度学习Dubbo系列(入门开篇)
此文档为系列学习文档 这系列文档详细讲解了dubbo的使用,基本涵盖dubbo的所有功能特性.在接下来的文章里会详细介绍. 如果你正依赖dubbo作为你业务工程的RPC通信框架,这里可以作为你的参考手 ...
- ZooKeeper分布式专题与Dubbo微服务入门
第1章 分布式系统概念与ZooKeeper简介对分布式系统以及ZooKeeper进行简介,使得大家对其有大致的了解1-1 zookeeper简介1-2 什么是分布式系统1-3 分布式系统的瓶颈以及zk ...
随机推荐
- Python---协程---重写多线程
一. # 用协程的方式,修改播放电影和音乐的练习题 # 用协程的方式完成播放 movie_list = ["斗破.mp4", "复仇者联盟.avi", &quo ...
- day3 ord,chr,random,string
day3复习 >>> for i in range(10): ... if i == 3: ... break ... print(i) ... 0 1 2 >>> ...
- Vue Vue项目目录结构梳理
Vue项目目录结构梳理 by:授客 QQ:1033553122 1. 结构梳理 . ├── build/ # webpack 配置文件: │ ...
- handy源码阅读(六):tcp类
首先是tcpconn和tcpserver类: struct TcpConn : public std::enable_shared_from_this<TcpConn>, private ...
- JavaScript变量和字面量
一.什么是变量? 首先了解一下什么是内存:内存就是保存程序在运行过程中,所需要用到的数据8bit(比特是表示信息的最小单位). 8bit=1byte 1024byte=1MB 1024MB=1GB 1 ...
- Java——常用类(基础类型数据包装类)
[包装类] 包装类(如Integer.Double等)这些类封装了一个相应的基础数据类型数值,并为其提供了一系列操作. 例如:java.lang.Integer类提供了以下构造方法: ...
- [转]SQLServer : EXEC和sp_executesql的区别
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql.通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- 简记特定容器list和forward_list算法
链表类型list和forward_list有独有的sort.merge.remove.reverse和unique,而通用版本的是不能用于这两个类型的,因为所要求的迭代器不同,通用版本需要迭代器支持更 ...
- 【BZOJ4337】树的同构(树同构,哈希)
题意: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1T ...
- 大数据学习第二章、HDFS相关概念
1.HDFS核心概念: 块 (1)为了分摊磁盘读写开销也就是大量数据间分摊磁盘寻址开销 (2)HDFS块比普通的文件块大很多,HDFS默认块大小为64MB,普通的只有几千kb 原因:1.支持面向大规模 ...