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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 海思Hi3798MV200机顶盒芯片处理器简介

    海思Hi3798MV200机顶盒芯片处理器简介Hi3798MV200是用于IPTV/OTT机顶盒市场的支持4KP60解码的全4K高性能SOC芯片。集成4核64位高性能CortexA53处理器和多核高性能2D/3D加速引擎;支持H.2654Kx2K@P6010bit超高清视频解码,高性能的H.265高清视频编码,HDR视频解码及显示,Dolby和DTS音频处理;内置USB2.0、USB3.0、SDIO3.0、PCIe2.0等丰富外设接口。…

    2022年6月26日
    402
  • haxm failed to open driver

    haxm failed to open driver今天在新的PC机上,安装android环境。PC的配置是CPU:i5,8G内存。在装intelhaxm-android.exe时候出错(见下图)。尝试:首先,查看了BIOS中对VT的支持,确定是支持并且开启状态。然后在网上试了安装haxm_extra_workaround.zip的方式,仍然不起作用。解决办法:重新安装另外一个版本的HAXM,见网址。安装后,成功解决。

    2022年6月28日
    23
  • 怎么看vue版本

    怎么看vue版本

    2021年10月11日
    57
  • 三本毕业北京打工考研北大计算机,知乎刘洋:三本到北大软微到牛津博士,最后在哈工深当老师。…

    三本毕业北京打工考研北大计算机,知乎刘洋:三本到北大软微到牛津博士,最后在哈工深当老师。…(转发侵删)背景:当年在某三本独立学院,考研一志愿报了北大信科,没过复试线,校内调剂至北大软件工程参加复试复试时第一个问题是让简单介绍一下自己和本科学校,我刚说到学校名字就被考官打断了:“你的本科学校叫AA大学BB学院,那它到底是AA大学的一个下属学院呢,还是个跟AA大学没啥关系的独立学院呢?”我回答说:“是个独立学院,三本。”于是全场寂静,空气凝结。当时的直觉就是,这伙哥们儿肯定在想:“你一个…

    2022年9月21日
    3
  • SpringBoot线程池使用

    SpringBoot线程池使用一、线程池管理配置类@Configuration@EnableAsyncpublicclassExecutorConfig{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ExecutorConfig.class);@BeanpublicExecutorasyncTaskS…

    2022年6月16日
    33
  • Swift 通过touchesBegan 方法获取用户点击的view,模拟连续点击效果[通俗易懂]

    Swift 通过touchesBegan 方法获取用户点击的view,模拟连续点击效果[通俗易懂]一:代码实现varmV:UIView! varflag=falseoverridefuncviewDidLoad(){super.viewDidLoad()mV=UIView(frame:CGRect(x:100,y:100,width:100,height:100…

    2022年7月25日
    34

发表回复

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

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