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