RPC框架深入剖析(下)

Posted JudyGirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPC框架深入剖析(下)相关的知识,希望对你有一定的参考价值。


本章内容为NX所讲知识点 王雪芬

  • 主流RPC产品对比分析

  • Dubbo整体架构

  • Dubbo扩展机制

  • Dubbo实现原理剖析


主流RPC产品对比分析

如果让你选择一个RPC框架你会如何选择呢?

  • 语言: 你们项目开发使用的是什么语言

  • 框架特性: 你们想要什么功能?

  • 成熟度: 是否足够稳定, 文档 是否齐全

  • 技术支持,社区活跃度 


主流RPC框架: 为什么会有这么多RPC框架? 你有没有思考过呀? 不同产品设计初衷和侧重点不同, 所以 差异会很大, 但是各有优点和缺点哦~ ^_^

  • grpc : 由google开发, 支持很多语言,传输协议为http2

  • dubbo: 阿里开源,可以与spring无缝集成,语言java, 特点Dubbo spi机制

  • brpc: 百度开发,在性能方面非常优秀

  • Thrift : facebook 开发, 多语言 , 多协议支持

对比图

RPC框架深入剖析(下)

Dubbo整体架构

业界一般用两种形式来展现,你认为那种舒服就可以使用哪一种(#^.^#)

RPC框架深入剖析(下)

RPC框架深入剖析(下)

介绍一下各层都是干什么的, 其实一下的知识点可以回顾我们上两篇文章讲的内容喲,前后呼应看,效果应该着实不错滴(*^▽^*)

  • Service:业务逻辑层
  • Config:配置层,对外配置接口,以 Service,ReferenceConfig 两个实现为中心, 初始化配置信息
  • Proxy:服务代理层,Dubbo会让服务提供者和服务消费者生成代理类, 这一点在可以跟第一篇RPC文章对应哦, 用于实现远程调用,这样就可以让开发者无感知情况下远程调用
  • Registry:注册中心,封装服务地址的注册与发现
  • Cluster: 集群容错层, 也叫路由层,封装调用失败的容错,以及多个提供者的路由及负载均衡
  • monitor:监控层,RPC调用次数
  • Protocol:远程调用层. 封装RPC调用过程, 服务暴露和引用的功能入口
  • Exchange:信息交换层,封装请求响应模式,同步转异步
  • Transport: 网络传输
  • Serialize:数据序列化层

Dubbo扩展机制

什么是Dubbo扩展点?

可以针对SPI所有接口进行二次功能开发,扩展功能


Dubbo SPI 扩展点加载机制

  • Java SPI: service provider interface 一个接口多种实现, 通过配置确定使用哪个实现

  • Dubbo SPI : Java SPI增强版, 增加了对扩展点IOC和AOP的支持


JAVA SPI 实现 和Dubbo SPI 实现

看我写的这篇博客就可以 , Java SPI 与Dubbo SPI 的不同点:  Java文件名为接口名, 内容是实现. 在程序启动的时候会加载全部,这个时候会消耗很资源, Dubbo 存放在META-INF/dubbo 2 键值对的方式 , 使用@SPI注解可扩展点,利用aop和io更加可扩展

https://blog.csdn.net/dtttyc/article/details/98243562


Dubbo扩展点特性

  • 扩展点自动包装

  • 扩展点自动装配

  • 扩展点自适应

  • 扩展点自动激活


扩展点自动包装:自动包装体现AOP增强

public class ProtocolFilterWrapper implements Protocol {
//1 王雪芬持有真正的实现类,不是包装类实现功能而是成员变量实现 private final Protocol protocol; //2 王雪芬构造函数拷贝 public ProtocolFilterWrapper(Protocol protocol) { if (protocol == null) { throw new IllegalArgumentException("protocol == null"); } this.protocol = protocol; }}

扩展点自动装:自动装配体现IOC增强,利用dubbo官网代码来解释

public interface CarMaker { Car makeCar();}
public interface WheelMaker { Wheel makeWheel();}


public class RaceCarMaker implements CarMaker { WheelMaker wheelMaker;
public setWheelMaker(WheelMaker wheelMaker) { this.wheelMaker = wheelMaker; }
public Car makeCar() { // ... Wheel wheel = wheelMaker.makeWheel(); // ... return new RaceCar(wheel, ...); }}

从上面的代码中我们可以看出RaceCarMaker类中有WheelMaker 成员变量,在调用setWheelMaker会自动装配RaceCarMaker

扩展点自适应


RPC框架深入剖析(下)


扩展点自激活

RPC框架深入剖析(下)

Dubbo实现原理剖析

扩展点使用。可以看出dubbo是如何扩展的。

RPC框架深入剖析(下)


getExtensionLoader

RPC框架深入剖析(下)


getExtension

使用到双重锁,并且添加实例到缓存中、

RPC框架深入剖析(下)

体现了aop的概念,真正的实例被一层层包装

RPC框架深入剖析(下)

扩展点默认加载实现

getDefaultExtension

RPC框架深入剖析(下)

RPC框架深入剖析(下)


RPC框架深入剖析(下)


去加载配置文件

RPC框架深入剖析(下)


RPC框架深入剖析(下)


RPC框架深入剖析(下)

还有一些内容,就不分享,这个是关键,嘻嘻


                                                     


以上是关于RPC框架深入剖析(下)的主要内容,如果未能解决你的问题,请参考以下文章

大牛带你深入Dubbo,高性能RPC通信框架:Dubbo简介和总体大图

面试官:如何自己设计一个类似dubbo的rpc框架?

分布式系统如何自己设计一个类似 Dubbo 的 RPC 框架?什么是 CAP 定理?分区容错性?

[go微服务-16] Go RPC 实现服务间通信

分布式系统的面试题10

RPC