dubbo源码学习(二)基础知识:JAVA SPI
2016-04-14 10:14
681 查看
初学dubbo的源码,只做尝试性的去学习,做为自己学习的一个记录,各位看官如果觉得写的有错误或理解的不对,请在留言区告诉我,互相学习。本人能力有限,有大神进入 时请指点。
SPI(Service Provider Interface)服务提供的接口,定义好一个接口,里面有很多方法,真正的服务提供方是这个接口的实现,在众多开源的项目中都大量使用了spi的技术,因为开源项目大多提供了给用户的拓展机制,比如dubbo提供了很多spi的接口让开发者可以自己实现,如:com.alibaba.dubbo.rpc.protocol
接口就是一个spi的接口,他的实现有:
如果开发者想实现自己的协议,那么直接写一个类实现protocol接口,然后在resources/META-INF/dubbo/internal建一个文件如下:
文件名就是接口的全名就是你实现的接口的全包名+接口名,文件内容格式 为:key(协议名) = 接口的实现全包名+接口名,如下
将自己的协议打包,使用时就可以通过 key 来使用自己的协议了
以上为基于spi去实现dubbo的拓展接口,下面我自己实践一下,写一个基于java spi的demo
1、首先定义一个接口
SPI(Service Provider Interface)服务提供的接口,定义好一个接口,里面有很多方法,真正的服务提供方是这个接口的实现,在众多开源的项目中都大量使用了spi的技术,因为开源项目大多提供了给用户的拓展机制,比如dubbo提供了很多spi的接口让开发者可以自己实现,如:com.alibaba.dubbo.rpc.protocol
接口就是一个spi的接口,他的实现有:
registry=com.alibaba.dubbo.registry.integration.RegistryProtocol filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper listener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper mock=com.alibaba.dubbo.rpc.support.MockProtocol injvm=com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol rmi=com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol com.alibaba.dubbo.rpc.protocol.http.HttpProtocol com.alibaba.dubbo.rpc.protocol.webservice.WebServiceProtocol thrift=com.alibaba.dubbo.rpc.protocol.thrift.ThriftProtocol memcached=memcom.alibaba.dubbo.rpc.protocol.memcached.MemcachedProtocol redis=com.alibaba.dubbo.rpc.protocol.redis.RedisProtocol
如果开发者想实现自己的协议,那么直接写一个类实现protocol接口,然后在resources/META-INF/dubbo/internal建一个文件如下:
文件名就是接口的全名就是你实现的接口的全包名+接口名,文件内容格式 为:key(协议名) = 接口的实现全包名+接口名,如下
myProtocol=cn.myProtocolImpl.eProtocol.BitProtocol
将自己的协议打包,使用时就可以通过 key 来使用自己的协议了
<!-- 协议端口 部署到双网卡时加 host="172.21.28.98"--> <dubbo:protocol name="myProtocl" host="127.0.0.1" port="9998" accepts="1000" threadpool="fixed" threads="100" />
以上为基于spi去实现dubbo的拓展接口,下面我自己实践一下,写一个基于java spi的demo
1、首先定义一个接口
public interface SPIService { public void say(); }2、编写接口的实现,为了看效果我写了两个实现
public class SayHello implements SPIService { @Override public void say() { System.out.println("Say Hello"); } }
public class SaySpi implements SPIService { @Override public void say() { System.out.println("Say Spi"); } }3、建文件夹resources/META-INF/services,在建好的目录下建一个文件,文件名是接口的全包名+路径,文件内容如下
com.spi.service.impl.SayHello com.spi.service.impl.SaySpi4、测试
public class TestSPI { public static void main(String[] args) { ServiceLoader<SPIService> loader = ServiceLoader.load(SPIService.class); for (SPIService service : loader) { service.say(); } } }5、输出
Say Hello Say Spi从上面我们可以看到java spi在配置实现的时候是没有 key 的,dubbo为了通过用户的配置来动态的获取实现,所以对spi做了一些改造,可以通过key来动态的获取实现,比如协议有:dubbo、rmi、hession等,网络传输方式 :netty、mina、grizzy
Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();以上基本的了解了 spi 的工作机制及在dubbo中的作用。接下来会看dubbo自定义spring标签,以及自己实现一个spring的标签。
相关文章推荐
- Java 开发必装的 IntelliJ IDEA 插件
- java程序的内存分析
- java基础知识
- Spring MVC3返回JSON数据中文乱码问题解决
- java集合框架06——fail-fast机制
- SpringMVC通过@PathVariable注解传递对象
- 简单的UDP通信
- Spring MVC过滤器-登录过滤
- activiti自定义流程之Spring整合activiti-modeler实例(九):历史任务查询
- 处理Java编码遇到的一个问题
- activiti自定义流程之Spring整合activiti-modeler实例(八):完成个人任务
- java+JBroFuzz对restful api进行fuzz测试
- activiti自定义流程之Spring整合activiti-modeler实例(七):任务列表展示
- activiti自定义流程之Spring整合activiti-modeler实例(六):启动流程
- 关于myeclipse修改默认index.jsp的解决方案
- activiti自定义流程之Spring整合activiti-modeler实例(五):流程定义列表
- java 集合ArrayList及LinkList源码分析
- activiti自定义流程之Spring整合activiti-modeler实例(四):部署流程定义
- [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句
- MyEclipse自动补全与快捷键设置