sofastack / sofa-ark

SOFAArk is a light-weight,java based classloader isolation framework.
https://www.sofastack.tech/projects/sofa-boot/sofa-ark-readme/
Apache License 2.0
1.55k stars 488 forks source link

Ark-Plugin 的使用是否会导致中间件的 starter 的 AutoConfiguration 等机制失效 #68

Closed cngddflzw closed 6 years ago

cngddflzw commented 6 years ago

Your question

Ark-Plugin 的使用是否会导致中间件的 starter 的 AutoConfiguration 等机制失效.

我想知道这是否是因为 ark plugin 包结构变化以后, 导致 spi 机制和 spring 的扫包机制失效了, 所以我们在用 sofa-boot 的时候不能再使用那些 sofa-boot 的配置方式, 只能通过原生的 rpc api 来启动.

此外我观察到 sofa-boot 项目的 ark 测试例子中也是没有使用 sofa-boot 的配置方式的, 是否是这个原因呢?

Your scenes

测试 boot-rpc 的 ark 版本

        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>rpc-sofa-boot-starter</artifactId>
            <classifier>ark-plugin</classifier>
        </dependency>

发现使用 starter 的非 ark 版本能正常运行的 rpc demo , 如果改为使用 ark 版本会无法运行, 会报一些异常, 例如:

com.alipay.sofa.runtime.api.ServiceRuntimeException: Can't find BindingConverter of type binding.bolt

我的 rpc 配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sofa="http://sofastack.io/schema/sofaboot"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://sofastack.io/schema/sofaboot   http://sofastack.io/schema/sofaboot.xsd"
       default-autowire="byName">

    <bean id="personServiceImpl" class="com.zim.test.sofa.sofaboottest.bean.PersonServiceImpl"/>

    <sofa:service ref="personServiceImpl" interface="com.zim.test.sofa.sofaboottest.bean.PersonService">
        <sofa:binding.bolt/>
        <sofa:binding.rest/>
        <sofa:binding.dubbo/>
    </sofa:service>

    <sofa:reference id="personReferenceBolt" interface="com.zim.test.sofa.sofaboottest.bean.PersonService">
        <sofa:binding.bolt/>
    </sofa:reference>

    <sofa:reference id="personReferenceRest" interface="com.zim.test.sofa.sofaboottest.bean.PersonService">
        <sofa:binding.rest/>
    </sofa:reference>

    <bean id="personFilter" class="com.zim.test.sofa.sofaboottest.bean.PersonServiceFilter"/>

</beans>

以及, 集成测试用例

@RunWith(ArkBootRunner.class)
//@RunWith(SpringRunner.class)
@SpringBootTest(classes = SofaBootTestApplication.class)
public class SofaBootTestApplicationTests {

    @Autowired
    private PersonService personReferenceBolt;

    @Autowired
    private PersonService personReferenceRest;

    @Test
    public void contextLoads() {
        System.out.println(personReferenceBolt.sayName("abc"));
        System.out.println(personReferenceRest.sayName("123"));
    }

}

Environment

QilongZhang commented 6 years ago

@cngddflzw 麻烦提供sofa boot 版本?

cngddflzw commented 6 years ago

@QilongZhang 你好. sofa-boot dependencies 版本是 2.4.0 我把项目传上去了 https://github.com/cngddflzw/sofa-boot-test

QilongZhang commented 6 years ago

我想知道这是否是因为 ark plugin 包结构变化以后, 导致 spi 机制和 spring 的扫包机制失效了, 所以我们在用 sofa-boot 的时候不能再使用那些 sofa-boot 的配置方式, 只能通过原生的 rpc api 来启动.

sofa ark 框架不会影响 spring 扫包机制,用户在开发时,不用考虑是否运行在 sofa ark 容器之上。

再回到你反馈的报错问题,我在本地测试时,测试工程主 pom.xml 添加如下依赖即可解决你反馈的报错:

        <dependency>
            <groupId>com.alipay.sofa</groupId>
            <artifactId>rpc-sofa-boot-starter</artifactId>
        </dependency>

这里解释下原因,rpc-sofa-boot-starter 包含了需要和应用共用一个 ClassLoader 的代码,因此应用需要除了引入 rpc ark plugin,还需要引入该 starter。 ark plugin 中包含了 rpc-core 及相关间接依赖包

QilongZhang commented 6 years ago

@cngddflzw 在底层实际已经隔离,现在这种使用方式不太友好。在下一个迭代中, 我们会做到只需要引入一个 ark plugin 包,稍后会更新相关的 roadmap。 感谢反馈

cngddflzw commented 6 years ago

感谢答复 :)

QilongZhang commented 6 years ago

@cngddflzw 我已经在 #69 记录了这个使用上改进的问题,会放在0.4.0。 这个issue将会被关闭,如果有其它问题,请重新提问,感谢反馈。