Dubbo应用开发之基于Dubbo协议的springboot规范性开发

Dubbo应用开发之基于Dubbo协议的springboot规范性开发

Dubbo协议简介

  1. Dubbo的默认协议,⾃⼰定义的私有协议,基于TCP层,默认的通信⽅式是Netty4

  2. 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使用中引入注册中心的完整开发流程

相关推荐
码途进化论1 小时前
前端Docker多平台构建自动化实践
前端·javascript·后端
悟空码字1 小时前
SpringBoot 整合 RabbitMQ:和这只“兔子”交朋友
java·后端·rabbitmq
BingoGo2 小时前
万物皆字符串 PHP 中的原始类型偏执
后端·php
Carve_the_Code2 小时前
订单ID容量升级:从40位到64位的架构演进
后端
一粒麦仔2 小时前
物联网的低功耗守望者:全面解析Sigfox技术
后端·网络协议
Frank_zhou2 小时前
192_如何基于复杂的指针移动完成单向链表的入队?
后端
Frank_zhou2 小时前
03_ArrayList核心方法的原理
后端
HLeo2 小时前
一段代码演示初学者容易掉坑的“comptime 副作用陷阱”
后端
踏浪无痕2 小时前
乐观锁和悲观锁,到底该怎么选?
后端·面试·架构