写点什么

Spring Boot 整合 Dubbo + Zookeeper 实现分布式 消费者与服务者的业务调用

作者:Bug终结者
  • 2022 年 4 月 04 日
  • 本文字数:6750 字

    阅读完需:约 22 分钟

Spring Boot 整合Dubbo + Zookeeper 实现分布式 消费者与服务者的业务调用

一、什么是 Dubbo?

Dubbo 是阿里出品的分布式开源服务框架,阿里已交予 Apache 开源组织基金会


Apache Dubbo 是一款高性能轻量级开源 RPC 服务框架


Dubbo官网

☁️基本概念


服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。


服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。


注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者


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

❄️Dubbo 的服务提供者与服务消费者的调用关系

  1. 服务容器启动,加载,运行服务提供者

  2. 服务提供者在启动时,向注册中心注册自己提供的服务

  3. 服务消费者在启动时,向注册中心订阅自己需要的服务

  4. 注册中心返回服务提供者地址列表给服务消费者,如果有变更,注册中心将基于长连接推送变更数据给服务消费者

  5. 服务消费者,从服务提供者地址列表中,基于软负载均衡算法,选一台服务提供者进行调用,如果调用失败,再选另一台调用

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

二、什么是 RPC?

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

☎️RPC 基本原理

示意图



详细版本



RPC 两个核心模块:序列化和通讯

三、Dubbo 的特点及好处

Apache Dubbo |ˈdʌbəʊ| 提供了六大核心能力:面向接口代理的高性能 RPC 调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。



Dubbo 的注册中心


Dubbo的注册中心有很多种,但官方推荐使用Zookeeper,其余有Redis、Multicast、Simple注册中心。
复制代码


Dubbo 网络通信框架


Dubbo 默认使用 Netty 框架,也是推荐的选择,另外内容还集成有Mina、Grizzly。
复制代码

四、Zookeeper 是什么?

顾名思义 zookeeper 就是动物园管理员,他是用来管 hadoop(大象)、Hive(蜜蜂)、pig(小 猪)的管理员, Apache Hbase 和 Apache Solr 的分布式集群都用到了 zookeeper;Zookeeper: 是一个分布式的、开源的程序协调服务,是 hadoop 项目下的一个子项目。他提供的主要功 能包括:配置管理、名字服务、分布式锁、集群管理。

五、搭建 Zookeeper 注册中心

♻️安装 Zookeeper

访问 Zookeeper 官网下载


下载Zookeeper



下载 压缩包格式的 zookeeper


将下载的文件解压缩


✅启动 Zookeeper

从 cmd 窗口进入 Zookeeper 文件夹下的 bin 目录,执行 zkServer.cmd 启动



如果报错提示 zoo.cfg 缺失,那就进入 zookeeper 的 conf 文件夹下将 zoo_sample.cfg 复制一份改名为 zoo.cfg 即可


再次重启则成功

六、搭建 Dubbo 管理控制台

✒️克隆 dubbo-admin 项目

从 github 打开项目 dubbo-admin


dubbo-admin


从 GitHub 爬取项目教程如下:


使用 Git爬取 GitEE、GitLab、GitHub项目的教程

✅运行 dubbo-admin

dubbo-admin 采用前后端分离的形式管理项目


爬取文件如下


♨️部署 dubbo-admin-server

运行后端项目必须启动 zookeeper,否则启动失败


cmd 窗口进入 dubbo-admin-server,执行以下命令


mvn clean package
复制代码


打包部署项目


在这里等大概 5 分钟左右即可部署完成


部署完成后生成 target 目录



cmd 窗口进入 target 目录执行以下命令


java -jar dubbo-admin-server-0.4.0.jar
复制代码


后端项目运行成功~

♨️部署 dubbo-admin-ui

在这里需要有 node 环境


教程如下


GitHub爬取项目并部署前端工程


cmd 窗口进入 dubbo-admin-ui,执行以下命令下载依赖


npm install
复制代码


下载完毕后,执行启动命令


npm run dev
复制代码


启动成功


Ⓜ️进入 Dubbo 管理控制台

访问前端生成的本地地址



默认用户名密码均为 root


输入即可登录成功


✈️踩坑记录

后端的地址必须和前端工程 vue.config.js 下的 target 路径一样,否则 404!


七、SpringBoot 整合 Dubbo + Zookeeper

✉️项目简介

基于 SpringBoot 项目整合 Dubbo + Zookeeper 实现消费者消费服务提供者的服务


消费者为订单模块,传入用户 id 去查询用户模块的用户信息,实现远程 RPC 调用服务,分布式调用,而不是单体架构


服务提供者为用户模块,返回用户信息

♻️项目结构图


  1. 父工程:dubbo-boot

  2. 公共 API(接口及实体类):GmallPublicInterafce

  3. 服务提供者:UserServiceProvider

  4. 服务消费者:OrderServiceConsumer

⏰效果图

✴️核心源码

🚃父级工程 dubbo-boot

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>
<!-- 整体引入springboot工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<groupId>org.example</groupId> <artifactId>dubbo-boot</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <!-- 子模块 --> <modules> <module>GmallPublicInterface</module> <module>UserServiceProvider</module> <module>OrderServiceConsumer</module> </modules>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
</project>
复制代码

🚃公共 API 模块 GmallPublicInterface

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>dubbo-boot</artifactId>        <groupId>org.example</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>GmallPublicInterface</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencies> <!-- 引入dubbo --> <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency>
<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency> </dependencies>
</project>
复制代码


还有一些核心的接口及实体类

🚃服务提供者模块 UserServiceProvider

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>dubbo-boot</artifactId>        <groupId>org.example</groupId>        <version>1.0-SNAPSHOT</version>    </parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>UserServiceProvider</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>

<dependencies>
<dependency> <groupId>org.example</groupId> <artifactId>GmallPublicInterface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>



</dependencies>

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>libs/</directory> <targetPath>libs</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> </resources> </build>

</project>
复制代码


application.yml


# 配置端口号server:  port: 8084# 配置Dubbodubbo:  application:    name: UserServiceProvider  registry:    address: zookeeper://127.0.0.1:2181  protocol:    name: dubbo    port: 20881  monitor:    protocol: registry  consumer:    timeout: 2000
复制代码


UserServiceImpl


package com.wanshi.service.impl;
import com.alibaba.dubbo.config.annotation.Service;import com.wanshi.bean.UserAddress;import com.wanshi.service.UserService;
import java.util.Arrays;import java.util.List;
@Servicepublic class UserServiceImpl implements UserService {
@Override public List<UserAddress> getUserAddressList(String userId) { System.out.println("UserServiceImpl.....old..."); // TODO Auto-generated method stub UserAddress address1 = new UserAddress(1, "北京市朝阳区", "1", "Bug 终结者", "010-5625321", "Y"); UserAddress address2 = new UserAddress(2, "北京市海淀区", "1", "小王", "010-66253834", "N"); return Arrays.asList(address1,address2); }
}
复制代码

🚃服务消费者模块 OrderServiceConsumer

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>dubbo-boot</artifactId>        <groupId>org.example</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>
<artifactId>OrderServiceConsumer</artifactId>
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties>
<dependencies>
<dependency> <groupId>org.example</groupId> <artifactId>GmallPublicInterface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>libs/</directory> <targetPath>libs</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> </resources> </build>
</project>
复制代码


application.yml


# 配置端口server:  port: 8085
# 配置Dubbodubbo: application: name: OrderServiceConsumer registry: address: zookeeper://127.0.0.1:2181 monitor: protocol: registry consumer: check: false
复制代码


OrderController


package com.wanshi.gmall.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;import com.alibaba.dubbo.validation.MethodValidated;import com.wanshi.bean.UserAddress;import com.wanshi.service.OrderService;import com.wanshi.service.UserService;import org.springframework.stereotype.Service;
import java.util.List;
/** * 1.将服务提供者注册到注册中心 (暴露服务) * 1). 导入 dubbo 依赖 2.6.2、引入操作zookeeper的客户端 * 2). 配置服务提供者 * * 2.让服务消费者去注册中心订阅服务提供者的服务地址 * @author whc */@Servicepublic class OrderServiceImpl implements OrderService {
@Reference UserService userService;
@Override public List<UserAddress> initOrder(String userId) { //1. 查询用户的收货地址 List<UserAddress> userAddressList = userService.getUserAddressList(userId); System.out.println("用户id:" + userId); userAddressList.forEach(user -> { System.out.println(user.getUserAddress()); }); return userAddressList; }}
复制代码

📜代码下载

Spring Boot 整合 Dubbo + Zookeeper 实现服务者与消费者的数据调用

♨️往期精彩热文回顾

✈️ 3分钟带你搞懂Vue双向绑定原理及问题剖析

✈️ Netty进阶 -- WebSocket长连接开发

✈️ Netty进阶 -- 非阻塞网络编程 实现群聊+私聊+心跳检测系统

✈️ Postman测试工具调试接口详细教程【向后端发送Json数据并接收返回的Json结果】

✈️ Java面向对象 --- 吃货联盟订餐系统(完整版)

✈️ 一分钟教你快速 搭建Vue脚手架(Vue-Cli)项目并整合ElementUI

⛵小结

以上就是【Bug 终结者】对 Spring Boot 整合 Dubbo + Zookeeper 实现分布式 消费者与服务者简单的概述,Spring Boot 项目聚合 Dubbo,目前是企业很常用的技术,多多练习,SpringBoot 整合 Dubbo 实现分布式开发不在话下,一些细节之处要注意,细心做事,方可实现目标,从细节出发,不断挑战自己,迎接一个崭新的自己!


如果这篇【文章】有帮助到你,希望可以给【Bug 终结者】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【Bug 终结者】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

发布于: 2022 年 04 月 04 日阅读数: 20
用户头像

Bug终结者

关注

励志成为一个优秀的开发者~ 2021.12.09 加入

星星之火,可以燎原

评论

发布
暂无评论
Spring Boot 整合Dubbo + Zookeeper 实现分布式 消费者与服务者的业务调用_Java_Bug终结者_InfoQ写作平台