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 开发, 多语言 , 多协议支持
对比图
Dubbo整体架构
业界一般用两种形式来展现,你认为那种舒服就可以使用哪一种(#^.^#)
介绍一下各层都是干什么的, 其实一下的知识点可以回顾我们上两篇文章讲的内容喲,前后呼应看,效果应该着实不错滴(*^▽^*)
-
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
扩展点自适应
扩展点自激活
Dubbo实现原理剖析
扩展点使用。可以看出dubbo是如何扩展的。
getExtensionLoader
getExtension
使用到双重锁,并且添加实例到缓存中、
体现了aop的概念,真正的实例被一层层包装
扩展点默认加载实现
getDefaultExtension
去加载配置文件
还有一些内容,就不分享,这个是关键,嘻嘻
完
以上是关于RPC框架深入剖析(下)的主要内容,如果未能解决你的问题,请参考以下文章
大牛带你深入Dubbo,高性能RPC通信框架:Dubbo简介和总体大图