一、基础知识
RPC 远程服务调用
dubbo 是一个高性能的Java RPC框架,阿里开源。
特性:
- 面向接口的高性能RPC调用。
- 智能负载均衡
- 注册中心,服务注册发现
- 高度可扩展能力
- 运行期流量调度,轻松实现灰度发布
- 可视化服务治理与运维
设计架构
image注册中心、服务提供者、服务消费者、监控中心。
容器启动,提供者注册到注册中心,消费者订阅注册中心,得到提供者列表,提供者的变动会及时通知到消费者,调用信息、服务信息等都会定时的发送到监控中心,监控统计整体运行状态。
二、实践
步骤:
- 搭建 zk 注册中心。
- 开发 provider,注册到中心。
- 开发 consumer,调用 provider。
三、高可用
zookeeper 注册中心本身是高可用集群模式,某台服务器出现问题后,会自动切换,整体宕掉的可能性极低,即使注册中心不可用了,服务提供者和消费者仍能通过本地缓存通讯,dubbo 还支持直连调用,完全可以不通过注册中心。
服务提供者是无状态的,某个宕掉后,还可以调用其他的,除非全部无法使用。
负载均衡
(1)Random LoadBalance
基于权重的随机负载均衡机制。
例如 userService 这个服务启动了3个节点,A的权重为 100,B的权重为 200,C的权重为50,那么就相当于 A 的访问概率为 2/7,B 的访问概率为 4/7,C 的访问概率为 1/7,每次访问时不一定是哪个,但整体的概率分布式这样的。
(2)RoundRobin LoadBalance
基于权重的轮询负载均衡机制。
例如 userService 这个服务启动了3个节点,A的权重为 100,B的权重为 200,C的权重为50,那么就相当于 A 的访问概率为 2/7,B 的访问概率为 4/7,C 的访问概率为 1/7。每次访问是顺序轮询的,并判断权重,例如:
- 第1次A
- 第2次B
- 第3次C
- 第4次轮到A了,因为A的概率为 2/7,所以可以选择A
- 第5次轮到B了,其概率为 4/7,所以可以选择B
- 第6次轮到C了,其概率为 1/7,7次访问之内已经选择过一次C了,那么这次就不能选了,轮到下一个,A,A的概率为 2/7,也已经满了,继续往下轮,轮到B,其概率为 4/7,已经选过2次,没有超出,所以可以选B。
- 第7次轮到C了,同样的逻辑,最后还是选B。
(3)LeastActive LoadBalance
最少活跃数负载均衡机制。
每个服务都有一个计数器,接收请求后,计数器+1,处理完成后,计数器-1。
选择计数器值最小的,如相同则随机。
例如 userService 这个服务启动了2个节点,初始时A、B的计数器都为0,这时随机选择A,A接收到请求后,计数器+1,在A处理完成之前又有新的请求,这次就选B,B计数器+1,如果B先于A处理完成,B的计数器-1变为0,之后新的请求还会选B。
(3)ConsistentHash LoadBalance
一致性hash负载均衡机制。
例如有4个节点 A B C D,通过规则计算得到每个节点的一个整数值(假设为 3、5、8、10),将其分布到一个时钟原型上。现在有一个请求,对其参数进行计算,得到一个整数值(假设为 6),沿着顺时针的方向找离其最近的那个节点,就是8,对应的是节点 C,就选择它。每个请求都根据这样的规则为其分配节点,所以,参数相同的请求,总是会分配到相同的节点上。
服务降级
当服务器压力剧增的时候,根据实际业务情况,对某些服务或者页面有策略的不处理或者简单处理,从而释放服务器资源,以保证核心业务正常运作,就是通过牺牲局部利益来保证全局利益。
例如一台服务器中运行着A B C 3个服务,在访问激增的时候,服务器压力巨大,3个服务都不能很好的响应,这时可以根据业务情况,选择暂时停掉某个服务,来保证其他服务正常运行。
dubbo提供了2种服务降级的方式:
- consumer 不发起实际的远程调用,直接返回 null。
- consumer 调用失败后,不再重试,返回 null。
在控制台即可对服务进行屏蔽,实现服务降级。
集群容错
服务调用失败时,dubbo提供了多种容错方案,缺省为 failover 重试。
- failover cluster
失败自动切换,当出现失败,重试其他服务。适合读操作。
- failfast
快速失败,只发起一次调用,失败后立即报错。通常用于非幂等性的写操作,比如新增记录。
- failsafe
失败安全,出现异常时,直接忽略。通常用于写日志等操作。
- failback
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
例如 A 调用 B 失败了,这个调用要求必须成功,那么就使用此容错方式,定时重发。
- forking
并行调用多个服务器,主要一个成功即返回。通常用于实时性要求较高的读操作,这种方式会浪费更多的服务资源。可以通过 forks=2 来设置最大并行数。
- broadcast
广播调用所有提供者,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等操作。
例如 A 调用 B,B 有4个节点,那么会请求每个节点,全部正常响应才算调用成功,只要有一个失败就报错。
实现方式是通过整合 hystrix。
四、原理
1. RPC原理
image调用流程:
-
服务消费⽅方(client)调⽤用以本地调⽤用⽅方式调⽤用服务;
-
client stub接收到调⽤用后负责将⽅方法、参数等组装成能够进⾏行行⽹网络传输的消息体;
-
client stub找到服务地址,并将消息发送到服务端;
-
server stub收到消息后进⾏行行解码;
-
server stub根据解码结果调⽤用本地的服务;
-
本地服务执⾏行行并将结果返回给server stub;
-
server stub将返回结果打包成消息并发送⾄至消费⽅方;
-
client stub接收到消息,并进⾏行行解码;
-
服务消费⽅方得到最终结果
RPC框架的⽬目标就是要2~8这些步骤都封装起来,这些细节对⽤用户来说是透明的,不不可⻅见的。
2. netty 通信原理
netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,极大的简化了网络编程。
netty 是基于 NIO 模型的,NIO 如下:
imagenetty 模型:
image
网友评论