一、应用演变
二、远程过程调用
RPC与SOA区别:
SOA相对于RPC的优势在于有一个调度中心,可以根据请求的压力合理分配服务器资源,提高利用率。
RPC过程:
- Client 与 Service 建立 Socket 连接。
- Client 调用 Server的方法
- ClientStub 序列化请求信息
- ClientStub 发送请求
- ServerStub 反序列化请求信息
- Server 调用方法
- ServerStub 序列化响应信息
- ServerStub 发送响应
- ClientStub 反序列化响应信息
- Client 获得响应信息
所以影响RPC效率的因素是通讯效率和处理序列化的速度。
三、dubbo能做什么
1. 面向接口的远程方法调用(RPC)
2. 容错和负载均衡
(1)4种负载均衡:
-
Random LoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。 -
RoundRobin LoadBalance
轮循,可以设置权重。
存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。 -
LeastActive LoadBalance
最少活跃调用数,相同活跃数根据权重随机。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 -
ConsistentHash LoadBalance
一致性Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
官网API: http://dubbo.apache.org/zh-cn/docs/source_code_guide/loadbalance.html
(2)集群容错模式:
Failover Cluster
- 失败自动切换,当出现失败,重试其它服务器。(缺省)
- 通常用于读操作,但重试会带来更长延迟。
- 可通过retries="2"来设置重试次数(不含第一次)。
Failfast Cluster
- 快速失败,只发起一次调用,失败立即报错,抛出异常。
- 代码:catch之后throw
- 通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
- 失败安全,出现异常时,直接忽略,返回一个空结果。
- 代码:catch之后log记录,然后return new RpcResult();
- 通常用于写入审计日志等操作。
Failback Cluster
- 失败自动恢复,后台记录失败请求,定时重发。
- 通常用于消息通知操作。
Forking Cluster
- 并行调用多个服务器,只要一个成功即返回。
- 通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
- 可通过forks="2"来设置最大并行数。
Broadcast Cluster
- 广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)
- 通常用于通知所有提供者更新缓存或日志等本地资源信息。
3. 服务自动注册和发现 & 提供者与消费者
下图为dubbo架构:
4. 服务降级
服务器上有多个服务可用,但服务器压力很大,于是牺牲一个最无关紧要的服务,把资源让给其他重要的服务。
2种方法:
- 不调用服务,直接返回 NULL
- 调用服务失败,如超时,返回NULL,用来容忍不重要的服务可用性差。
四、dubbo与SpringCloud区别
结论:
- dubbo使用RPC通信,SpringCloud使用REST API通信。RPC性能高,REST更灵活。
- dubbo是一个RPC方案,SpringCloud是一个一体式方案。即dubbo + zookeeper + … = Spring全家桶
- dubbo更灵活、自由度高也更难控制;Spring帮你准备好了一整套方案,稳定性高。即dubbo是一台组装机,Spring是一台品牌机。
五、dubbo配置方法及优先级
去年官方文档:
今年官方文档:
reference method > service method > reference > service > consumer > provider
Q:为什么要注册中心,不直接用Nginx?
A:当举办活动预计并发量上升,需要横向扩展provider集群时,需要将ip加到nginx的配置中,当活动结束并发量下来后,又要从nginx的配置中去除对应机器的ip,运维成本高,且容易出错。使用注册中心可以实现自动注册(只要管好provider就行了)。