面对分布式的开发,很多系统之间的调用都是使用rpc直接调用,但是有的时候上游的系统需要调用下游系统很多的接口,导致开发工作量很大。因此上游系统使用spi的方式在jar包中打一个spi接口,让下游的业务实现这个spi接口,上游的系统则可以通用的调用这一个接口就可以使用不同的功能。
下游业务方的实现:
一般我们需要设计如何实现spi接口,那实现的最简单的方式就是implements这个spi接口,这种实现方式不利用后续的扩展。
目前,在项目中,我使用注解+Spring容器启动的特性+面向接口+接口模版来实现。
比如我需要实现 上游接口
public interface SpiService{
public Result<T> process(Request request);
}
下游的实现
public class SpiServiceImpl implements SpiService{
private SpiManager spiManager;
public Result<T> process(Request request){
return spiManager.handle(request);
}
}
public interface SpiManager{
public Result<T> handle(Request request);
}
public class SpiManagerImpl extends ApplicationObjectSupport implements SpiManager{
private Map<String ,ProcessSpi> map=new HashMap<String,ProcessSpi>();
protected void initApplicationContext(ApplicationContext context) throws BeansException {
super.initApplicationContext(context);
//设置不同的处理器,在spring容器启动之后,创建注解中key与具体实现的类映射
// map设值
}
public Result<T> handle(Request request){
//根据上游传的key获取相应的spiProcess类进行处理
}
}
public interface SpiProcess{
public Result doProcess(Request request);
}
public interface SpiProcessTemplate{
public before(Request request,Result<T> result);
public process(Request request,Result<T> result);
public after(Request request,Result<T> result);
}
public abstract class AbstractSpiProcess implements SpiProcess,SpiProcessTemplate{
public Result doProcess(Request request){
Result result=new Result();
before( request, result);
process( request, result);
after( request, result);
return result; }
}
业务上具体实现类,extends AbstractSpiProcess 就可以使用了。
最后将类配置到spring的文件中就ok
本文只是简单的说了一下 SPI的使用场景以及简单的实现。没有更具体的实现,需要根据不同的业务设计不同的实现框架