一、基本类
1.Extensible 代表这个类或者接口是可扩展的,默认单例、不需要编码,里面定义了类路径、是否单例、code码,如果我们要使用sofa-rpc的扩展机制,必须定义Extensible
2.Extension 扩展点,定义了扩展点名字、扩展点编码、优先级排序,默认不需要,大的优先级高、是否覆盖其它低的同名扩展、排斥其它扩展,可以排斥掉其它低的扩展
3.ExtensionClass 扩展接口实现类,用以包装对于Extensible和Extension的实现类,包含了注解扩展的基本信息和对应扩展类的实例
4.ExtensionLoader 扩展加载器,一个可扩展接口类,对应一个加载器,包含了类的各种加载器,加载监听器(比一定需要)
5.ExtensionLoaderFactory ExtensionLoader工厂类
6.ExtensionLoaderListener 加载监听器接口,当ExtensionClass生成成功后,出发onLoad事件
二、源码分析
ExtensionLoader.ExtensionLoader()
1.if (autoLoad) {//是否自动装填,但是目前sofa-rpc并没能实现异步装填
List<String> paths = RpcConfigs.getListValue(RpcOptions.EXTENSION_LOAD_PATH);
for (String path : paths) {
loadFromFile(path);
}
}
2.tmp = ClassUtils.forName(className, false);//反射获取类
3.Extension extension = implClass.getAnnotation(Extension.class);//检查是否有可扩展标识
4.extensionClass = buildClass(extension, implClass, alias);//order属性或者override判定当前扩展可以覆盖其它同名扩展
5.loadSuccess(alias, extensionClass);//ExtensionLoader加载完毕,触发listener事件
三、总结
1.ExtensionLoader自动装填机制:目前系统并没实现,可以考虑使用future机制来获取ExtensionLoader
2.我们可以通过order或者override属性,对系统的各个扩展点进行扩展,目前已知的可扩展如下
接口名 | 中文名 | 内置实现 |
---|---|---|
com.alipay.sofa.rpc.client.Client | 客户端 | Failover、Failfast |
com.alipay.sofa.rpc.client.ConnectionHolder | 连接管理器 | AllConnect(全部连接) |
com.alipay.sofa.rpc.client.AddressHolder | 地址管理器 | 单组、多组 |
com.alipay.sofa.rpc.client.LoadBalancer | 负载均衡 | 随机、轮询、最少并发、一致性hash、本机优先 |
com.alipay.sofa.rpc.client.Router | 路由器 | |
com.alipay.sofa.rpc.codec.Compressor | 压缩 | snappy、quicklz |
com.alipay.sofa.rpc.codec.Serializer | 序列化器 | java、hessian、pb |
com.alipay.sofa.rpc.filter.Filter | 拦截器 | |
com.alipay.sofa.rpc.protocol.Protocol | 协议 | bolt、dubbo、rest |
com.alipay.sofa.rpc.protocol.ProtocolDecoder | 协议解码 | bolt |
com.alipay.sofa.rpc.protocol.ProtocolEncoder | 协议编码 | bolt |
com.alipay.sofa.rpc.protocol.TelnetHandler | telnet的响应 | version、help、ls |
com.alipay.sofa.rpc.proxy.Proxy | 代理类 | java、javassist |
com.alipay.sofa.rpc.registry.Registry | 注册中心 | zookeeper |
com.alipay.sofa.rpc.server.Server | 服务端实现 | bolt、rest |
com.alipay.sofa.rpc.transport.ClientTransport | 客户端长连接实现 | netty |
com.alipay.sofa.rpc.transport.ServerTransport | 服务端长连接实现 | netty |