-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于spring+p4j实现的讨论 #42
Comments
以及 PluginListableBeanFactory 未传递插件平台的parentBeanFactory,导致插件的feign无法拿到插件平台的load balance |
@xinkunZ 大哥能参考下你的代码吗?我也需要做类似这样的需求。。。头大了 |
@hnzhrh 思路:用annotation application context作为插件的spring context,将插件平台的spring context作为插件的parent,使得插件可以优先从parent中获取bean。 以及,考虑自定义插件的application context的classloader,在加载class时优先从平台(即启动插件的线程的上下文classloader)加载class,找不到再从插件jar( PluginClassLoader )加载class
|
抛开情绪性的内容, 你实际上提出了两个很好的问题:
你提到的0.1.5版本是2020年旧版本了. sbp在2023年初为了支持spirng boot 3.0和webflux, 进行了一波大重构. 你也可以了解一下. 最后我想说的是. sbp从一开始就有明确的实现目标, 也有比较完整的单元测试覆盖率保证其提供符合预期的功能. 如果在同一实现目标的前提下, 有更好的实现方式, 也欢迎随时提出问题和改进建议. 目前sbp这个项目我利用个人空闲时间用爱发电已经维持了5年时间, 已在多个真实项目中使用验证过, 但目前的状态还是一个比较抽象的底层框架, 使用起来确实仍有不低的门槛, 目前比较成熟的应用场景是提供api服务, 并利用插件化的能力向不同的部署目标提供差异化交付. 我一直希望能够推出像其它"Spring微服务全家桶"那样开箱即用的模板工程, 但迟迟没有找到一个比较完美的前端插件化方案配合. 希望有时间有能力的朋友能加入一起玩. |
好了我冷静完了 说一下我对插件的设计思路 我以为,IDEA有自己的插件、eclipse有自己的插件,因此,我们设计的插件系统应该是针对一个指定的服务(插件平台),而为这个服务开发的插件才可以被这个服务加载,插件大部分的依赖、spring bean都应该由平台提供。
那么,因此: 如果插件是springboot,那么引申而来的autoconfig、容器端口等问题过于复杂,并且这样做的意义不明: 既然插件已经是springboot,那为什么不单独启动(docker、jar) 因此,我设计的插件系统的目标:
|
正是因为AutoConfiguration复杂, 所以才要让SpringBoot帮我们去做好这些乱七八糟的鸟事. 就拿你提的方案里面第3点举例, 如果不用SpringBoot去配置Controller, 那么就要自己配置aop, 配置security, 配置TransactionManager, 配置ConversionService等等各种看不见但是离不开的东西, 这些工作量都不少的. 基于spring框架的插件化, 其实问题不在于用spring还是spring boot, 还是要根据项目情况和个人习惯去做选择. 插件化的难点其实是在于对各个现在中间件库的插件化改造. 目前主要的中间件库实现基本上都是只考虑在启动时完成配置就用到死, 没留下多少能在运行时更改配置的接口, 很多时间只能通过反射hack掉或整个context重新加载. |
|
如果实现了我说的第3点(插件能够继承平台的spring context),那么插件天然就能得到平台springboot创建出的TransactionManager、ConversionService。插件无需关心创建流程,直接注入即可。 建议你看看Intellij对插件平台与插件的classpath、classloader定义 对所有想用现成的spring插件框架的人说一句: 没有谁能帮你解决一个复杂的spring二创功能,有能力就自己理清思路手搓一个,没有能力就想想自己真的需要这种插件功能吗是否可以换个方式实现(比如父子独立服务) |
@xinkunZ 老哥方便传下你新项目源码么,我找了不少框架方案,你的思路感觉是最精简实用的。 |
具体不爽的点:
ClassLoadingStrategy
),我实现的时候也没有用这套。但是SpringBootPluginClassLoader这个类实现的真丑,明明内部loadClass可以按约定先平台、后插件jar,居然还提供pluginFirstClasses让调用者关心细节。SpringBootstrap也没有指定父容器的classLoader新项目已经被我重新实现了,仍然是spring+p4j,如果想看我也可以放出源码
The text was updated successfully, but these errors were encountered: