本文大部分摘自极客时间胡忠想老师的《从0开始学微服务》课程,对原文做了简单概括和修改
下面是dubbo框架的架构图
![](https://i-blog.csdnimg.cn/blog_migrate/533976b49e945866564737abf41b0afd.jpeg)
首先解释微服务架构中各个组件分别对应到上面这张图中是如何实现。
服务发布与引用:对应实现是图里的 Proxy 服务代理层,Proxy 根据客户端和服务端的xml配置文件中的
接口描述,生成接口对应的客户端和服务端的 Stub(存根),使得客户端调用服务端就像本地调
用一样。
服务注册与发现:对应实现是图里的 Registry 注册中心层,Registry 根据客户端和服务
端的接口描述,解析成服务的 URL 格式,然后调用注册中心的 API,export() 或者 refer(), 完成服务的注册和
发现。
服务调用:对应实现是 Protocol 远程调用层,Protocol 把客户端的本地请求转换成RPC 请求。然后通过 Transporter 层来实现通信,Codec 层来实现协议封装,Serialization 层来实现数据序列化和反序列化。
服务监控:对应实现层是 Filter 调用链层,通过在 Filter 调用链层中加入MonitorFilter,实现对每一次调用的拦截,在调用前后进行埋点数据采集,上传给监控系统。
服务治理:对应实现层是 Cluster 层,负责服务节点管理、负载均衡、服务路由以及服务
容错。
再来看下微服务架构各个组件是如何串联起来组成一个完整的微服务框架的,以 Dubbo 框架下一次服务调用的过程为例,先来看下
客户端发起调用的过程。
- 首先根据接口定义,通过 Proxy 层封装好的透明化接口代理,发起调用。
- 然后在通过 Registry 层封装好的服务发现功能,获取所有可用的服务提供者节点列表。
- 再根据 Cluster 层的负载均衡算法从可用的服务节点列表中选取一个节点发起服务调用,如果调用失败,根据 Cluster 层提供的服务容错手段进行处理。
- 同时通过 Filter 层拦截调用,实现客户端的监控统计。
- 最后在 Protocol 层,与服务端结点建立连接,对数据进行编码序列化,封装成 Dubbo RPC 请求,发给服务端节点。
这样的话,客户端的请求就从一个本地调用转化成一个远程 RPC 调用,经过服务调用框架
的处理,通过网络传输到达服务端。其中服务调用框架包括通信协框架 Transporter、通信
协议 Codec、序列化 Serialization 三层处理。
服务端从网络中接收到请求后的处理过程是这样的:
- 首先在 Protocol 层,把网络上的请求解析成 Dubbo RPC 请求。使用netty4进行数据接收,编码反序列化。
- 然后通过 Filter 拦截调用,实现服务端的监控统计。
- 最后通过 Proxy 层的处理,把 Dubbo RPC 请求转化为接口的具体实现,执行调用。