DUBBO
DUBBO简介
面对服务架构体系(SOA)
-
作用:服务提供,服务调用,连接处理,通信协议,序列化方式,服务发现,服务路由,日志输出等行为。注:本身并不是注册中心,可以通过插件集成注册中心,例如zk,nacos
-
常见框架:DUBBO和SpringCloud
-
DUBBO和SpringCloud的区别,
-
时代背景:dubbo是soa时代的产物,springcloud是微服务时代的产物,希望打造一个生态。
-
通信方式:
-
Dubbo底层使用netty这样的nio框架,基于tcp协议,使用了Hessian/java自带的序列化/JSON/Fastjson等序列化方式,完成通信。
注:Hessian本身就是rpc框架,基于二进制序列化实现,也可以当做序列化方式。
<dubbo:protocol name="dubbo" serialization="hessian2"/>
通过这种配置实现Hessian的序列化方式 -
springCloud则通过http协议进行处理,使用的是rest接口进行远程通信。
注:rest相对于tcp,仅仅通过契约关系实现通信,服务方和调用方不存在代码级别的强联系。但是http协议有更大的报文,而且需要进行三次握手,所以占用的带宽会比较多。
-
-
RPC框架
-
概念解释:远程过程调用框架,是一种通过网络,从远程计算机程序上请求服务,而且不需要了解底层网络技术的协议。RPC使得程序能够像访问本地资源一样,访问远程系统资源。一般使用netty作为网络通信框架。使用Protobuf作为序列化框架(谷歌开发,二进制序列化,语言无关,提供编译器),使用zk作为可靠的寻址方式,作为注册中心。
-
常见RPC框架:Hessian,Avro,Dubbo
-
RPC框架的架构:客户端,客户端存根,服务端存根,服务端
-
通信过程:客户端调用客户端存根,客户端存根序列化数据,同时将消息通过网络发送到服务端存根,服务端存根进行反序列化操作,同时调用服务器的本地服务,之后进行处理,将结果反向走一遍。
DUBBO包含的角色
-
服务提供者Provider
-
服务消费者Consumer
-
注册中心Registry:将provider的地址列表提供给consumer,若有变更则基于长连接进行数据变更
-
监控中心Monitor
-
运行容器Container:负责启动加载,运行provider
DUBBO支持的功能
-
基于接口的高性能RPC调用:软负载均衡,失败容错,地址路由,动态配置等
-
智能容错和负载均衡
-
服务自动注册与发现
-
运行期流量调度
-
可视化的服务治理与运维
Dubbo原理
Dubbo的执行流程
-
服务容器启动,加载,运行provider。provider在启动的时候,就向注册中心注册自己提供的服务。
-
consumer启动,向注册中心订阅需要的服务,订阅中心返回provider的地址列表,如果地址列表有变动,就基于长连接,将数据变更提供给消费者。
-
consumer基于负载均衡策略,选一台provider进行调用,调用失败则调用别的。
-
provider和consumer,在内存中累计调用次数和调用时间,定时发送统计数据到监控中心。
Dubbo选择服务器时的负载均衡策略
集群进行负载均衡的时候,dubbo提供了多种负载均衡策略:
-
random:随机挑选,调用次数越多,分布越均衡
-
roundRobin:轮询,平均分布,但存在请求积累的问题,比如说被轮询到的服务器处理速度很慢,所以可能造成某个服务不可用。
-
leastactive:最少活跃调用策略
-
constantHash:一致性哈希策略,使相同参数的请求总是发送到同一个提供者,宕机之后可以根据虚拟节点,分摊到别的提供者上。
负载均衡可以在提供者一方配置,也可以在消费者方进行配置
Dubbo的容错及重试机制
-
失败时自动切换。当出现失败的时候重试别的服务器,会带来更长时间的延迟。(默认)
-
快速失败,只发起一次调用,失败就立即报错,通常用于非幂等性的操作,比如说新增记录。
-
失败安全,出现异常就直接忽略。用于写入审计日志。
-
失败自动恢复,后台记录失败请求,定时重发。
-
并行调用多个服务器,只要有一个成功就算成功,通常用于实时性要求比较高的读操作。
-
广播调用所有的提供者,只要有一个出错,就报错,用于通知所有的提供者更新缓存等信息。
服务降级
-
作用:当服务器压力剧增的情况下,对一些服务有策略地进行降级,释放服务资源,保证核心服务正常运行。可以防止分布式服务发生雪崩,一直等待响应可能造成服务资源耗尽最终宕机。
-
方式:在dubbo:reference中设置mock=“return null”,也可以使用dubbo:service mock=“”
RPC通信步骤
-
建立通信:客户端和服务器之间通过tcp建立一个按需连接或者长连接,多个远程过程可以使用同一个tcp连接,这个连接使用心跳机制定期检测。
-
服务寻址:需要一个可靠的寻址方式,提供服务的发现,使用redis和zk来进行服务的注册。服务提供者启动的时候,将自己的服务注册到注册中心,以便消费者通过注册中心拿到具体的地址。当provider因为某些原因使服务停止的时候,需要向注册中心注销服务,zk是通过临时节点实现的。
-
网络传输:序列化,将数据变成二进制的,默认使用hessian,同时也支持Dubbo,fastjson,Java自带的序列化技术
-
服务调用:B进行本地调用,经过序列化传给A,A进行反序列化,进行处理。