曹工说mini-dubbo(1)--为了实践动态代理,我写了个简单的rpc框架写在前面的话 (4)

这里的spi的原理也很简单:

dubbo.learn.common.spi.SpiServiceLoader#loadService public static <T> T loadService(Class<T> clazz) { //先查找缓存 Object cached = spiName2ServiceMap.get(clazz.getName()); if (cached != null) { return (T) cached; } //2.从spring容器获取该class的全部实现bean Map<String, T> map = applicationContext.getBeansOfType(clazz); if (CollectionUtils.isEmpty(map)) { return null; } if (map.size() == 1) { Object o = map.values().iterator().next(); return clazz.cast(o); } //读取spi文件,获取用户指定的实现 String s = SpiParser.getSpiForSpecifiedService(clazz); if (StringUtils.isEmpty(s)) { log.error("发现多个服务实现bean:{},且在spi中未指定要使用的bean",map); throw new RuntimeException(); } // 根据用户spi中的实现,来返回相应的bean Object specifiedServiceInSpiFile = map.values().stream().filter(v -> Objects.equals(v.getClass().getName(), s)) .findFirst().orElse(null); if (specifiedServiceInSpiFile == null) { log.error("spi中指定的服务在bean集合中未找到。" + "发现多个服务实现bean:{},在spi中指定的服务为:{}",map,s); throw new RuntimeException(); } spiName2ServiceMap.put(clazz.getName(),specifiedServiceInSpiFile); return (T) specifiedServiceInSpiFile; } 总结

里面细节比较多,最近工作比较忙,所以,大家可以先把代码弄下来,直接自己运行下,依赖的就只有一个redis而已。

后续我会接着优化该框架,欢迎大家加进来,一起开发;如果觉得还不错,就star一下吧。
源码路径:
https://gitee.com/ckl111/mini-dubbo

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwjxw.html