自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 2021-12-23

2021SC@SDUSC 2.2 自适应拓展类代码生成 createAdaptiveExtensionClassCode 方法代码略多,约有两百行代码。因此本节将会对该方法的代码进行拆分分析,以帮助大家更好的理解代码逻辑。 2.2.1 Adaptive 注解检测 在生成代理类源码之前,createAdaptiveExtensionClassCode 方法首先会通过反射检测接口方法是否包含 Adaptive 注解。对于要生成自适应拓展的接口,Dubbo 要求该接口至少有一个方法被 Adaptive 注解修饰。

2021-12-23 10:57:58 316 1

原创 2021-12-13

2021SC@SDUSC getAdaptiveExtension 方法首先会检查缓存,缓存未命中,则调用 createAdaptiveExtension 方法创建自适应拓展。下面,我们看一下 createAdaptiveExtension 方法的代码。 private T createAdaptiveExtension() { try { // 获取自适应拓展类,并通过反射实例化 return injectExtension((T) getAdaptiveExten

2021-12-13 13:24:13 180

原创 2021-12-13

2021SC@SDUSC 源码分析 在对自适应拓展生成过程进行深入分析之前,我们先来看一下与自适应拓展息息相关的一个注解,即 Adaptive 注解。该注解的定义如下: @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface Adaptive { String[] value() default {}; } 从上面的代码中可知,

2021-12-13 13:20:53 190

原创 2021-12-4

2021SC@SDUSC SPI 自适应拓展 自适应拓展的原理和实现细节 原理 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等。有时,有些拓展并不想在框架启动阶段被加载,而是希望在拓展方法被调用时,根据运行时参数进行加载。这听起来有些矛盾。拓展未被加载,那么拓展方法就无法被调用(静态方法除外)。拓展方法未被调用,拓展就无法被加载。对于这个矛盾的问题,Dubbo 通过自适应拓展机制很好的解决了。自适应拓展机制的实现逻辑比较复杂,

2021-12-04 20:54:30 317

原创 2021-11-22

2021SC@SDUSC 条件匹配调用的逻辑封装在 isMatch 中,代码如下: private boolean isMatch(String value, URL param) { // 情况一:matches 非空,mismatches 为空 if (!matches.isEmpty() && mismatches.isEmpty()) { // 遍历 matches 集合,检测入参 value 是否能被 matches 集合元素匹配到。

2021-11-22 14:01:44 361

原创 2021-11-21

2021SC@SDUSC 服务路由 服务路由的入口方法是 ConditionRouter 的 route 方法,该方法定义在 Router 接口中。实现代码如下: public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException { if (invokers == null || i

2021-11-21 22:29:11 349

原创 2021-11-08

2021SC@SDUSC 表达式解析 下面我们把重点放在 parseRule 方法上,在详细介绍这个方法之前,我们先来看一个内部类。 private static final class MatchPair { final Set<String> matches = new HashSet<String>(); final Set<String> mismatches = new HashSet<String>(); } MatchPair

2021-11-08 14:12:07 50

原创 2021-11-01

2021SC@SDUSC Dubbo IOC Dubbo IOC 是通过 setter 方法注入依赖。Dubbo 首先会通过反射获取到实例的所有方法,然后再遍历方法列表,检测方法名是否具有 setter 方法特征。若有,则通过 ObjectFactory 获取依赖对象,最后通过反射调用 setter 方法将依赖设置到目标对象中。整个过程对应的代码如下: private T injectExtension(T instance) { try { if (objectFactory !=

2021-11-01 15:26:58 57

原创 2021-10-25

2021SC@SDUSC 获取所有的拓展类(2) loadDirectory 方法先通过 classLoader 获取所有资源链接,然后再通过 loadResource 方法加载资源。我们继续跟下去,看一下 loadResource 方法的实现。 private void loadResource(Map<String, Class<?>> extensionClasses, ClassLoader classLoader, java.net.URL resourceURL) {

2021-10-25 16:04:06 62

原创 2021-10-24

2021SC@SDUSC SPI 示例 Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下,配置内容如下。 optimusPrime = org.apache.spi.OptimusPrime bumblebee = org.apache.spi.Bum

2021-10-24 23:46:50 46

原创 2021-10-17

2021SC@SDUSC SPI 示例 Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下,配置内容如下。 optimusPrime = org.apache.spi.OptimusPrime bumblebee = org.apache.spi.Bum

2021-10-17 22:49:02 42

原创 2021-10-10

2021SC@SDUSC SPI分析 JDK的SPI思想 SPI的全名为Service Provider Interface,面向对象的设计里面,模块之间推荐基于接口编程,而不是对实现类进行硬编码,这样做也是为了模块设计的可拔插原则。为了在模块装配的时候不在程序里指明是哪个实现,就需要一种服务发现的机制,jdk的spi就是为某个接口寻找服务实现。jdk提供了服务实现查找的工具类:java.util.ServiceLoader,它会去加载META-INF/service/目录下的配置文件。具体的内部实现逻辑为

2021-10-10 22:44:19 76

原创 2021-09-30

2021SC@SDUSC dubbo学习综述:主要是对dubbo的总体了解和认识,对dubbo架构的学习,代码的安装和初步使用以及我在小组中的分工

2021-09-30 22:17:47 64

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除