Sentinel 的 SPI 机制
2026/8/1 1:32:53 网站建设 项目流程

Java SPI

Java SPI是通过策略模式实现的,一个接口提供多个实现类,而使用哪个实现类不在程序中确定,而是配置文件配置的,具体步骤如下

  1. 定义接口及其对应的实现类
  2. 在META-INF/services目录下创建以接口全路径命名的文件
  3. 文件内容为实现类的全路径名
  4. 在代码中通过java.util.ServiceLoader#load加载具体的实现类

写个Demo演示一下

publicinterfaceCar{voidgetBrand();}
publicclassBenzCarimplementsCar{@OverridepublicvoidgetBrand(){System.out.println("benz");}}
publicclassBMWCarimplementsCar{@OverridepublicvoidgetBrand(){System.out.println("bmw");}}

org.apache.dubbo.Car的内容如下

org.apache.dubbo.BenzCar org.apache.dubbo.BMWCar

测试类

publicclassJavaSpiDemo{publicstaticvoidmain(String[]args){ServiceLoader<Car>carServiceLoader=ServiceLoader.load(Car.class);// benz// bmwcarServiceLoader.forEach(Car::getBrand);}}

Sentinel SPI

Java SPI vs Sentinel SPI

为了理解 Sentinel 为什么重写 SPI,可以看它们的对比:

特性Java 原生 SPI (ServiceLoader)Sentinel SPI (SpiLoader)
配置文件路径META-INF/services/META-INF/services/ 或 META-INF/csp/
加载方式每次调用产生新实例,懒加载内部使用 ConcurrentHashMap 缓存,支持单例模式
加载顺序/优先级无序(取决于 classpath 顺序)支持通过 @Spi(order = …) 设置加载顺序/优先级
排序方向支持 ORDER_ASC(升序)和 ORDER_DESC(降序)
条件过滤支持通过注解按条件按需加载

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询