开发者社区 > 云原生 > 中间件 > 正文

为什么Seata的springcloud服务中引入dubbo后导致大量bean被提前实例化?

为什么Seata的springcloud服务中引入dubbo后导致大量bean被提前实例化?
trationDelegate$BeanPostProcessorChecker : Bean 'feign.client-org.springframework.cloud.openfeign.FeignClientProperties' of type [org.springframework.cloud.openfeign.FeignClientProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

展开
收起
青城山下庄文杰 2023-08-11 17:20:42 116 0
1 条回答
写回答
取消 提交回答
  • Seata 的 Spring Cloud 服务中引入 Dubbo 后导致大量 Bean 被提前实例化,是因为 Dubbo 使用 Javassist 动态代理实现了 RPC 代理,而 Javassist 在代理类中会生成 private static final Method[] methods 字段,用于存储被代理类的方法列表,这个字段会在代理类被加载时初始化,如果被代理类有大量的方法,则 Javassist 会生成大量的方法字段,从而导致大量 Bean 被提前实例化。

    为了解决这个问题,可以将 Dubbo 的 provider 配置项设置为 false,这样 Dubbo 就不会使用 Javassist 动态代理,也就不会生成 private static final Method[] methods 字段,从而避免大量 Bean 被提前实例化。

    另外,也可以使用 Spring Cloud 的 @DubboReference 注解来引入 Dubbo 的服务,这样 Spring Cloud 会使用 SpringProxyFactory 来创建 Dubbo 代理,SpringProxyFactory 不会使用 Javassist 动态代理,也就不会生成 private static final Method[] methods 字段,从而避免大量 Bean 被提前实例化。

    2023-09-27 09:24:23
    赞同 展开评论 打赏

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
Dubbo开源现状与2.7规划 立即下载
Dubbo分布式服务治理实战 立即下载
《Dubbo 3.0 前瞻》 立即下载