Dubbo应用开发之基于Dubbo协议的springboot规范性开发
Dubbo协议简介
-
Dubbo的默认协议,⾃⼰定义的私有协议,基于TCP层,默认的通信⽅式是Netty4
-
Dubbo采⽤单⼀⻓连接和 NIO 异步通讯,适合于⼩数据量⼤并发的服务调⽤。反之,Dubbo 缺省协议不适合传送⼤数据量的服务,⽐如传⽂件,传视频等
客户端传输数据的流程

Dubbo协议帧的组成
| 区域 | 长度 | 字段 | 位级说明 |
|---|---|---|---|
| Header | 2 B | Magic | 0xda 0xbb(固定) |
| 1 B | Flag | 高 4 位=SerializationId;低 4 位=Req/Res+TwoWay+Event | |
| 1 B | Status | 只在响应帧有效,200=20,500=90... | |
| 8 B | Request Id | Long 大端,异步匹配用 | |
| 4 B | Data Length | 消息体字节数(不含头) | |
| Body | N B | Payload | 由 SerializationId 指定的序列化器填充 |
Status状态码
| 码值 | 含义 |
|---|---|
| 20 | OK |
| 30 | CLIENT_TIMEOUT |
| 31 | SERVER_TIMEOUT |
| 40 | BAD_REQUEST |
| 50 | BAD_RESPONSE |
| 60 | SERVICE_NOT_FOUND |
| 70 | SERVICE_ERROR |
| 80 | SERVER_ERROR |
| 90 | CLIENT_ERROR |
| 100 | THREADPOOL_EXHAUSTED |
注册中心的作用
在使用Dubbo的过程中,客户端调用服务端集群需要先通过注册中心拉取服务列表.在代码中也不需要写那一段繁琐的配置调用地址,现阶段主要是用来简化开发中的配置.
这里我们选择的注册中心为zookeeper,选择3.6.1的版本

下载地址: https://archive.apache.org/dist/zookeeper/zookeeper-3.6.1/
直接下载第一个apache-zookeeper-3.6.1-bin.tar.gz ,解压即可使用
进入目录中的conf下修改zoo_sample.cfg为zoo.cfg
修改zoo.cfg文件,可以看到有一个dataDir的属性.这个是zookeeper的存储树状结构的临时目录,我们需要创建一个数据目录并且将目录位置进行配置D:\DevApp\apache-zookeeper-3.6.1-bin\data,这里我创建的data目录和conf同级,然后修改dataDir的属性
启动服务端
bin/zkServer.sh start (如果没有设置JavaHome环境会启动报错!)
bin/zkServer.sh stop
bin/zkServer.sh status
启动客户端
bin/zkCli.sh
启动成功

可以下载一个zookeeper的图形化管理界面工具 https://github.com/vran-dev/PrettyZoo/releases/tag/v2.1.1,我这里是直接下载的win的版本.

基于SpringBoot规范性开发
这次我们将从最开始的父工程开始创建,不使用springboot作为我们的父工程依赖
重新创建新项目dubbo-protocol-demo
dubbo-protocol-demo作为我们整个项目的父工程,也作为我们依赖管理的工具
pom.xml
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hust</groupId>
<artifactId>dubbo-protocol-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-protocol-api</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 这里定义好dubbo和springboot的版本 -->
<dubbo.version>3.2.0</dubbo.version>
<spring-boot.version>2.7.12</spring-boot.version>
</properties>
<!-- 自动获取下面定义的版本 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 定义了子类继承的版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
到这里父工程的开发就已经完成了,下面开始api模块的开发
创建子模块dubbo-protocol-api
创建一个com.hust.service.UserService,定义一个登录的接口
java
package com.hust.service;
public interface UserService {
Boolean login(String username, String password);
}
创建子模块记得指定父工程为dubbo-protcol-demo
创建子模块dubbo-protocol-provider
pom.xml
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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hust</groupId>
<artifactId>dubbo-protocol-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>dubbo-protocol-provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.hust</groupId>
<artifactId>dubbo-protocol-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
将dubbo-protocol-api作为依赖添加进来,然后实现api模块的UserService方法
com.hust.service.impl.UserServiceImpl
java
package com.hust.service.Impl;
import com.hust.service.UserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class UserServiceImpl implements UserService {
@Override
public Boolean login(String username, String password) {
System.out.println("用户名:" + username + " 密码:" + password);
return false;
}
}
增加服务启动类
ProviderApplication.java
java
package com.hust;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
创建springboot配置文件
application.yml
yml
spring:
application:
name: dubbo-protocol-provider
dubbo:
protocol:
name: dubbo
port: -1
# 指定注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
启动服务后如下图,可以在zookeeper的图形化管理界面找到这个服务,说明服务已经注册到了zookeeper中.

创建子模块dubbo-protocol-consumer
引入依赖pom.xml
还是只需要引入api模块
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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hust</groupId>
<artifactId>dubbo-protocol-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>dubbo-protocol-cunsumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.hust</groupId>
<artifactId>dubbo-protocol-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
创建springboot配置文件
application.yml
yml
spring:
application:
name: dubbo-protocol-consumer
dubbo:
# 指定注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
这里只需要指定注册中心地址即可
创建主启动类
ConsumerApplication.java
java
package com.hust;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
创建测试类
java
import com.hust.ConsumerApplication;
import com.hust.service.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = ConsumerApplication.class)
public class TestDubbo {
@DubboReference
private UserService userService;
@Test
public void testDubbo() {
System.out.println(userService.login("admin", "11111"));
}
}
调用成功

以上就是在基于springboot的Dubbo使用中引入注册中心的完整开发流程