Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则
dubbo服务集群
Dubbo服务集群部署
这里的集群部署说的是provider
以简易版支付系统中的部分服务为例:
用户服务:pay-service-user
交易服务:pay-service-trade


从上图已经看到hudson和dubbo的客户端已经将dubbo的服务布在了两个服务器上。
以pay-service-trade为例,搭建集群。(注意这个项目producer和consumer是在一个项目中,可能引起歧义)
新建任务==>pay-service-trade_71===>复制现有任务,要复制的任务名称是之前的pay-service-trade==>ok==>svn需要重新授权,ok==>ssh server >修改name,将原来的192.168.3.72_deu-provider-02改为192.168.3.71_deu-provider-01,其他的不变>save
记得把脚本拷贝到71机器
保存之后构建项目
在71机器上运行脚本,查看dubbo管理界面,发现这个服务部署在了两个机器上。
执行自己的查询业务,发现,没有问题,这个时候通过脚本关闭掉72(原来部署的机器)上的服务,只剩下71上的服务(刚刚配置的),发现还是能够执行自己的业务的。
同样将72启动,将71关掉,再次执行自己的业务,没有问题。
将71 72两个服务都关掉,就无法执行自己的业务了。tomcat报错没有rpc服务。
从而实现了服务节点的高可用
只需要把相同代码的程序,在不同ip的机器上部署,单独运行,就能实现集群部署,如果在同一个机器上部署,app的名字的端口需要修改
Dubbo服务集群容错配置–集群容错模式
标签:dubbo:service、dubbo:reference、 dubbo:consumer、dubbo:provider
dubbo:serviceserver端
dubbo:reference引用端
在项目中的dubbo的配置文件中对上面的标签进行设置
可以在以上标签上修改,但是后面dubbo:consumer、dubbo:provider力度比较粗,不建议在这两个标签使用。
属性:cluster
类型:string
是否必填:可选
缺省值:failover
作用:性能调优 集群方式:可选:failover/failfast/failsafe/failback/forking
兼容性:2.0.5以上版本
1、Failover Cluster 失败自动切换,当出现失败,重试其它服务器。`(缺省) 通常用于读操作,但重试会带来更长延迟。 可通过retries="2"来设置重试次数(不含第一次)。默认是retries=“2”
默认的
就想上面的71 72的例子就是如此
<dubbo:service retries="2" cluster="failover"/> 或:
<dubbo:reference retries="2" /> 或:
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
retries=“0”,就是不充实,只调一次
name="findFoo"在引用端能够指定方法。
cluster="failover"在这里配置不配置都可以,因为是默认值
2、Failfast Cluster
快速失败,只发起一次调用,失败立即报错。
通常用于非幂等性的写操作,比如新增记录。
假如写操作用(比如添加用户信息)1里面的Failover策略,第一次写进去了,然后在返回的过程中,超时了,这个时候消费端检测到服务超时了,又重试,第二次又写进去了,就会造成重复写的问题。
相当于第一种策略中的retries=“0”,只调用一次
以上情况就需要Failfast这种方式。
<dubbo:service cluster="failfast" /> 或:
<dubbo:reference cluster="failfast" />
第一种和第二种是dubbo中最常用的
3、Failsafe Cluster
失败安全,出现异常时,直接忽略。
通常用于写入审计日志等操作。
<dubbo:service cluster="failsafe" /> 或:
<dubbo:reference cluster="failsafe" />
dubbo服务中心就用的这种方式,日志可记可不记,如果因为某种特殊情况没有记录到也无所谓,业务继续运行,对我的业务没有影响。
4、Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。
通常用于消息通知操作。
<dubbo:service cluster="failback" /> 或:
<dubbo:reference cluster="failback" />
dubbo的注册中心,注册发现,如果失败了就不断的去触发,不断的去发现,直到成功为止,在业务中不会用到。
5、Forking Cluster
并行调用多个服务器,只要一个成功即返回。 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。 可通过forks="2"来设置最大并行数。
<dubbo:service cluster=“forking" /> 或:
<dubbo:reference cluster=“forking" />
就像上面的例子如果用这种策略,同时向71 和 72发起交易查询业务, 谁先返回结果给我,就用谁的结果,容易出现资源浪费。
策略成熟度(官方)

一般用Failover即可,即默认的模式,因为 retries=0和Failfast的效果是一样的。
建议查询方法的 什么也不需要配置,如果是写入的方法配置retries=0
Dubbo分布式服务子系统的划分
服务化的目标:
将系统中独立的业务模块抽取出来,按业务的独立性进行垂直划分,抽象出基础服务层。

服务化的目标:
基础服务为上游业务的功能实现提供支撑,基础服务应用本身无状态,可随着系统的负荷灵活伸缩来提供服务能力。

服务子系统的数量把控
过多:可能划分过细,破坏业务子系统的独立性
(如:支付订单、退款订单,用户、账户)
部署维护工作量大,独立进程占用内存多
过少:没能很好的解耦
开发维护不好分工
升级维护影响面大(举个栗子,如果将很多业务融合入在一个服务中的话,一个报错,需要停掉,这个时候其他的服务也无法正常运行。)
(以简易版支付系统服务的划分为例)
服务子系统划分注意事项:
不要出现A服务中的SQL需要链接查询到B服务中的表等情况, 这样在A服务与B服务进行垂直拆库时就会出错,数据库中的查询跨服务了。(很可能在编写程序的时候没有报错,但是将来将不同的服务部署到机器上的时候,就会出现错误了,所以在设计的时候就应该尽量避免)
服务子系统间避免出现环状的依赖调用(比如a调b,b调c,c调d,可能是因为某个表可以划分到另外一个服务中去,即这个服务需要调优。)
服务子系统间的依赖关系链不要过长(比如a调b,b调c,c调d。。。建议不要超过三个
,允许存在服务调服务,但是不能太长。比如一个支付功能通过多个服务完成,将支付这个操作完成的太细。)
尽量避免分布式事务(尽可能确保系统中的业务是紧密关联的,而且可以放在一起,避免将服务拆分的过细,还是上面支付的例子)
Dubbo分布式服务子系统的划分
服务子系统的划分是一个不断优化的过程
Dubbo服务接口的设计原则
1、设计方式
《第02节–使用Dubbo对传统工程进行服务化改造》
action(服务的消费端)、facade(服务的接口)、biz(业务逻辑层)、dao(dao层)
好的Dubbo服务接口设计,并非只是纯粹的接口服务化
2、接口类型
简单数据查询接口:action、facade、dao
带业务逻辑的数据查询接口:action、facade、biz、dao
简单的数据写入接口:action、facade、dao
带业务逻辑的数据写入接口:action、facade、biz、dao
同步接口
异步接口
3、设计原则
- 接口粒度:
服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是 某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未 提供分布式事务支持。同时可以减少系统间的网络交互。
服务接口建议以业务场景为单位划分,并对相近业务做抽象, 防止接口数量爆炸。
不建议使用过于抽象的通用接口,如:Map query(Map), 这样的接口没有明确语义,会给后期维护带来不便。
- 接口版本:
每个接口都应定义版本号,为后续不兼容升级提供可能,
如:
<dubbo:service interface=“com.XxService” version=“1.0” />
- 接口兼容性:
服务接口增加方法,或服务模型增加字段,可向后兼容; 删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容, 需通过变更版本号升级。
- 异常处理:
建议使用异常汇报错误,而不是返回错误码,异常信息能携带 更多信息,以及语义更友好。
如果担心性能问题,在必要时,可以通过override掉异常类的 fillInStackTrace()方法为空方法,使其不拷贝栈信息。
查询方法不建议抛出checked异常,否则调用方在查询时将过 多的try…catch,并且不能进行有效处理。
服务提供方不应将DAO或SQL等异常抛给消费方,应在服务实 现中对消费方不关心的异常进行包装,否则可能出现消费方无 法反序列化相应异常。
必要的接口输入参数校验,避免做无用功。
在Provider上尽量多配置Consumer端属性:
原因如下: 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间, 合理的重试次数,等等 在Provider配置后,Consumer不配置则会使用Provider的配置值, 即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用 Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的。
Provider上尽量多配置Consumer端的属性,让Provider实现者一开始就思 考Provider服务特点、服务质量的问题。
样例:

服务接口设计与服务子系统划分过程相互优化。
Dubbo入门到精通学习笔记(十):dubbo服务集群 、Dubbo分布式服务子系统的划分、Dubbo服务接口的设计原则的更多相关文章
- Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived
文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...
- Dubbo入门到精通学习笔记(十三):ZooKeeper集群的安装、配置、高可用测试、升级、迁移
文章目录 ZooKeeper集群的安装.配置.高可用测试 ZooKeeper 与 Dubbo 服务集群架构图 1. 修改操作系统的/etc/hosts 文件,添加 IP 与主机名映射: 2. 下载或上 ...
- Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试
文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...
- Dubbo入门到精通学习笔记(十八):使用Redis3.0集群实现Tomcat集群的Session共享
文章目录 1.单节点访问http://192.168.1.61:8082/pay-web-boss/: 2.增加多一个消费者节点:192.168.1.62,以同样的方式部署pay-web-boss工程 ...
- Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册
文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...
- Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡
文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...
- Dubbo入门到精通学习笔记(十七):FastDFS集群的安装、FastDFS集群的配置
文章目录 FastDFS集群的安装 FastDFS 介绍(参考:http://www.oschina.net/p/fastdfs) FastDFS 上传文件交互过程: FastDFS 下载文件交互过程 ...
- Dubbo入门到精通学习笔记(八):ActiveMQ的安装与使用(单节点)、Redis的安装与使用(单节点)、FastDFS分布式文件系统的安装与使用(单节点)
文章目录 ActiveMQ的安装与使用(单节点) 安装(单节点) 使用 目录结构 edu-common-parent edu-demo-mqproducer edu-demo-mqconsumer 测 ...
随机推荐
- 100万DAU的app技术架构(简单理解)
如图所示:
- mybatis中Parameter index out of range (2 > number of parameters, which is 1).
${name} 是不带单引号的,而#{name} 是带单引号的
- swoole安装异步reids
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config --enable-async ...
- 开发效率优化之Git分布式版本控制系统(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...
- Android毕业四年升P8,年收入超100w,他是如何做到的?
很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也.相信大家感触最深的还是:选择大于努力.选择正确的方向,才能够走的更远,更踏实. 今天我来分享一下自己心得体会,并没 ...
- [轉]Linux kernel <2.6.29 exit_notify() local root exploit分析(2009-1337)
author : deep_pro目前网上的这个exploit(http://www.milw0rm.com/exploits/8369)的分析是有些问题的(http://forum.evilocta ...
- shell script 学习
终于来到了shell脚本的学习,貌似很牛叉. shell script鸟叔解释:利用shell的功能写的一个program,使用纯文本文件,将一些shell语法和指令写在里面,搭配正则表示法,管线命令 ...
- ZOJ-3662 Math Magic 背包DP
这题不错,可惜我还是太弱了,没想到qwq. 看了网上大佬题解之后写的,对比了一下代码,好像我写的还是挺简洁的(逃,只是吞行比较多). 因为直接用lcm的值做下标会超时,所以我们观察发现可以组成lcm为 ...
- Codeforces 1163F 最短路 + 线段树 (删边最短路)
题意:给你一张无向图,有若干次操作,每次操作会修改一条边的边权,每次修改后输出1到n的最短路.修改相互独立. 思路:我们先以起点和终点为根,找出最短路径树,现在有两种情况: 1:修改的边不是1到n的最 ...
- 【CSS】text-align:justify 的使用
工作需要写一个全是文本的网页,规范格式的时候发现很多css属性不是很熟悉,比如text-align:justify. 这个是两端对齐,css3中新增了text-justify属性 语法:text-ju ...