Dubbo 2.7.8 结合Spring boot搭建简单demo
记录学习dubbo搭建demo,使用的dubbo版本2.7.8,zookeeper版本3.5.8,Spring boot版本2.3.7.RELEASE。
安装zookeeper
安装环境是win10下的wsl2安装的ubuntu18,之前恰好尝试给安装好了,简单测试了下能正尝试使用,和外网也能通,用虚拟机或者其他linux环境也是一样。
大致步骤就是下载->解压->配置->运行:
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8.tar.gz
将包移动到安装目录后解压tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
,解压后目录:
简单配置,将sample配置复制一份cp zoo_sample.cfg zoo.cfg
,修改下内容,建个目录存放数据,指定数据目录,配置项为dataDir。需要注意的是,安装的这个版本是携带有zookeeper admin的,默认启动为8080端口,也可以将其关闭或者修改端口。因为我的wsl是和宿主机共用端口的,之前未注意,端口冲突不正常才发现,zookeeper adminServer官方文档,我选择了修改下端口,配置如图
通过命令nohup ./bin/zkServer.sh start
静默启动,通过./bin/zkServer.sh status
查看启动状态,除此之外stop停止、restart重启也可以,可通过-h查看支持的命令参数。如status看到类似信息则启动成功,或者查看2181端口是否处于监听状态也可判定。
至此,zookeeper安装启动已完成,通过ifconfig
查看本机ip用于连接zookeeper即可,如有防火墙之类的记得开下端口。
dubbo admin
dubbo admin是可选的,地址: https://github.com/apache/dubbo-admin ,下载代码到本地后,根据文档配置启动就好,README文档步骤启动就好,然后界面如下:
根据配置中可知,默认登录账号密码皆为root。如果这个能启动成功,说明zookeeper正常,配置正确,那在后续步骤出问题时可减少排查时间。
搭建服务
dubbo服务需要服务提供者和服务消费者,且都需要连接zookeeper和使用dubbo依赖,所以项目结构可以类似这样:
provider需要实现api定义的功能接口,consumer需调用api接口,所以把接口提取成dubbo-demo-api项目,然后在provider和consumer中引入即可。
dubbo 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.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fih.study</groupId>
<artifactId>dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>dubbo</name>
<description>Demo project for Spring Boot</description>
<modules>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
<module>dubbo-demo-api</module>
</modules>
<properties>
<java.version>1.8</java.version>
<!--<spring-boot.version>2.1.13.RELEASE</spring-boot.version>-->
<dubbo.version>2.7.8</dubbo.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.8</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
根据需要可删减非必要依赖。
服务提供者
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>com.fih.study</groupId>
<artifactId>dubbo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--<relativePath/> <!– lookup parent from repository –>-->
</parent>
<groupId>com.fih.study</groupId>
<artifactId>dubbo-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>
</properties>
<dependencies>
<dependency>
<groupId>com.fih.study</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
由于依赖在parent都引入了,所以只需引入api即可。
demo-api 只需定义会重用的api接口以及对应的dto/vo即可,如:
provider需实现api提供服务,代码如下:
注解使用的是@DubboService(version = "1.0.0")
,在老版本中是dubbo下的service。
启动类DubboProviderApplication中再加上注解@DubboComponentScan(basePackages = "com.fih.study.dubboprovider.provider")
application.properties配置:
server.port=9001
dubbo.application.id=dubo-study-provider
dubbo.application.name=dubo-study-provider
dubbo.registry.address=zookeeper://172.27.253.114:2181
dubbo.registry.protocol=zookeeper
dubbo.registry.timeout=10000
dubbo.protocol.name=dubbo
更多注解则需后续通过查阅文档根据需要添加或删除,然后启动服务,需注意的是dubbo.registry.timeout该配置是设置连接注册中心超时时间,默认为3s,但在我的环境下无法启动,改成10s后启动成功,控制台输出如图:
通过dubbo admin 可看到服务已注册成功,还可以通过测试按钮简单测试下功能是否正常。
服务消费者
consumer 的pom.xml跟provider基本一样,引入了spring-boot-starter-web。
主要代码:
package com.fih.study.dubboconsumer.controller;
import com.fih.study.dubbodemoapi.api.HelloWorldApi;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@DubboReference(version = "1.0.0")
private HelloWorldApi helloWorldApi;
@GetMapping("/hello")
public String hello(String name) {
return helloWorldApi.sayHello(name);
}
}
application.properties配置也基本相同
server.port=9002
dubbo.application.id=dubbo-study-consumer
dubbo.application.name=dubbo-study-consumer
dubbo.registry.address=zookeeper://172.27.253.114:2181
dubbo.registry.protocol=zookeeper
dubbo.registry.timeout=10000
dubbo.protocol.name=dubbo
启动服务,调用接口,输出正常,
至此,此次demo已完成,后续学习将基于demo逐渐深入。其实 官方是有提供dubbo的示例代码,dubbo-sample,只是有点多,对于刚开始准备学习dubbo和搭建简单demo反而无从下手,不知道怎么看,再者因为习惯了用springboot搭建项目,所以就自己尝试下了,边找资料,边尝试,大部分也是参考其余博客做的,只是每个人遇到的问题也不一样,所以还是记录下自己的步骤好了。
完整代码