我正在参加「启航计划」

一、什么是Dubbo?

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

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

Dubbo官网

☁️基本概念

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

服务供给者(Provider):露出服务的服务供给方,服务供给者在发动时,向注册中心注册自己供给的服务。

服务顾客(Consumer): 调用长途服务的服务消费方,服务顾客在发动时,向注册中心订阅自己所需的服务,服务顾客,从供给者地址列表中,根据软负载均衡算法,选一台供给者进行调用,假如调用失利,再选另一台调用。

注册中心(Registry):注册中心返回服务供给者地址列表给顾客,假如有改变,注册中心将根据长衔接推送改变数据给顾客

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

❄️Dubbo的服务供给者与服务顾客的调用关系

  1. 服务容器发动,加载,运行服务供给者
  2. 服务供给者在发动时,向注册中心注册自己供给的服务
  3. 服务顾客在发动时,向注册中心订阅自己需求的服务
  4. 注册中心返回服务供给者地址列表给服务顾客,假如有改变,注册中心将根据长衔接推送改变数据给服务顾客
  5. 服务顾客,从服务供给者地址列表中,根据软负载均衡算法,选一台服务供给者进行调用,假如调用失利,再选另一台调用
  6. 服务顾客和服务供给者,再内存中累计调用次数和调用时刻,定时每分钟发送一次统计数据到监控中心

二、什么是RPC?

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

☎️RPC基本原理

示意图

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

具体版本

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

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

三、Dubbo的特色及优点

Apache Dubbo |db| 供给了六大中心才能:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务主动注册和发现,高度可扩展才能,运行期流量调度,可视化的服务治理与运维。

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

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

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

下载 压缩包格式的zookeeper

将下载的文件解压缩

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

✅发动Zookeeper

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

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

假如报错提示 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采用前后端别离的形式办理项目

爬取文件如下

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

♨️布置dubbo-admin-server

运行后端项目有必要发动 zookeeper,不然发动失利

cmd窗口进入dubbo-admin-server,履行以下指令

mvn clean package

打包布置项目

在这里等大约5分钟左右即可布置完结

布置完结后生成target目录

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

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

发动成功

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

Ⓜ️进入Dubbo办理控制台

拜访前端生成的本地地址

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

默认用户名密码均为root

输入即可登录成功

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

✈️踩坑记载

后端的地址有必要和前端工程vue.config.js下的target途径相同,不然404!

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

七、SpringBoot 整合Dubbo + Zookeeper

✉️项目简介

根据SpringBoot项目整合Dubbo + Zookeeper 完成顾客消费服务供给者的服务

顾客为订单模块,传入用户id去查询用户模块的用户信息,完成长途RPC调用服务,分布式调用,而不是单体架构

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

♻️项目结构图

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

  1. 父工程:dubbo-boot
  2. 公共API(接口及实体类):GmallPublicInterafce
  3. 服务供给者:UserServiceProvider
  4. 服务顾客:OrderServiceConsumer

⏰效果图

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

✴️中心源码

父级工程 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
# 装备Dubbo
dubbo:
  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;
@Service
public 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
# 装备Dubbo
dubbo:
  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
 */
@Service
public 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 终结者】❤️❤️❤️,我将会给你带来巨大的【收成与惊喜】!