当前位置: 首页 > news >正文

微服务-java spi 与 dubbo spi

Java SPI

通过一个案例来看SPI
在这里插入图片描述

public interface DemoSPI {void echo();
}
public class FirstImpl implements DemoSPI{@Overridepublic void echo() {System.out.println("first echo");}
}
public class SecondImpl implements DemoSPI{@Overridepublic void echo() {System.out.println("second echo");}
}
public class Main {public static void main(String[] args) {ServiceLoader<DemoSPI> loader = ServiceLoader.load(DemoSPI.class);Iterator<DemoSPI> iterator = loader.iterator();while (iterator.hasNext()) {iterator.next().echo();}System.out.println("加载完毕!!!!!");}
}

SPI :Service Provider Interface, 服务提供接口。
JDK SPI:ServiceLoader.load
使用load方法频率高,容易影响IO吞吐和内存消耗, 可以看到回去静态资源目录下读取文件。
使用load方法想要获取指定的实现类,需要自己进行遍历并编写各种比较代码,可能实现有多个所以需要比对。

Dubbo SPI: ApplicationModel.defaultModel().getExtensionLoader
增加缓存,来降低磁盘IO访问及减少对象的生成
使用Map的hash查找,来提升检索指定实现类的性能。

在这里插入图片描述

@SPI
public interface DubboSPI {void echo();
}
public class DubboFirstSPI implements DubboSPI{@Overridepublic void echo() {System.out.println("first dubbo spi");}
}
public class DubboSecondSPI implements DubboSPI{@Overridepublic void echo() {System.out.println("second spi");}
}public class DubboMain {public static void main(String[] args) {ExtensionLoader<DubboSPI> loader = ExtensionLoader.getExtensionLoader(DubboSPI.class);DubboSPI firstf = loader.getExtension("first");DubboSPI second = loader.getExtension("second");firstf.echo();second.echo();}
}

com.liyong.leran.dubbospi.DubboSPI里面的内容:

first=com.liyong.leran.dubbospi.DubboFirstSPI
second=com.liyong.leran.dubbospi.DubboSecondSPI

public T getExtension(String name, boolean wrap) {if (StringUtils.isEmpty(name)) {throw new IllegalArgumentException("Extension name == null");}if ("true".equals(name)) {return getDefaultExtension();}final Holder<Object> holder = getOrCreateHolder(name);Object instance = holder.get();if (instance == null) {synchronized (holder) {instance = holder.get();if (instance == null) {instance = createExtension(name, wrap);holder.set(instance);}}}return (T) instance;}
// 走缓存的方法
private Holder<Object> getOrCreateHolder(String name) {Holder<Object> holder = cachedInstances.get(name);if (holder == null) {cachedInstances.putIfAbsent(name, new Holder<>());holder = cachedInstances.get(name);}return holder;}
http://www.lryc.cn/news/275243.html

相关文章:

  • redis复习笔记03(小滴课堂)
  • 【Spring Cloud】关于Nacos配置管理的详解介绍
  • 基于Java SSM框架实现校园网络维修系统项目【项目源码】
  • 项目框架构建之3:Nuget服务器的搭建
  • 外包干了1个月,技术退步一大半。。。
  • 167. 木棒(dfs剪枝,经典题)
  • 用HTML的原生语法实现两个div子元素在同一行中排列
  • C++进阶--map和set的介绍及使用
  • MIML-DA
  • [ROS2 Foxy]#1.3 安装使用 turtlesim
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程(物联技术666)
  • 1-01初识C语言
  • Python字符串
  • PHP 基础编程 1
  • Android studio BottomNavigationView 应用设计
  • 51单片机串行口相关知识
  • IDEA 每次新建工程都要重新配置 Maven的解决方案
  • SecOC中新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。这边截取的部分一般取多长?由什么参数设定?
  • 信源编码与信道转移矩阵
  • React 实现拖放功能
  • 马克思主义基本原理笔记
  • Vue+JavaSpingBoot笔记(1)
  • 10-单例模式(Singleton)
  • C++ 求一个数是否是丑数。
  • SpringCloud系列篇:核心组件之注册中心组件
  • 通过IP地址防范钓鱼网站诈骗的有效措施
  • 服务器GPU温度过高挂掉排查记录
  • 服务器终端快速下载coco数据集
  • el-select下拉框 change事件返回该项所有数据
  • MySQL基础篇(一)SQL