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

相关推荐
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园1 小时前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
wm10432 小时前
java web springboot
java·spring boot·后端
龙少95433 小时前
【深入理解@EnableCaching】
java·后端·spring
溟洵5 小时前
Linux下学【MySQL】表中插入和查询的进阶操作(配实操图和SQL语句通俗易懂)
linux·运维·数据库·后端·sql·mysql
SomeB1oody8 小时前
【Rust自学】6.1. 定义枚举
开发语言·后端·rust
SomeB1oody8 小时前
【Rust自学】5.3. struct的方法(Method)
开发语言·后端·rust
路在脚下@9 小时前
spring boot的配置文件属性注入到类的静态属性
java·spring boot·sql
啦啦右一9 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring