演练的 github 地址:

https://github.com/apache/incubator-dubbo-samples.git

0x01 dubbo 提供服务

public interface CatService {
    int getId();

    String getName();

    String cat();
}
public class CatServiceImpl implements CatService {
    @Override
    public int getId() {
        return 1;
    }

    @Override
    public String getName() {
        System.out.println("I am a Cat!");
        return "I am a Cat!";
    }

    @Override
    public String cat() {
        System.out.println("Meow Meow!");
        return "Meow Meow!";
    }
}

0x01 dubbo-provider 配置

dubbo-demo-provider.xml
总计 4 个服务

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- optional provider's application name, used for tracing dependency relationship -->
    <dubbo:application name="concurrency-backend">
        <dubbo:parameter key="qos.enable" value="true"/>
        <dubbo:parameter key="qos.accept.foreign.ip" value="false"/>
        <dubbo:parameter key="qos.port" value="33333"/>
    </dubbo:application>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--    <dubbo:protocol port="-1"/>-->
    <dubbo:protocol name="dubbo" port="20891"/>

    <dubbo:config-center address="zookeeper://127.0.0.1:2181"/>

    <bean id="catService" class="org.apache.dubbo.samples.governance.impl.CatServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.governance.api.CatService" ref="catService"/>

    <bean id="dogService" class="org.apache.dubbo.samples.governance.impl.DogServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.governance.api.DogService" ref="dogService"/>

    <bean id="lionService" class="org.apache.dubbo.samples.governance.impl.LionServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.governance.api.LionService" ref="lionService"/>

    <bean id="tigerService" class="org.apache.dubbo.samples.governance.impl.TigerServiceImpl"/>
    <dubbo:service interface="org.apache.dubbo.samples.governance.api.TigerService" ref="tigerService"/>

</beans>

0x02 Provider 服务运行

public class BackendProvider {

    public static void main(String[] args) throws Exception {
//        new EmbeddedZooKeeper(2181, false).start();
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring/dubbo-demo-provider.xml"});
        context.start();

        System.in.read(); // press any key to exit
    }

}

0x03 测试工程

jar 包引用

Provider相关的两个jar包打出来,作为测试工程的libLibrary
dubbo-samples-chain-api-1.0-SNAPSHOT.jar
dubbo-samples-chain-backend-1.0-SNAPSHOT.jar

pom.xml 新增:

<dependency>
     <groupId>io.netty</groupId>
     <artifactId>netty-all</artifactId>
     <version>4.1.16.Final</version>
   </dependency>
   <dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo-bom</artifactId>
     <version>${dubbo.version}</version>
     <type>pom</type>
     <scope>import</scope>
   </dependency>
   <dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo</artifactId>
     <version>${dubbo.version}</version>
     <exclusions>
       <exclusion>
         <groupId>org.apache.thrift</groupId>
         <artifactId>libthrift</artifactId>
       </exclusion>
     </exclusions>
   </dependency>
   <dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo-rpc-rest</artifactId>
     <version>${dubbo.rpc.version}</version>
   </dependency>
   <dependency>
     <groupId>org.apache.zookeeper</groupId>
     <artifactId>zookeeper</artifactId>
     <version>${zookeeper.version}</version>
   </dependency>
   <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-framework</artifactId>
     <version>${curator.version}</version>
     <exclusions>
       <exclusion>
         <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
       </exclusion>
     </exclusions>
   </dependency>

   <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-client</artifactId>
     <version>${curator-client.version}</version>
     <exclusions>
       <exclusion>
         <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
       </exclusion>
     </exclusions>
   </dependency>

   <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-recipes</artifactId>
     <version>${curator-client.version}</version>
     <exclusions>
       <exclusion>
         <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
       </exclusion>
     </exclusions>
   </dependency>

consumer.xml 配置

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- optional, consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:application name="concurrency-front"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <dubbo:config-center address="zookeeper://127.0.0.1:2181"/>

    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
    local regular interface -->
    <dubbo:reference id="catService" check="false" interface="org.apache.dubbo.samples.governance.api.CatService"/>
    <dubbo:reference id="dogService" check="false" interface="org.apache.dubbo.samples.governance.api.DogService"/>
    <dubbo:reference id="lionService" check="false" interface="org.apache.dubbo.samples.governance.api.LionService"/>
    <dubbo:reference id="tigerService" check="false" interface="org.apache.dubbo.samples.governance.api.TigerService"/>

</beans>

spring.xml 导入 consumer.xml 配置

<?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:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:property-placeholder location="classpath:properties/hero-${spring.profiles.active}.properties" ignore-unresolvable="true" />

    <import resource="classpath:spring/hero-spring-mvc.xml"/>
    <import resource="classpath:spring/hero-spring-jdbc.xml"/>
    <import resource="classpath:spring/hero-spring-redis.xml"/>
<!--    <import resource="classpath:spring/hero-spring-es.xml" />-->
    <import resource="classpath:spring/dubbo-demo-consumer.xml"/>

    <aop:aspectj-autoproxy/>

    <beans>
        <bean id="multiDataSourceAspect" class="com.hero.common.aop.DataSourceAspect" ></bean>
    </beans>

</beans>

BaseSuport 配置

@ContextConfiguration(locations = {"classpath*:spring/hero-spring.xml"})
@Listeners({MyExtentTestNgFormatter.class})
//@ActiveProfiles(value = "local")
public class BaseSupport extends AbstractTestNGSpringContextTests {

    @Autowired
    public AppConfig appConfig;


    @DataProvider(name = "feeder")
    public Iterator<Object[]> feeder(Method testMethod) {
        Class<?> testClass = testMethod.getDeclaringClass();
        EquivalenceGeneratorFactory generatorFactory = new EquivalenceGeneratorFactory();
        AnnotationMapper mapper = new AnnotationMapper(generatorFactory);
        BeneratorContext context = new DefaultBeneratorContext();
        context.setGeneratorFactory(generatorFactory);
        mapper.parseClassAnnotations(testClass.getAnnotations(), context);
        Generator<Object[]> generator = mapper.createAndInitMethodParamsGenerator(testMethod, context);
        return new FeedIterator(generator);
    }
}

测试 demo

/**
 * @Des:
 * @Auther: 飞狐
 * @Date: 2019-04-24
 */
public class DubboSampleTest extends BaseSupport {


    @Resource
    private CatService catService;

    @Test
    public void test1(){
        System.out.println(catService.cat());
    }

}


↙↙↙阅读原文可查看相关链接,并与作者交流