【全面】Springboot 整合 dubbo

dubbo的demo中,网上很多事把生产者与消费者建立在同一个项目,不同模块中的。而我是把它们分别建成不同的项目,其中生产者我采用springboot + dubbo 编写,而消费者采用spring +dubbo编写。

通常,我们会把服务的接口单独拿出来作为api服务,我这里的做法是单独建立一个工程,然后打成jar包,生产者以及消费者去引入这个jar包即可。

这是api的项目结构,里面定义了一个接口,以及一个bean类

这是接口,它的主要功能是通过计算因子去计算,并且返回计算结果。

package com.dubbo.api.bean.service;

import com.dubbo.api.bean.bean.Factor;

public interface CaculateService {
    int add(Factor factor);
}

这是计算因子的java bean

package com.dubbo.api.bean.bean;

import java.io.Serializable;

public class Factor implements Serializable {
    private static final long serialVersionUID = 3386485586764910030L;

    public Factor(int a,int b){
        this.a=a;
        this.b=b;
    }
    private int a;
    private int b;


    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }
}

写完之后就可以打成jar包了。

idea 打成jar包的方法是:

  首先pom.xml引入

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <useUniqueVersions>false</useUniqueVersions>
                        <classpathPrefix>lib/</classpathPrefix>
                        <!--mainclass指的是运行类的全类名-->
                        <mainClass>cn.happy.MyMapReduce</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

 然后

即可。最后要把jar包放到本地的maven仓库,方便其他项目引用。

命令如下:

mvn install:install-file -Dfile=jar包路径 -DgroupId=自定义groupId -DartifactId=自定义artifactId  -Dversion=版本号 -Dpackaging=jar

修改上面的 jar包路径,自定义groupId,自定义artifactId,版本号即可。

下面编写生产者代码,采用spring boot+ dubbo

结构如下:

   

pom.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cache.service</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>com.dubbo.api</groupId>
            <artifactId>com.dubbo.api</artifactId>
            <version>0.0.5</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

provider.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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 服务应用名称 -->
    <dubbo:application name="provider"/>
    <!-- 使用zookeeper做为注册中心 -->
    <dubbo:registry  protocol="zookeeper" address="zookeeper://localhost:2181"/>

    <dubbo:protocol name="dubbo" port="20880" />

    <!-- ref中的值要跟服务实现类中的@Server的值一致 -->
    <dubbo:service interface="com.dubbo.api.bean.service.CaculateService" ref="demoService"/>

</beans>

接着要具体实现接口,

package com.cache.service.demo.service.impl;

import com.dubbo.api.bean.bean.Factor;
import com.dubbo.api.bean.service.CaculateService;
import org.springframework.stereotype.Service;

@Service("demoService")
public class CaculateServiceImpl implements CaculateService {

    @Override
    public int add(Factor factor) {
        return factor.getA()+factor.getB();
    }
}

这便是具体实现接口,最后记得在启动时引入provider.xml文件

package com.cache.service.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:provider.xml")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

这样消费者即可调用这个生产者提供的服务了。

消费者的配置文件 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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <dubbo:application name="demotest-consumer" owner="programmer" organization="dubbox"/>
    <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
    <dubbo:reference id="permissionService" interface="com.dubbo.api.bean.service.CaculateService"/>
</beans>

消费者调用服务

package com.cache.service.demo;
import com.dubbo.api.bean.bean.Factor;
import com.dubbo.api.bean.service.CaculateService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Consumer {
    public static void main(String[] args) {
        //测试常规服务
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("consumer.xml");
        context.start();
        System.out.println("consumer start");
        CaculateService caculateService =(CaculateService) context.getBean("permissionService");

        Factor factor=new Factor(3,5);
        int result=caculateService.add(factor);
        System.out.print(result);
    }
}

看看结果:

正确。

猜你喜欢

转载自blog.csdn.net/qq_34761108/article/details/81205918