SpringBoot整合dubbo详述「建议收藏」

环境:jdk1.8+springboot-2.2.1+dubbo-2.5.3+zookeeper-3.5.5+maven构建工具:IDEA我们知道,dubbo的本质就是一个远程服务调用的分布式框架。为了演示分布式架构的大致流程,我们项目里首先要建立对应的角色节点,即服务提供者、消费者以及公共接口服务,总体结构为:dubbo_demo:是总项目duboo-api:主要是…

大家好,又见面了,我是你们的朋友全栈君。

环境:jdk1.8+springboot-2.2.1+dubbo-2.5.3+zookeeper-3.5.5+maven

构建工具:IDEA

      我们知道,dubbo的本质就是一个远程服务调用的分布式框架。为了演示分布式架构的大致流程,我们项目里首先要建立对应的角色节点,即服务提供者、消费者以及公共接口服务,总体结构为:

SpringBoot整合dubbo详述「建议收藏」

dubbo_demo:是总项目
duboo-api:主要是实体类和接口服务
dubbo-customer:调用远程服务的服务消费方
duboo-provider:暴露服务的服务提供方

创建各个module的过程就不贴出来了,就是普通的springboot项目。需要注意的一点是在创建的时候每个module的GroupId要完全一致,否则在互相调用资源的时候会出现无法引入资源的问题。

 

一、dubbo_demo的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <zkclient.version>0.10</zkclient.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>
    <modules>
        <!-- 主要放实体、接口、也可以放一些公用的工具类工程-->
        <module>dubbo-api</module>
        <!-- 服务消费者工程 -->
        <module>dubbo-customer</module>
        <!-- 服务提供者工程-->
        <module>dubbo-provider</module>
    </modules>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>


    </dependencies>

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

</project>

由于dubbo的jar中也引入了spring依赖,所以在引入dubbo依赖时,需要将spring相关排除掉,否则会和项目本身的spring冲突。

即上面pom中的:

 <exclusion>
         <groupId>org.springframework</groupId>
         <artifactId>spring</artifactId>
 </exclusion>

二、接下来是dubbo-api的pom.xml配置,这个就比较简单了,这里不用引入dubbo等依赖 :

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dubbo</groupId>
    <artifactId>dubbo-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-api</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

在dubbo-api中新建service包,添加测试接口

SpringBoot整合dubbo详述「建议收藏」

 

package com.dubbo.api.service;


public interface TestService {
    String sayHello(String name);
}

三、1.dubbo-provider的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dubbo</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <zkclient.version>0.10</zkclient.version>
        <dubbo.version>2.5.3</dubbo.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- zookeeper客户端 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

2.创建TestService的实现类TestServiceImpl:

SpringBoot整合dubbo详述「建议收藏」

package com.dubbo.provider.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.api.service.TestService;

@Service(version = "1.0.0",timeout = 3000)
 public class TestServiceImpl  implements TestService {

    @Override
     public String sayHello(String name) {
        return "哈哈哈,hello "+name;
    }
}

需要注意的是这里的@Service注解是dubbo的而不是spring的,不要用错了。

3.接下来在resources下创建spring-dubbo.xml文件,向zookeeper及dubbo注册并暴露服务

<?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="dubbo-provider"/>
    <!-- 注册中心的ip地址 -->
    <!-- 将服务提供者的地址暴露出去。这个过程通过zookeeper实现服务注册中心,进行注册暴露 -->
    <dubbo:registry address="zookeeper://192.168.4.54:2181"/>
    <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
    <dubbo:annotation package="com.dubbo.provider.impl"/>

    <!-- 将服务提供者的端口号暴露出去 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- service implementation, as same as regular local bean -->
    <bean id="testService" class="com.dubbo.provider.impl.TestServiceImpl"/>
    <!-- 将服务提供者需要对外提供的功能暴露出去 -->
    <dubbo:service interface="com.dubbo.api.service.TestService" ref="testService"/>

</beans>

4.application.yml 中配置服务端口号:

server:
 port: 9010

 

四、1.dubbo-customer的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dubbo</groupId>
    <artifactId>customer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>customer</name>
    <description>Demo project for Spring Boot</description>
    <packaging>jar</packaging>

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

    <dependencies>
        <dependency>
            <groupId>com.dubbo</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>${zkclient.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

2.创建消费端服务调用类 TestController

SpringBoot整合dubbo详述「建议收藏」

package com.dubbo.customer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.api.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Reference(version = "1.0.0",timeout = 300)
    private TestService testService;

    @RequestMapping("/sayHello")
    public String sayHello(@RequestParam String name) {
        System.out.println("name=="+name);
        System.out.println("testService=="+testService);
        return testService.sayHello(name);
    }





}

3.同样在resources下创建spring-dubbo.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="dubbo-consumer"/>
    <!-- 注册中心的ip地址 -->
    <dubbo:registry address="zookeeper://192.168.4.54:2181"/>
    <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
    <dubbo:annotation package="com.dubbo.customer.controller"/>

    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <dubbo:reference id="testService" check="false" interface="com.dubbo.api.service.TestService"/>

</beans>

4.application.yml 中配置服务端口号:

server:
 port: 9011

五、接下来就可以测试服务提供者和消费者是否能成功注册到dubbo上了,先启动放置dubbo-admin的tomcat以及zookeeper,再依次启动dubbo-provider和dubbo-customer服务,登录dubbo-admin控制台页面,可以看到provider和customer都已成功注册。

SpringBoot整合dubbo详述「建议收藏」

 

SpringBoot整合dubbo详述「建议收藏」

 

访问消费者服务customer也能成功调用provider

SpringBoot整合dubbo详述「建议收藏」

至此,所有流程算是成功了。下面说一下过程中遇到的一些问题。

 

构建过程中遇到的问题

1.最初在provider中调用com.dubbo.api.service.TestService类时一开始报错ClassNotFound,提示在dubbo-provider中 找不到TestService,虽然我们在pom中已经引入了要调用的项目配置。经过各种调试,因为被调用者是dubbo-api module中的类,
最终我这里的解决方法是重新clean并编译一遍dubbo-api

SpringBoot整合dubbo详述「建议收藏」

然后执行Rebuild Project

SpringBoot整合dubbo详述「建议收藏」

再次强调,如果要想各个module相互调用,它们的GroupId必须是一致的。

2.通过执行以上操作,虽然在IDEA中没问题了,但是当我将dubbo-customer打成jar放到其它机器上运行时,又报了空指针异常,经调试发现原来是这里通过@Reference引入的testService为null

SpringBoot整合dubbo详述「建议收藏」

解决方法:

在被依赖项目dubbo-api的pom.xml文件spring-boot-maven-plugin依赖中加入配置<classifier>exec</classifier>,即:

 <build>
        <finalName>dubbo-api</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

另外,打包顺序也要注意,要先编译被依赖项dubbo-api,再编译dubbo-customer。

 

参考文章:

https://blog.csdn.net/qq_19419233/article/details/86678035#dubbo_1

https://www.cnblogs.com/gaopengfirst/p/9555240.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127505.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++ stringstream ss()[通俗易懂]

    c++ stringstream ss()[通俗易懂]定义了三个类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。本文以stringstream为主,介绍流的输入和输出操作。主要用来进行数据类型转换,由于使用string对象来代替字符数组(snprintf方式),就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言,更加安全、自动和直接。一、从string对象str中读.

    2022年5月22日
    65
  • web安全测试_web测试的主要测试内容

    web安全测试_web测试的主要测试内容1.1什么是web安全测试?Web安全测试就是要提供证据表明,在面对敌意和恶意输入的时候,web系统应用仍然能够充分地满足它的需求1.2为什么进行Web安全测试2005年06月,CardSystems,黑客恶意侵入了它的电脑系统,窃取了4000万张信用卡的资料。2011年12月,国内最大的开发者社区CSDN被黑客在互联网上公布了600万注册用户的数据;黑客随后陆续公布了网易、人人、天涯、猫扑等多家大型网站的数据信息。2014年12月,大量12306用户数据被泄露,被泄露的数据达131653条,包括

    2025年12月5日
    2
  • stm32驱动摄像头ov7725_stm32能做图像处理吗

    stm32驱动摄像头ov7725_stm32能做图像处理吗最近学了一点stm32做图像处理的皮毛.做了个小玩意儿,用了stm32做了灰度化,二值化,从而找到一条路线的中点,然后根据偏差对输出相应的pwm。适合初学者看看,很浅层。f1带图像有点吃力,所以分别把图像和控制分成了两块32,这样速度快一点。这是图像处理的代码。https://download.csdn.net/download/weixin_42521239/10…

    2025年11月25日
    7
  • java list详解_java集合List解析[通俗易懂]

    java list详解_java集合List解析[通俗易懂]作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求;Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。Java集合主要由2大体系构成,分别是C…

    2022年7月9日
    18
  • 金融大数据风控模型「建议收藏」

    金融大数据风控模型「建议收藏」https://www.secrss.com/articles/27699导读:金融是AI赋能传统行业的重要赛道。本次分享的主要内容为金融大数据风控模型在度小满金融的实践。主要介绍金融大数据风控模型的主要技术方法与在应用层面的主要问题,并结合新冠疫情背景下,探讨下风控模型的发展。01金融大数据风控模型的技术方法1.风险管理中的金融科技风险管理中的金融科技主要包括两个方面:一方面是传统金融的风险管理,包括: A卡(ApplicationScorecard,申请评分卡) .

    2022年6月9日
    54
  • vim配置python开发环境_pycharm和vim哪个好

    vim配置python开发环境_pycharm和vim哪个好Vim是一款非常好用的IDE,特别是在Linux中。但是其的配置过程十分麻烦。

    2022年9月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号