Dubbo学习 —— SpringBoot 整合Dubbo

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo学习 —— SpringBoot 整合Dubbo相关的知识,希望对你有一定的参考价值。

小项目

启动zookeeper注册中心

# 进入zookeeper安装目录的bin目录
#启动服务端
sudo zkServer.sh start
#启动客户端
sudo ./zkCli.sh

监控中心

dubbo-admin是Dubbo服务管理中心,dubbo-admin 是图形化管理页面。可以从注册中心中获取到所有的提供者/消费者进行配置管理。

Dubbo admin is a spring boot application, you can start it with fat jar or in IDE directly.
dubbo monitor and dubbo registry

安装监控中心 dubbo-admin

记得不要下错安装包,是在master分支,不是默认打开的dev分支:dubbo admin

下载完的zip文件解压后通过,通过以下步骤打包为war包

Step1:

dubbo-admin安装时需要指定注册中心地址。如下修改application.properties 的注册中心位置

server.port=7001 # http访问端口
dubbo.registry.address=zookeeper://192.168.59.123:2181 # 指定注册中心地址
Step 2:

进入dubbo-admin目录,打包成jar

mvn package

通过以下命令在指定端口7001与运行dubbo-admin图形界面,
java -jar dubbo-admin-0.0.1-SNAPSHOT

bug

需要关闭虚拟机的防火墙否则会连接失败

[DUBBO] Failed to retry subscribe {admin://192.168.56.1?category=providers,consumers,routers,configurators&check=false&classifier=*&enabled=*&group=*&interface=*&version=*=[com.alibaba.dubboadmin.governance.sync.RegistryServerSync@70ff3c73]}, waiting for again, cause: Failed to subscribe admin://192.168.56.1?category=providers,consumers,routers,configurators&check=false&classifier=*&enabled=*&group=*&interface=*&version=* to zookeeper zookeeper://192.168.59.123:2181/com.alibaba.dubbo.registry.RegistryService?application=dubbo-admin&dubbo=2.6.2&interface=com.alibaba.dubbo.registry.RegistryService&pid=7096&timestamp=1625670406016, cause: KeeperErrorCode = ConnectionLoss, dubbo version: 2.6.2, current host: 192.168.56.1
com.alibaba.dubbo.rpc.RpcException: Failed to subscribe admin://192.168.56.1?category=providers,consumers,routers,configurators&check=false&classifier=*&enabled=*&group=*&interface=*&version=* to zookeeper zookeeper://192.168.59.123:2181/com.alibaba.dubbo.registry.RegistryService?application=dubbo-admin&dubbo=2.6.2&interface=com.alibaba.dubbo.registry.RegistryService&pid=7096&timestamp=1625670406016, cause: KeeperErrorCode = ConnectionLoss

防火墙常用命令

systemctl enable firewalld.service		# 开启开机自启动防火墙
systemctl disable firewalld.service   # 关闭开机自启动防火墙
firewall-cmd --state  # 查看状态

监控中心启动后,可以通过 localhost:7001来访问

监控中心配置

dubbo:
  # 监控中心配置
  monitor:
    # 监控中心协议,如果为protocol=“registry”,表示从注册中心(zookeeper://192.168.59.123:2181)发现监控中心地址(7001),否则直连监控中心。
    protocol: registry

SpringBoot整合dubbo

引入spring-boot-starter、dubbo和zookeeper客户端curator的依赖

如果使用的dubbo版本低于2.7.0,所导入的依赖需要遵循以下规则:

在这里插入图片描述

我们引入的是dubbo2.7.8,在父工程的pom.xml 进行依赖的声明和版本控制:

  <properties>
        <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
        <dubbo.version>2.7.8</dubbo.version>
        <curator.version>4.2.0</curator.version>
        <curator-recipes.version>2.8.0</curator-recipes.version>
        <zookeeper.version>3.6.3</zookeeper.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--SpringBoot Web Starter -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>


            <!-- Dubbo Spring Boot Starter -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <!-- zookeeper注册中心 需要导入zookeeper依赖  -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>${zookeeper.version}</version>
            </dependency>

            <!-- Zookeeper 客户端 -->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>${curator.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>${curator-recipes.version}</version>
            </dependency>


        </dependencies>
    </dependencyManagement>

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>parent</artifactId>
        <groupId>com.johnny</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service-dubbo-provider</artifactId>

    <dependencies>

        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>


        <!--SpringBoot Web Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Zookeeper 客户端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
        </dependency>


        <!-- 使用到了zookeeper注册中心 需要导入zookeeper依赖  -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.johnny</groupId>
            <artifactId>common-tool-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!-- 热部署开发工具 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>2.3.4.RELEASE</version>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

    </dependencies>


</project>

Dubbo 官方文档
SpringBoot整合dubbo

配置application.yml

SpringBoot 整合Dubbo,Dubbo的所有配置都只要在application.yml配置即可。

提供者配置 application.yaml

dubbo:
  application:
    name:  user-service-dubbo-provider  # 1、指定当前dubbo应用服务/应用的名字  用于注册中心计算应用间依赖关系
  registry:
    address: zookeeper://192.168.59.123:2181  # 2、指定注册中心位置
    protocol: zookeeper # 注册中心协议
    timeout: 25000  # dubbo连接注册中心的最大超时时间
  protocol: #  3、服务提供者协议配置(包括通信协议和通信端口)
    name: dubbo  #通信协议 分布式固定是dubbo 不要该
    port: 20882  #通信端口. dubbo协议缺省端口为20880


  # 监控中心配置
  monitor:
    # 监控中心协议,如果为protocol=“registry”,表示从注册中心(zookeeper:2181)发现监控中心地址(7001),否则绕过注册中心直连监控中心。  与注解@
    protocol: registry

  config-center:  # 读取dubbo配置文件的超时时间
    timeout: 15000
  #  4、 扫描远程服务所在的包 这里采用通过注解形式暴露服务
#  scan:
#    base-packages:  com.johnny.dubbo.service.impl

消费者配置 application.yaml

server:
  port: 8081
dubbo:
  application:
    name:  order-service-dubbo-consumer  # 服务名
  registry:
    address: zookeeper://192.168.59.123:2181
    timeout: 25000
  # 监控中心配置
  monitor:
    # 监控中心协议,如果为protocol=“registry”,表示从注册中心(zookeeper:2181)发现监控中心地址(7001),否则直连监控中心。
    protocol: registry

dubbo 注解

@EnableDubbo注解

如果没有在配置中写dubbo.scan.base-package,还需要使用在主启动类上添加@EnableDubbo注解。该注解有@DubboComponentScan,所以其功能就是相当于dubbo.scan.base-package,扫描dubbo注解,扫描的范围是该注解所在的包及其子包。

@DubboService

服务提供者暴露服务配置。对应的配置类:org.apache.dubbo.config.ServiceConfig

详见官网 dubbo:service 配置

@DubboReference

详见官网 dubbo:reference配置

bug

slf4j的版本冲突

启动provider和consumer,出现 slf4j的版本冲突问题:

SLF4J: Class path contains multiple SLF4J bindings.
 <!-- 使用到了zookeeper注册中心 需要导入zookeeper依赖  -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <!-- 提示与zookeeper中的slf4j-log4j12-1.7.29.jar 包冲突-->
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

dubbo2.7.8 zookeeper not connected

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-07-09 10:28:34.539 ERROR 15596 --- [  restartedMain] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: zookeeper not connected
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:83) ~[dubbo-2.7.8.jar:2.7.8]

1、 首先进行服务端zookeeper的排查

查看目标端口是开放

netstat -ntlp

查看目标端口是否开放

netstat -an | grep 2181

发现端口正常开放,zookeeper服务器启动正常

2、 经过排查和百度搜索,发现可能是超时,虽然报错没有提示超时TimeOut,尝试将连接zookeeper注册中心的时间设置为

dubbo:
  application:
    name:  user-service-dubbo-provider  # 1、指定当前dubbo应用服务/应用的名字  用于注册中心计算应用间依赖关系
  registry:
    timeout: 25000  #注册中心请求超时时间(毫秒) 默认是5000ms

可以通过分析curatorZookeeper.java 源码进一步验证

在这里插入图片描述

连接成功。那原因就是:服务器zookeeper不稳定导致zookeeper客户端CuratorZookeeperClient连接超时了。
如果在application.yml 对dubbo.registry.timeout进行了设置会覆盖默认的timeout时间
参考文章:
记一次dubbo连接zookeeper注册中心发生异常的排查经历

值得一提的是还有个dubbo.config-center.timeout
通过ConfigCenterConfig类读取application.yml中的配置信息,该类的timeout属性默认值为 = 3000L。dubbo的config-center配置中心,默认的获取配置的超时时间是3秒钟。

github 原回答
在github找到回答说是在客户端进行zookeeper连接时,由于认证导致的超时:
这个超时是客户端的认证问题,其实和dobbo没啥关系
加一句 System.setProperty(“zookeeper.sasl.client”, “false”); 去zoo.cfg设置也可以
再次说明这是 zookeeper的问题

以上是关于Dubbo学习 —— SpringBoot 整合Dubbo的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo学习 —— SpringBoot 整合Dubbo

Dubbo学习 —— SpringBoot 整合Dubbo

Dubbo学习-6-sprongboot整合dubbo

深入浅出学习 DubboSpringBoot 与 Dubbo 整合

Dubbo 学习笔记总结

SpringBoot整合Dubbo+ZooKeeper——实现发布并访问远程服务