Dubbo使用还是比较多的,但是很多同学不了解Dubbo的原理与机制,下面我就重点来详解Dubbo的原理与机制@mikechen
Dubbo简介
Dubbo是一个Java RPC框架,致力于分布式、高性能、透明化的远程服务调用方案。
Dubbo核心功能,主要提供了:远程方法调用、智能容错和负载均衡、提供服务自动注册、自动发现等高效服务治理功能。
Dubbo组件
Dubbo组件如下图所示,主要包含了5大Dubbo框架组件:
Dubbo主要包含了:注册中心、服务提供、服务消费、以及服务容器、与Dubbo监控中心这5大Dubbo框架组件。
1.注册中心(registry)
在微服务时代,我们所有的服务都被劲量拆分成最小的粒度,原先所有的服务都在混在1个server里,现在就被按照功能或者对象拆分成N个服务模块。
这样做的好处是深度解耦,1个模块只负责自己的事情就好,能够实现快速的迭代更新,但是坏处就是服务的管理和控制变得异常的复杂和繁琐,人工维护难度变大。
所以,这个时候急需一个组件来管控所有的服务,注册中心就出现了。
注册中心的作用:一句话概括就是存放和调度服务,实现服务和注册中心,服务和服务之间的相互通信,注册中心可以说是微服务架构中的”通讯录“。
注册中心它记录了服务和服务地址的映射关系,在分布式架构中服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址进行调用。
常见的注册中心有:Zookeeper,Eureka,Consul,Etcd等,Dubbo这里就采用了Zookeeper为注册中心。
2.服务提供者(provider)
当我们需要为某个功能对外提供服务时我们可以暴露服务给使用者调用,那么这个服务就是服务提供者。
举个例子:淘宝的商品服务(SIC),提供了相关的淘宝商品的信息查询服务,那这个淘宝的商品服务(SIC)就是服务提供者。
一句话总结服务提供在:暴露服务的服务提供方,称之为”服务提供者”。
3.服务消费者(consumer)
调用远程服务的服务消费方,称之为”服务消费者”。
举个例子:比如我是淘宝的店铺团队,有一个需求需要调用商品信息,这个时候我就通过调用淘宝商品服务(SIC)提供的商品查询接口,我就是服务消费者,而商品团队就是服务提供者。
4.容器(container)
服务容器负责启动,加载,运行服务提供者,dubbo服务运行,也就是让生产服务的进程一直启动。
服务容器是一个 standalone 的启动程序,因为后台服务不需要 Tomcat 或 JBoss 等 Web 容器的功能,如果硬要用 Web 容器去加载服务提供方,增加复杂性,也浪费资源。
服务容器只是一个简单的 Main 方法,并加载一个简单的 Spring 容器,用于暴露服务。
5.监控(Monitor)
dubbo的使用其实只需要有注册中心,消费者,提供者这三个就可以使用了。
但是并不能看到有哪些消费者和提供者,为了更好的调试,发现问题,需要监控,这就是监控中心的作用。
因此Dubbo引入了监控中心,通过 dubbo-admin 可以对消费者和提供者进行管理,也可以在 dubbo 应用部署做动态的调整和服务的管理。
Dubbo架构
Dubbo架构图,如下所示:
Dubbo整个架构包含:接口层、配置层、代理层、注册层、集群层、监控层、调用层、交换层、传输层、序列化层等10大层设计。
1. 服务接口层
服务接口层:根据服务提供方和服务消费方的业务设计对应的接口和实现。
2. 配置层
配置层:主要就是对外配置接口,可以通过Spring解析配置生成配置类。
3.服务代理层
服务代理层:主要就是生成服务的客户端代理。
4.服务注册层
服务注册层:主要就是封装服务地址的注册与发现。
5.集群层
集群层:就是Dubbo集群相关的封装,比如:多个提供者的路由、及服务负载均衡等。
6.监控层
监控层:主要就是RPC调用次数和调用时间监控。
7.远程调用层
远程调用层:主要就是封将RPC调用,比如:完成网络A服务器到B服务器的整个远程通信调用。
8. 信息交换层
信息交换层:主要就是封装请求响应模式,比如:同步转异步等。
9.网络传输层
网络传输层:主要就是解决网络传输的各种通信问题。
10.数据序列化层
数据序列化层:我们都知道数据在网络传输,不可能是对象进行传输,都是需要序列化后才能在网络两端传输,这就是会涉及到序列化。
Dubbo协议
协议即网络协议的简称,是两个网络实体进行通信的基础,协议是双方确定的交流语义。
Dubbo内置了:dubbo协议 ,rmi协议,hessian协议,http协议等10种通讯协议。
Dubbo官网是推荐我们使用Dubbo协议,如果没有特别的需求,也建议使用Dubbo默认协议。
Dubbo协议格式,如下图所示:
Dubbo 框架定义了私有的RPC协议,其中请求和响应协议的具体内容我们使用表格来展示。
Dubbo 数据包分为消息头和消息体,消息头用于存储一些元信息,比如魔数(Magic),数据包类型(Request/Response),消息体长度(Data Length)等。
Dubbo调用流程
Dubbo调用流程,大致分为如下11步:
1.首先服务提供者会启动服务,然后将服务注册到服务注册中心;
2.服务消费者会定时拉取服务提供者列表;
3.生成一个动态代理对象,然后通过这个代理对象去调用远程接口。
4.生成代理对象之后会走到Cluster层,这里会获取服务提供者列表的数据,感知到目前所能调用的服务提供者有哪些;
5.然后Cluster会根据指定的算法,做负载均衡,选出要调用的服务提供者;
6.选择好服务提供者之后,再选择指定的协议格式,就是上面谈到的Dubbo协议;
7.Exchange会根据指定的协议格式,进行请求数据封装,封装成request请求;
8.请求封装好之后,就会通过网络通信框架将请求发送出去;
9.服务提供者那边,同样会有网络通信框架,会监听指定的端口号,当接收到请求之后,会将请求进行反序列化;
10.反序列化之后,再根据Exchange根据指定协议格式,将请求解析出来;
11.最后,再通过动态代理对象,调用服务提供者的对应接口。
Dubbo原理机制总结
上面我就分别通过Dubbo的组件、以及Dubbo架构、以及Dubbo的调用流程做了一个全面的总结,希望对你掌握Dubbo原理机制有所有帮助。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》