基于spring factories机制开发SDKSPI机制javaspi代码:为某个接口寻找服务实现的机制
java SPI就是提供这样的一个机制 ,需要在META-INF目录中设置接口的实现javaspi代码,以实现服务接口与实现的解耦 。第三方服务厂商或者插件服务javaspi代码,可以依据SPI机制javaspi代码,实现功能扩展 。
在Spring中也有一种类似与Java SPI的加载机制 。它在META-INF/spring.factories文件中配置接口的实现类,我们成为Spring factories机制,基于此我们可以自定义stater或SDK供javaspi代码他人使用,项目只在pom.xml中引入SDK,无须配置即可实现功能集成 。
最近的需求为例,需要实现授权功能SDK,以供其他产品使用
项目目录结构如下
第一步:在包名root目录下创建自动配置类 EsbrSdkAutoConfig
内容如下:添加
@Configuration
@ComponentScan(basePackageClasses = EsbrSdkAutoConfig.class)
标识此类为配置类,并配置扫描路径为当前类
第二步;在resources/META-IN目录下,创建spring.factories文件
内容如下:
将org.springframework.boot.autoconfigure.EnableAutoConfiguration的自动配置为值设置为第一步的EsbrSdkAutoConfig的全限定类名(包名+类名)
第三步:编写SDK的Service
通过以上三步,即可基于Spring factories机制完成自定义Starter,在其他项目pom.xml中引入该starter即可
是不是很简单 , 下面讲解下原理
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件中的配置,
并通过 loadFactoryNames方法() 获取其接口类的名称
在这个方法中会遍历整个ClassLoader中所有jar包下的spring.factories文件 。也就是说我们可以在自己的jar中配置spring.factories文件 , 不会影响到其它地方的配置 , 也不会被别人的配置覆盖 。
将org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.org.bjca.esbr.sdk.EsbrSdkAutoConfig
基于springboot自动配置,会扫描并初始化EsbrSdkAutoConfig类,并将EsbrSdkAutoConfig作为basepackage,扫描改类及其该类子包下的类,加载到spring容器 。
Dubbo——服务调用、服务暴露、服务引用过程 1、InvokerInvocationHandler jdk动态代理
5、RegistryDirector返回Invokers
Router分为:Script 脚本路由、Condition 条件路由
6、通过MockInvokersSelector的route方法(getNormalInvokers)拿到能正常执行的invokers
8、当回到AbstractClusterInvoker后,执行(默认FailoverClusterInvoker,根据配置的是,Failfast Cluster(快速失败) , Failsafe Cluster(失败安全) , Failback Cluster(失败自动恢复) , Forking Cluster(并行调用多个服务器,只要一个成功即返回) , Broadcast Cluster(广播调用所有提供者 , 逐个调用 , 任意一台报错则报错))doInvoker方法
9、FailoverClusterInvoker调用AbstractClusterInvoker的select方法
10、执行doSelect方法
11、调用AbstractLoadbalance的select方法
12、根据配置的负载均衡策略调用对应的(如RoundRobinLoadBalance)类的doSelect方法
13、返回invokers.get()方法
14、调用FailoverClusterInvoker的invoke方法
均继承自抽象类AbstractDirectory
Directory 获取 invoker 是从 methodInvokerMap 中获取的,主要都是读操作,那它的写操作是在什么时候写的呢?就是在回调方法 notify 的时候操作的,也就是注册中心有变化,则更新 methodInvokerMap 和 urlInvokerMap 的值
根据dubbo-admin配置的路由规则来过滤相关的invoker,当javaspi代码我们对路由规则点击启用,就会触发 RegistryDirectory 类的 notify 方法 。
notify方法调用refreshInvoker方法 。
route方法的实现类为ConditionRoute 根据条件进行过滤
推荐阅读
- 钉钉怎么样上传到电脑文件,钉钉怎么传输文件到电脑
- 温岭如何做品牌推广赚钱,温岭如何做品牌推广赚钱的公司
- pdf图纸怎么去掉颜色,pdf消除图案
- 快手的图文直播在哪看,快手看图纸
- php读取数据库出现乱码 php读取数据库出现乱码怎么回事
- 上海go语言开发,上海go语言招聘
- 免费在线pdf转图片,免费的pdf转换在线
- 华为智慧屏v65鸿蒙系统评测,华为智慧屏v65升级鸿蒙20
- python库函数太多 python 库函数