当前位置: 首页 > article >正文

Dubbo集成SpringBoot实现远程服务调用

SpringBoot集成Dubbo

  • Dubbo介绍
    • 了解 Dubbo 核心概念和架构
    • dubbo特性
    • dubbo运行原理图
  • SpringBoot集成Dubbo技术实战
    • 一、Dubbo Spring Boot 版本关系
    • 二、引入Maven依赖
        • demo项目基础结构
        • 引入依赖
        • 创建每个模块
          • 1)api模块
          • 2)provider模块
          • 3)consumer模块

Dubbo介绍

Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。

官方文档:https://dubbo.apache.org/zh/index.html

了解 Dubbo 核心概念和架构

在这里插入图片描述

以上是 Dubbo 的工作原理图,从抽象架构上分为两层:服务治理抽象控制面 和 Dubbo 数据面 。

服务治理控制面。服务治理控制面不是特指如注册中心类的单个具体组件,而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控策略、Dubbo Admin 控制台等,如果采用了 Service Mesh 架构则还包含 Istio 等服务网格控制面。
Dubbo 数据面。数据面代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作。

服务消费者 (Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
服务提供者 (Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程
Dubbo 数据面
从数据面视角,Dubbo 帮助解决了微服务实践中的以下问题:

Dubbo 作为 服务开发框架 约束了微服务定义、开发与调用的规范,定义了服务治理流程及适配模式
Dubbo 作为 RPC 通信协议实现 解决服务间数据传输的编解码问题

dubbo特性

在这里插入图片描述

dubbo运行原理图

在这里插入图片描述
1)服务提供者(Provider)

提供服务给服务消费者的提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

2)服务消费者(Consumer)

通过向注册中心订阅自己所需要的服务,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用。总结来说就是拉取服务提供者进行调用服务。

3)注册中心

注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。官网仍然推荐使用zookeeper作为Dubbo的注册中心。

zookeeper官网下载地址

在这里插入图片描述
4)监控中心(Monitor)

服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

5)调用关系流程说明:

(1)服务容器负责启动,加载,运行服务提供者。
(2)服务提供者在启动时,向注册中心注册自己提供的服务。
(3)服务消费者在启动时,向注册中心订阅自己所需的服务。
(4)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(5)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
(6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

SpringBoot集成Dubbo技术实战

一、Dubbo Spring Boot 版本关系

在使用SpringBoot集成Dubbo进行分布式开发时候,合适的版本选择是非常重要的。
官方版本匹配关系地址:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/versions/

Dubbo 官方提供的 对应关系:
在这里插入图片描述

本文选用Dubbo版本3.0.12、JDK8 、SpringBoot2!!!

二、引入Maven依赖

demo项目基础结构

在这里插入图片描述

引入依赖

父级分别引入

  • dubbo集成springboot依赖
  • Zookeeper 客户端依赖
  • ZooKeeper的高级操作工具包
<?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>org.example</groupId>
    <artifactId>SpringBoot-Dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>api</module>
        <module>provider</module>
        <module>customer</module>
    </modules>
    <name>SpringBoot-Dubbo-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--dubbo集成springboot依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
          <version>3.0.12</version>
        </dependency>
        <!-- Zookeeper 客户端依赖 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.0</version>
        </dependency>
        <!-- ZooKeeper的高级操作工具包-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>

    <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>
        </dependencies>
    </dependencyManagement>

</project>


创建每个模块

总模块如图
在这里插入图片描述

1)api模块

model - >User:

@Data
@NoArgsConstructor
public class User implements Serializable {

    private Integer id;
    private String name;
    private String sex;
    private String age;

    public User(Integer id, String name, String sex, String age) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
}

UserDubboService api接口:

public interface UserDubboService {
    List<User> findAll();

    String sayHello(String name);
}
2)provider模块

提供服务接口:

@DubboService:
用于标记一个类为 Dubbo 服务提供者(Provider)。它的主要作用是在 Spring 容器启动时,将被注解的类注册为一个 Dubbo 服务,使其能够被其他 Dubbo 客户端(Consumer)发现和调用。

// org.apache.dubbo.config.annotation.DubboService直接
@DubboService
public class UserDubboServiceImpl implements UserDubboService {


    @Override
    public List<User> findAll() {

        LinkedList users = new LinkedList();
        User user = new User(1, "小明(来自消费者)", "男", "20");
        User user1 = new User(2, "小紅(来自消费者)", "女", "22");
        users.add(user);
        users.add(user1);
        return users;
    }

    @Override
    public String sayHello(String name) {
        return "hello,"+name;
    }
}

yml文件:

server:
  port: 8081
  #提供者模块
dubbo:
  application:
    name: dubbo-provider
  registry:
    address: zookeeper://127.0.0.1:2181 # zookeeper 注册中心地址
    protocol:
      name: dubbo
      port: 20880 # dubbo 协议端口,默认为20880

pom文件

<?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.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>SpringBoot-Dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

启动类

关键注解:
@DubboComponentScan 扫描 Dubbo相关注解

3)consumer模块

controller层

@DubboReference
它的主要作用是在 Spring 容器启动时,自动注入远程服务的代理对象,使得消费者可以像调用本地方法一样调用远程服务。

@RestController
@RequestMapping("/user")
public class TestController {

    @DubboReference
    private UserDubboService userDubboService;

    @RequestMapping("/findAll")
    public List<User> findAll(){
        return userDubboService.findAll();
    }

    @RequestMapping("sayHello")
    public String sayHello(String name){
        return userDubboService.sayHello(name);
    }

    @RequestMapping("hello/{name}")
    public String hello(@PathVariable String name){
        return "hello"+name;
    }
}

yml文件

server:
  port: 8002
#消费者模块
dubbo:
  application:
    name: dubbo-customer
  registry:
    address: zookeeper://127.0.0.1:2181 # zookeeper 注册中心地址

pom文件

<?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.example</groupId>
    <artifactId>customer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>customer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <parent>
        <groupId>org.example</groupId>
        <artifactId>SpringBoot-Dubbo-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

启动类

关键注解:
@DubboComponentScan 扫描 Dubbo相关注解


http://www.kler.cn/a/407079.html

相关文章:

  • 1-测试go-redis缓存数据
  • ROS机器视觉入门:从基础到人脸识别与目标检测
  • ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想
  • 【Python TensorFlow】进阶指南(续篇三)
  • HTML5 SVG
  • 智慧社区方案提升居民生活质量与管理效率的创新实践
  • Flink Transformation - 转换算子全面解析
  • YOLOv11融合针对去雾场景的DEA-Net中的细节增强注意力模块及相关改进思路
  • [C/C++][FFmpeg] 关于avcodec_send_frame(encoder_ctx, NULL) 的解释
  • 力扣-Hot100-图论【算法学习day.38】
  • 基于Java Springboot高校教务管理系统
  • 【编程题目】列表、元组及集合
  • 【话题】Bug 故事:跨时区的时间转换错误
  • python运动统计 2024年9月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
  • MySQL监控工具与性能分析方法:深入剖析与实践
  • MATLAB中Simulink的基础知识
  • 湖北某高校联合开源网安打造协同育人新范式,推动智能网联汽车行业可持续发展
  • _FYAW智能显示控制仪表的简单使用_串口通信
  • Java中的类加载器
  • 【Linux课程学习】:命令行参数,环境变量
  • 【Python系列】 Base64 编码:使用`base64`模块
  • 爬虫实战:从HTTP请求获取数据解析社区
  • Vscode进行Java开发环境搭建
  • win10 禁止更新
  • 【大语言模型】ACL2024论文-17 VIDEO-CSR:面向视觉-语言模型的复杂视频摘要创建
  • React第七节 组件三大属性之 refs 的用法注意事项