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

SpringBoot集成Dubbo

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 复制代码
<?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:

java 复制代码
@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接口:

java 复制代码
public interface UserDubboService {
    List<User> findAll();

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

提供服务接口:

@DubboService:

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

java 复制代码
// 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文件:

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 复制代码
<?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 容器启动时,自动注入远程服务的代理对象,使得消费者可以像调用本地方法一样调用远程服务。

java 复制代码
@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文件

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

pom文件

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 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相关注解

相关推荐
南雨北斗7 分钟前
php 图片压缩函数
后端
L2ncE7 分钟前
ES101系列08 | 数据建模和索引重建
java·后端·elasticsearch
还是鼠鼠14 分钟前
Maven---配置本地仓库
java·开发语言·后端·maven
无问81718 分钟前
SpringBoot:统一功能处理、拦截器、适配器模式
spring boot·后端·适配器模式
一只叫煤球的猫1 小时前
MySQL虚拟列:一个被低估的MySQL特性
数据库·后端·mysql
前端snow1 小时前
项目密码加密你是选择bcrypt还是crypto
前端·后端
G探险者1 小时前
Jackson 数值转科学计数法问题分析与解决方案
后端
想用offer打牌1 小时前
一站式了解BASE理论
后端·面试·架构
白日依山尽yy1 小时前
MyBatis03——SpringBoot整合MyBatis
spring boot·后端·mybatis
熬夜苦读学习2 小时前
日志与策略模式
linux·运维·开发语言·后端·策略模式