spring整合dubbo实现简单分布式接口调用

随着微服务,分布式的概念越来越火,越来越多的互联网公司开始尝试使用分布式进行项目开发,分布式开发的好处毋庸置疑,分工明确,团队协作高效,安全,解耦分离等,其中以springcloud为代表的新分布式微服务框架,以及以阿里开源 的dubbo框架为代表,其他的诸如thrift等,也可以作为一种分布式框架的选择,接下来,以dubbo为例,整合一个简单的spring整合dubbo的案例demo,以备参考使用;

1)首先,规划demo分为三个工程,
这里写图片描述

demo-service为单独的maven工程,该工程在实际项目中作为服务提供者,专门用来提供接口,众多的接口将构成对外提供的接口列表,通过注册中心,对外暴露接口列表,消费者通过订阅注册中心服务,即可获取该工程提供的接口;

demoservice-impl,也为maven工程,此处将其与接口分开,是为了从实际的安全考虑,当然也可以与接口工程进行合并,放在同一个工程里,实际使用中有此用法,建立分开,也为了工程之间相互依赖和继承时候方便;

demoservice-consumer,为消费者方,可以是jar,或war,实际业务中,如果是标准的、web项目,建议使用war工程,具体创建三个工程的过程不再赘述;

2)demo-service项目配置:
该项目只提供接口,没有任何具体的业务逻辑和实现,也不需要导入jar包文件,因此建立一个包,下面写各种对外提供的接口即可,
从此处创建一个package,新建一个class为DemoService的接口,提供一个接口,
public interface DemoService {
String demo(String name);
}

3)dubbo-service-impl为上述接口的实现工程,需要承载具体的实现逻辑,各项配置如下,pom配置文件为:

</dependencies>
    <dependency>
        <groupId>com.sino</groupId>
        <artifactId>dubbo-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.5.3</version>
        <exclusions>
            <exclusion>
                <artifactId>spring</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.1.6.RELEASE</version>
    </dependency>

    <!-- 访问zookeeper的客户端jar -->
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>

</dependencies>

导包的时候注意在dubbo的jar包里,包含了spring的部分依赖,为了能够和spring整合使用,需要排除dubbo中中的spring依赖包,避免使用报错;
创建接口实现的package,此处简单打印输出一句话,测试即可,
public class DemoServiceImpl implements DemoService{

    public String demo(String name) {
        return "传递过来的name:" + name;
    }

}

接下来是服务提供方的dubbo配置文件,主要配置项如下:

<!-- 给当前provider一个名字,这个名字会在注册中心中唯一标识 -->
<dubbo:application name="dubbo-service"/>

<!-- 配置注册中心类型,此处采用zookeeper注册中心 -->
<dubbo:registry protocol="zookeeper" address="192.168.111.1:2181"></dubbo:registry>

<!-- 配置dubbo自身的端口 -->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>

<!-- 提供的注册的功能 ,注入本工程中需要实际提供的服务-->
<dubbo:service interface="com.acong.service.DemoService" ref="demoServiceImpl"></dubbo:service>

<bean id="demoServiceImpl" class="com.acong.service.impl.DemoServiceImpl"></bean>

以上为主要的配置项,配置完毕即可使用,如果需要更精细的运维,例如配置dubbo的高可用,可以参考dubbo的官方API详细了解,此处不做过多配置;

配置完毕,写一个测试的启动类,通过这个启动类,将要对外提供的服务接口注册发布到zookeeper上,由于是采用了spring的配置文件方式,此处可使用如下方式进行启动:
public class TestDubbo {

    /*ClassPathXmlApplicationContext acc = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
    acc.start();
    System.out.println("启动成功");*/

    //官方推荐
    Main.main(args);
}

}

启动完毕,如果部署了管控台,即可在管控台上查看当前的服务提供方提供的服务信息;

4)服务提供方服务发布完毕,消费端即可通过订阅注册中心的服务,调用相应的服务列表进行使用,配置如下,
pom文件同上述dubbo-service-impl一致;
applicationContext-dubbo.xml配置文件配置项有所不同,参考如下:

<!-- 给当前consumer起一个名字,唯一标识 -->
<dubbo:application name="dubbo-consumer"/>

<!-- 配置注册中心,此处采用zookeeper注册中心,和服务提供者的地址保持一致 -->
<dubbo:registry protocol="zookeeper" address="192.168.111.1:2181"></dubbo:registry>

<!-- 配置dubbo自身的端口,消费者端不需要 -->
<!-- <dubbo:protocol name="dubbo" port="20880"></dubbo:protocol> -->

<!-- 消费者方配置注解扫描,这样该包下的业务类可以调用服务提供方的服务-->
<dubbo:annotation package="com.acong.service.impl"/>

<!-- 配置单独测试dubbo接口 -->
<bean id="testImpl" class="com.acong.service.impl.TestServiceImpl"></bean>

![这里写图片描述](https://img-blog.csdn.net/20180907230754727?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nY29uZ3lpNDIw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

在dubbo-consumer工程中,新建测试使用的package,接口和实现类的包,包下的类要和配置文件中进行对于,在TestServiceImpl中,通过@Reference注解,即可将要使用的服务注入并使用,
public class TestServiceImpl implements TestService{

@Reference
private DemoService demoService;

public void test() {
    String name = demoService.demo("张三");
    System.out.println(name);

}

}

创建测试类,TestConsumer,
public class TestConsumer {
    public static void main(String[] args) {
        ApplicationContext acc = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
        TestServiceImpl impl = acc.getBean("testImpl", TestServiceImpl.class);
        impl.test();
    }
}   

运行main方法,即可看到控制台打印name的值为"张三",说明调用成功。

**到这里,spring整合dubbo,基本整合完毕!**

猜你喜欢

转载自blog.csdn.net/zhangcongyi420/article/details/82503911
今日推荐