开发者学堂课程【基于 Zookeeper、Dubbo 构建互联网分布式基础架构:基于 Zookeeper、Dubbo 构建互联网分布式基础架构(4) 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/635/detail/10165
基于 Zookeeper、Dubbo 构建互联网分布式基础架构(4)
目录:
一.XML 配置
二.启动时检查
三.集群容错
四.集群容错模式
五.负载均衡策略
六.配置
七.zookeeper 注册中心
八.解决问题
一. XML 配置
<?xml version-"1.0"encoding-"UTF-8"?>
<beans xmIns-"http://www.springframework.org/schema/beans"
xmlns:xsi-"http://www.org/2001/XMLSchema instance"
xmlns:dubbo-"http://code.alibabatech.com/schema/dubbo"
xsl:schemaLocation-"http://www.springfranework.org/schema/beans
http://www.springfranework.org/<dubbo:application
name-"hello-world-app"
<dubbo:registry address-"nulticast://224.5.6.7:1234":
<dubbo:protocol name-"dubbo"port-"20880>
<dubbo:service interface-"com.alibaba,dubbo,demo.DemoService"ref- "demo Service Local">
<dubbo:reference id-"demoServiceRemote"interface-"com.alibaba.dubbo.demo.Demo Service"
</beans>
2.启动时检查(默认值是 check)
通过spring配置文件
关闭某个服务的启动时检查(没有提供者时报错):dubbo:reference interfacew"com.foo.Barservice"eck-Ifalse"/)
关闭所有服务的启动时检查(没有提供者时报错):dubbo:consumer check-"false"/
关闭注册中心启动时检查(注册订阅失败时报错):dubbo:registry check-"false"/)
3.集群容错
Failfast Cluster
快速失败,只发起-次调用,失败立即报错。通常用于非幕等性的写操作,比如新增记录。
Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks=*2来设置最大并行数。
Broadcast Cluster
广播调用所有提供者,逐个调用,任意-台报错则报错,通常用于通知所有提供者更新缓存或日声等本地资源信息。
4.集群容错模式
可以自行扩展集群容错策略,参见:集群扩展Failover Cluster
失败自动切换,当出现失败,重试其它服务器.通常用于读操作,但重试会带来更长延迟。可通过retriese"2"来设置重试次数(不含第一次)。
重试次数配置如下:<dubbo:service retriese"2"/>
或
<dubbo:reference retries-"2">
5.负载均衡策略Random LoadBalance
●随机,按权重设置随机概率。
●在一个截面上碰撞的概丰高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
●轮循,按公约后的权重设置轮循比率。
●存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。LeastActive LoadBalance
●最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
●使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
6.配置
服务端服务级别<dubbo:service interface="..."loadbalance-"roundrobin"/>
客户端服务级别<dubbo:reference interfacee"..."londbalance"roundrobin"/>
服务端方法级别.xdubbo:service interface-..."》
<dubbo:method nane-...loadbalance" roundrobin"/>
</dubbo:service>
客户端方法级别.</dubbo:reference interface-...>
dubbo:method name-"..."loadbalance-”roundrobin"/>
</dubbo:reference>
7.zookeeper 注册中心
在 provider 和 consumer 中增加 zookeeper 客户端 jar 包依赖<dependency>
<groupId>org.apache zookeeper</groupId>
<artifactId>zookeeper</artifactld>
<version>3.3.3k/version>
</dependencyh
(1)Zookeeper 单机配置<dubbo:registry address-"zookeeper://10.20.153.10:2181" 1>
<dubbo:registry protocol-"zookeeper"address-"10.20.153.10:21811>
(2)Zookeeper 集群配置<dubbo:registry address-" zookeeper://10.20. 153.10:21817backup-10.20.153.11:2181,10.20.153.12:2181"
或o:registry protocol-" zookeeper" address-"10.20.153. 10:2181 ,10.20.153.11:2181,10.20.153.12:21811>
(3)同一 Zookeeper,分成多组注册中心:<dubbo:registry id-"chinaRegistry" protocol- zookeeper" address-"10.20.153.10:2181" groug-"china"
<dubbo:registry id-"intlRegistry" protocol-" zookeeper" address-"1e. 20.153.10:2181" group-"intl*/
8.解决问题
(1)远程调用需要协议
在 testweb 与 service 之间要想通讯必须需要网络,所以要手动写网络请求稍有麻烦,相互通讯时需要写框架,这时就可以用已经写好的框架,遵循里面的协议。
(2)web 和 service 不在一个局域网
将一个服务发布到阿里云,正常情况下应该是可以演示的,特殊情况下,正常的工作电脑是在局域网里面,而正常服务器都是独立的公网IP,路由器访问的是路由器,有时候到不了电脑,所以说最终可能会连不上上传的服务,如果想做的话,必须在路由器内做dubbo映射。
(3)netty 在 dubbo 里的作用
Netty主要是用于发起网络协议,通过 double 在内部分装协议,发起网络请求。
大约原理为首先访问 dubbo,dubbo 打开网络连接去访问 zookeeper,发送zookeeper 协议所需要的数据,zookeeper 返回数据之后 dubboo 进行解析,网络通信需要流,而netty就是起一个流的作用。