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的版本

下载地址: archive.apache.org/dist/zookee...

直接下载第一个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的图形化管理界面工具 github.com/vran-dev/Pr....

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

相关推荐
ZePingPingZe7 小时前
深入理解网络模型之Spring Cloud微服务通信、Socket、HTTP与RPC
网络协议·spring cloud·rpc·dubbo
量子炒饭大师7 小时前
【C++入门】面向对象编程的基石——【类与对象】基础概念篇
java·c++·dubbo·类与对象·空指针规则
信创天地17 小时前
信创场景软件兼容性测试实战:适配国产软硬件生态,破解运行故障难题
人工智能·开源·dubbo·运维开发·risc-v
信创天地1 天前
信创日志全流程管控:ELK国产化版本与华为日志服务实战应用
运维·安全·elk·华为·rabbitmq·dubbo
量子炒饭大师1 天前
【C++入门】骇客数据面向对象的灵魂锚点——【类与对象】this指针篇
java·c++·dubbo·this·this指针
振华OPPO2 天前
开源高性能RPC框架:Apache Dubbo全览与实践指南
微服务·rpc·开源·apache·dubbo·总线
递归尽头是星辰3 天前
Dubbo vs OpenFeign:Spring Cloud Alibaba 生态下的 RPC 框架选型与迁移实战
dubbo·微服务架构·openfeign·微服务选型·rpc 框架·http 客户端
fo安方5 天前
软考~系统规划与管理师考试——真题篇——章节——第6章 云资源规划——解析版
dubbo·项目管理·系统·软考·pmp·规划
2401_882351525 天前
Flutter for OpenHarmony 商城App实战 - 购物车实现
java·flutter·dubbo
a努力。7 天前
中国电网Java面试被问:Dubbo的服务目录和路由链实现
java·开发语言·jvm·后端·面试·职场和发展·dubbo