超简单,手把手教你搭建Dubbo工程(内附源码)

系列文章目录

【建议收藏】精通Dubbo的SPI机制,一文即可
面试Dubbo ,却问我和Springcloud有什么区别?



前言

今天又是手把手教程的一篇————手把手教你搭建Dubbo项目,边搭建边教,一共两种模式的工程,文中还有工程源码压缩包,也欢迎下载

📕作者简介:战斧,多年开发及管理经验,爱好广泛,致力于创作更多高质量内容
📗本文收录于 Dubbo专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 RabbitMQSpring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待


一、本地调用工程

1. 本地模型介绍

我们首先看Dubbo的宏观模型
在这里插入图片描述

我们不难看出,Dubbo至少有 服务提供者服务消费者注册中心 三个部件,但是其实我们可以先不引入额外的注册中心,只在本地进行调用,Dubbo提供了本地调用的功能,即同一个JVM进程内进行的Dubbo服务调用,且在2.2.0 后默认为所有的服务都进行本地暴露,其模型如下:
在这里插入图片描述

那么我们可以创建这样一个工程,其中分为两个模块,一个api模块负责定义接口,一个service模块负责实现服务提供方 和 服务消费者的代码,工程如下图,我已经上传本工程,可以 点此下载
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

2. 工程分析

首先要做的就是确定版本了,因为是验证形的工程,所以选用的是最新的稳定版dubbo3.1.8,配合spring-boot2.7.10

<?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>
    <groupId>com.zhanfu.dubbo</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>demo</name>
    <description>Dubbo Demo</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <dubbo.version>3.1.8</dubbo.version>
        <spring-boot.version>2.7.10</spring-boot.version>
    </properties>

    <modules>
        <module>demo-api</module>
        <module>demo-service</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-zookeeper</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.zhanfu.dubbo</groupId>
                <artifactId>demo-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.zhanfu.dubbo</groupId>
                <artifactId>demo-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

我们先定义一下API了,就是写一个接口,非常简单

package com.zhanfu.dubbo.demo.dubbo.api;

public interface DemoService {
    String sayHello(String name);
}

接下来写实现类,这里的关键就是,在该实现类上加上 @DubboService 注解

package com.zhanfu.dubbo.demo.dubbo.service;

import com.zhanfu.dubbo.demo.dubbo.api.DemoService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "你好啊, " + name;
    }
}

然后写消费者,在消费者里引用API,并写上 @DubboReference 注解。此处的 @Component 注解和实现 CommandLineRunner 接口是为了让其在Springboot 工程内被发现,和自动执行

package com.zhanfu.dubbo.demo.dubbo.consumer;

import com.zhanfu.dubbo.demo.dubbo.api.DemoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Consumer implements CommandLineRunner {
    @DubboReference
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {

        String result = demoService.sayHello("战斧");
        System.out.println("收到消息:" + result);
    }
}

接着别忘了写工程的启动类,注意启动类上的注解:@EnableDubbo

package com.zhanfu.dubbo.demo;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

最后写上配置类 application.properties

# 设置dubbo传输协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# Dubbo 应用名
dubbo.application.name=DemoApplication
dubbo.application.logger=slf4j

3. 启动验证

点击启动类进行启动
在这里插入图片描述

工程成功启动,且消费者本地调用成功

在这里插入图片描述


二、RPC工程

1. ZK 安装

在这里插入图片描述
要想进行RPC的功能,我们必须得先弄好注册中心,这里选取Zookeeper作为我们的注册中心,如果你的环境已经有zk,可跳出此步骤。如果没有,你可以 点击此处 进入具体安装的教程,安装完成后记得启动

2. 工程分析

消费者与实现类代码其实同单机一样,只是需要把服务提供者和消费者拆开,拆成不同的模块单独启动,这里拆到了client和server两个模块,点此下载 其工程压缩包
在这里插入图片描述

然后再写两个模块的配置文件,服务端要加入注册中心地址,然后先启动,其配置如下

# Dubbo 应用名
dubbo.application.name=DubboServer
dubbo.application.logger=slf4j
# 设置dubbo传输协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=zookeeper://127.0.0.1:2181

消费者的配置如下,因为qos默认端口22222已经被服务端占用,所以消费端定义成了22223

# Dubbo 应用名
dubbo.application.name=DubboClient
dubbo.application.logger=slf4j
# 服务质量端口
dubbo.application.qos-port=22223
# 设置dubbo传输协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.registry.address=zookeeper://127.0.0.1:2181

3. 启动验证

先启动server,然后再启动client,观察其输出
在这里插入图片描述

效果符合预期,我们再进入ZKUI看看现在Zookeeper的情况,可以看到接口已经注册到Zk,消费者和提供者也注册成功
在这里插入图片描述

三、总结

本次,我们学习了两种dubbo的调用模式 ———— RPC和本地调用,也初步接触到了几个关键注解,如

  • @EnableDubbo
  • @DubboReference
  • @DubboService

但现在我们还没有解释这些注解的作用和其原理,以及 Dubbo 是如何和 Spring 框架相辅相成的。别急,这些内容将在后面的博文仔细为你解答

  • 34
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
### 回答1: 回答:Dubbo的调用流程主要包括:服务提供方、服务消费方和注册中心三部分组成。其中,服务提供方向注册中心注册服务,服务消费方通过注册中心发现服务并向服务提供方发起调用;服务提供方收到调用请求后,通过调用服务提供者实现服务,并将结果返回给服务消费方。可以参考以下源码解读:http://www.sohu.com/a/242295322_465833。 ### 回答2: Dubbo的调用流程分为三个阶段:服务导出、服务引用和远程调用。下面我将结合源码解读这三个阶段的具体流程。 首先是服务导出阶段。当服务提供者启动时,Dubbo会解析@Service注解,生成ServiceBean对象。然后,Dubbo会调用Protocol的export方法,将ServiceBean暴露成一个Invoker对象,该对象持有ServiceBean的引用和一系列的过滤器链。接着,Dubbo会通过Exporter对象,将Invoker注册到注册中心。最后,Dubbo会根据配置选择合适的Server实现,启动Server并监听服务端口。 接下来是服务引用阶段。当服务消费者启动时,Dubbo会解析@Reference注解,生成ReferenceBean对象。然后,Dubbo会调用ReferenceConfig的get方法,根据配置从注册中心获取服务提供者的Invoker对象。接着,Dubbo会通过Protocol的refer方法,将Invoker封装成一个代理对象,并返回给业务逻辑,实现远程调用。 最后是远程调用阶段。当业务代码调用代理对象的方法时,Dubbo会通过Invocation对象封装方法调用的相关信息。然后,Dubbo会根据服务的URL信息选择合适的InvocationHandler,发起远程调用。在InvocationHandler中,Dubbo会对请求进行编码、协议适配和消息传输,最终将请求发送给服务提供者。服务提供者接收到请求后,会根据请求内容执行相应的服务逻辑,并返回结果。最后,Dubbo会将结果进行解码、协议适配和消息传输,将结果返回给服务消费者。 通过源码解读可以看出,Dubbo的调用流程主要包括服务导出、服务引用和远程调用三个阶段,并且每个阶段都有一系列的类和方法来协调和处理相应的任务。这样的设计使得Dubbo具备了高度的扩展性和灵活性,能够支持不同的协议和中间件,并提供了一系列的配置选项,满足不同场景下的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战斧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值