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


相关推荐

  • 跳表介绍和实现_真人二段跳教学

    跳表介绍和实现_真人二段跳教学想慢慢的给大家自然的引入跳表。想想,我们1)在有序数列里搜索一个数2)或者把一个数插入到正确的位置都怎么做?很简单吧对于第一个操作,我们可以一个一个比较,在数组中我们可以二分,这样比链表快对于第二个操作,二分也没什么用,因为找到位置还要在数组中一个一个挪位置,时间复杂度依旧是o(n)。那我们怎么发明一个查找插入都比较快的结构呢?可以打…

    2025年6月16日
    0
  • 腾讯云服务器配置ssl,腾讯云服务器SSL证书申请及配置[通俗易懂]

    腾讯云服务器配置ssl,腾讯云服务器SSL证书申请及配置[通俗易懂]最近在研究微信小程序,服务端需要部署在一台服务器上,查看了一下,腾讯云在搞活动,就申请了腾讯云的服务器,但是微信小程序访问需要用https协议才能请求,于是研究了一下如何申请及配置ssl证书。本人穷逼一枚,一向以节俭,所以申请了一个免费证书。申请步骤如下:1、登录证书申请页面https://console.qcloud.com/ssl/apply2、输入必要信息,通用名称及申请邮箱,点击下一步这一…

    2022年9月4日
    4
  • 小波阈值去噪

    小波阈值去噪目录1.概念2.原理3.影响降噪效果的因素3.1小波基的选择3.2分解层数的选择3.3阈值的选择3.4阈值函数的选择4.MATLAB代码参考文献1.概念小波分析即用Mallat塔式算法对信号进行降阶分解。该算法在每尺度下将信号分解成近似分量与细节分量。近似分量表示信号的高尺度,即低频信息;细节分量表示信号的低尺度,即高频信息。对含有噪声的信号,噪声分量的主要能量集中在小波分解的细节分量中。2.原理小波阈值去噪的实质为抑制信号中无用部分、增强有用部分的过

    2022年6月16日
    48
  • idea2021激活码mac版本破解方法

    idea2021激活码mac版本破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    869
  • JetBrains Fleet 初体验

    JetBrains Fleet 初体验几天前获得了fleet的体验资格。长话短说,今天就来和你一起看看现在的fleet都有啥先看名字–fleet什么是fleet?n.舰队;捕鱼船队;(一国的)全部军舰,海军看来,JetBrains是想让”OneIDEtocodeitall.”的口号落实,真正的实现一人成军。配合它自带的Distributedmode,前端后端统一管理。或许真正的Monorepo就会来临?再看图标铁灰色底座配合缺了两个缺口和天空蓝淡紫渐变的圆球主体,我猜它…抱歉我看不懂,于是我当场质问了JetBra.

    2022年6月14日
    80
  • 查询端口下请求总数

    查询端口下请求总数

    2021年9月8日
    60

发表回复

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

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