SpringBoot 整合Dubbo

SpringBoot 整合Dubbo

chuxiwen 4,396 2023-03-04

SpringBoot 整合Dubbo

使用springboot整合dubbo在网上有很多教程,至于我为什么出一篇文章呢?全因为我!因为这个搞了一天,不分享我憋得慌。

搭建项目结构

搭建项目文件

springboot_dubbo_1

ConsumerApplication

@SpringBootApplication
public class ConsumerApplication {

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

DemoController

@RestController
public class DemoController {

    @DubboReference
    private DemoService demoService;

    @GetMapping("/{msg}")
    public String getDemo(@PathVariable("msg") String msg){
        return demoService.say(msg);
    }
}

DemoService

public interface DemoService {

    String say(String s);
}

DemoServiceImpl

@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String say(String s) {
        return "Hello !" + s;
    }
}

ProviderApplication

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {

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

application.yaml

dubbo:
  registry:
    address: zookeeper://localhost:2181
    timeout: 60000

application-provider.yaml

server:
  port: 8081
dubbo:
  application:
    name: provider-application

application-consumer.yaml

server:
  port: 8082

dubbo:
  application:
    name: consumer-application

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.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.liu</groupId>
    <artifactId>dubbo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubbo</name>
    <description>dubbo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--        spring mvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--        测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-zookeeper -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
            <version>3.1.0</version>
        </dependency>




    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

设置启动配置

设置ProviderApplication的启动参数

设置运行参数
springboot_dubbo_2
设置运行的文件
springboot_dubbo_3

consumer 同理,改成consumer。平平无奇创项目,over ~

zookeeper在window上

在window上下载zookeeper

zookeeper 地址: https://zookeeper.apache.org/releases.html
springboot_dubbo_4

进入网页点击链接下载

springboot_dubbo_5

解压下载的文件夹

springboot_dubbo_6

复制zoo_sample.cfg为zoo.cfg并编写配置

spring_dubbo_7

在相应位置创建文件夹

springboot_dubbo_8

好的,可以启动了 ! bin目录下点击zkServer.cmd
springboot_dubbo_9

测试程序

springboot_dubbo_10

测试成功

springboot_dubbo_11

zookeeper在Linux虚拟机上时

讲道理,到这里我应该快乐的开始学习了,但是!我偏偏想着把zookeeper移植到Linux虚拟机上,奇奇怪怪的就开始出现了。。。。此处省略zookeeper的部署过程。

出现zookeeper不能连接的错误

springboot_dubbo_12

反省问题

一开始考虑是不是因为客户端和zookeeper的版本不兼容,
但是因为在windows上部署zookeeper可以连接,
所以就排除了版本不兼容的问题,又考虑到是不是连接延时问题
但是我的延时已经设置成为60s了,不应该是这方面问题
然后我就想,是不是因为其他特殊参数的影响??
我使用zookeeper作为注册中心,dubbo依靠zookeeper
那以dubbo的尿性,肯定在一开始就把zookeeper加载好了。
那我去翻SPI接口,应该可以找到原因!

关于Dubbo SPI内容。参考:https://chuxiwen.top/archives/dubbo-de-spi-ji-zhi

尝试解决

在SPI接口中找注册中心

springboot_dubbo_13

dubbo依赖的注册方式

springboot_dubbo_14

顺着方法找到连接的逻辑

springboot_dubbo_15

惊喜发现

springboot_dubbo_16

到这里,心中已经有数,解决问题的逻辑一定在这个方法中,开搞!!!

找到问题

springboot_dubbo_17
springboot_dubbo_18

也就是说,只有我可以把这个10改一下,是不是就可以了??继续搞!!!

通过yaml文件点到dubbo的配置类

springboot_dubbo_19

发现该配置类中没有blockUntilConnectedWait这个参数,但是发现了一个Map集合,这个集合可以添加其他参数,难不成??这个特殊的参数是通过这个map进行获取吗!

修改application.yaml文件

dubbo:
  registry:
    address: zookeeper://192.168.92.100:2181
    timeout: 60000
    parameters:
      "blockUntilConnectedWait": 100

问题解决

springboot_dubbo_20
当看见这个,激动的快哭出来,搞了一天啊!!上面看似逻辑通顺,都是无数次尝试一步步试错搞出来的。感谢!

最后在看看这美妙的Hello!dubbo!

springboot_dubbo_21

总结

当确保自己的操作没有问题时,一定要根据框架的特性想到一些解决办法,必要时要debug。这次整合确实耽误了很多时间,但是不亏,得瑟一会~~~


# dubbo学习