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×tamp=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×tamp=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>
配置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的主要内容,如果未能解决你的问题,请参考以下文章