1.Dubbo概念

1.1 duboo简介

Apache Dubbo 是一款高性能的JavaRPC框架,其前身是阿里巴巴公司开源的一个高性能、轻量级的开源RPC框架,可以和Spring框架无缝集成。

什么是RPC?

RPC全程为remote procedure call 即远程过程调用,比如两台服务器A和B ,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。

Dubbo提供了三大核心能力:面向接口的远程方法调用,只能容错和负载均衡,以及服务自动注册和发现。

1.2 Dubbo架构

节点角色说明

**Provider ** 暴露服务的服务提供方

Consumer 调用远程服务的服务消费方

Registry 服务注册与发现的注册中心

Monitor 统计服务的调用次数和调用时间的监控中心

**Container ** 服务运行容器

虚线都是异步访问,实线都是同步访问 蓝色虚线:在启动时完成的功能 红色虚线(实线)都是程序运行过程中执行的功能

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

2.Zookeeper 服务注册中心

通过前面的Dubbo架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用。Dubbo官方推荐使用Zookeeper作为服务注册中心。

2.1 Zokkeeper 介绍

Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。

为了便于理解Zookeeper的树型目录服务,我们先来看一下我们电脑的文件系统(也是一个树型目录结构):

image-20210628152457012 我的电脑可以分为多个盘符(例如C、D、E等),每个盘符下可以创建多个目录,每个目录下面可以创建文件,也可以创建子目录,最终构成了一个树型结构。通过这种树型结构的目录,我们可以将文件分门别类的进行存放,方便我们后期查找。而且磁盘上的每个文件都有一个唯一的访问路径,例如:C:\Windows\oeac\hello.txt。

Zookeeper树型目录服务:

  • 服务提供者(Provider)启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
  • 服务消费者(Consumer)启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心(Monitor)启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址

2.2 安装Zookeeper

下载地址:http://archive.apache.org/dist/zookeeper/ 本课程使用的Zookeeper版本为3.4.6,下载完成后可以获得名称为zookeeper-3.4.6.tar.gz的压缩文件。 安装步骤: 第一步:安装 jdk(略) 第二步:把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到 linux 系统 第三步:解压缩压缩包 ​ tar -zxvf zookeeper-3.4.6.tar.gz 第四步:进入zookeeper-3.4.6目录,创建data目录 ​ mkdir data 第五步:进入conf目录 ,把zoo_sample.cfg 改名为zoo.cfg ​ cd conf ​ mv zoo_sample.cfg zoo.cfg 第六步:打开zoo.cfg文件, 修改data属性:dataDir=/root/zookeeper-3.4.6/data

2.3 启动、停止Zookeeper

进入Zookeeper的bin目录,启动服务命令 ./zkServer.sh start

停止服务命令 ./zkServer.sh stop

查看服务状态: ./zkServer.sh status

3.Dubbo 快速入门

Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。

3.1 服务提供方开发

1.创建springboot工程dubbo-provider

2.配置POM文件

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>com.liu</groupId>
            <artifactId>dubbo-comms</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- dubbo的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>

        <!-- zk的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.6</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

3.创建服务接口

public interface UserService {
    public  String findName(String name);
}

4.创建服务实现类

import org.apache.dubbo.config.annotation.Service;

@Service
public class UserServiceImpl implements  UserService {

    @Override
    public String findName(String name) {
        return "姓名:"+name;
    }
}

注意:服务实现类上使用Service注解是Dubbo提供的,用于对外发布服务

4.YML配置

## 服务端口号
server:
  port: 8888
#应用名称
spring:
  application:
    name: dubbo_privder
dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181 # 注册中心地址
    port: 2181  
  protocol:  # 注册协议和port端口  默认是20880
    name: dubbo
    port: 20880
  scan: # 扫描指定包,加入@Service注解的类会被发布为服务 
    base-packages: com.liu.service  
  application:
    name: dubbo_privder

  consumer:
    check: false

3.2 消费服务

1. 创建工程dubbo-consumer

2.配置POM文件

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.liu</groupId>
            <artifactId>dubbo-comms</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- dubbo的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>

        <!-- zk的依赖 -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.6</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

3.创建消费类

@RestController
public class OrderController {

    @Reference
    private UserService userService;

    @RequestMapping("/findname")
    public String findName(String name){
        return userService.findName(name);
    }

}

注意:@Reference是Dubbo提供的

4.配置yaml文件

server:
  port: 8889

spring:
  application:
    name: dubbo_consumer
dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181
    port: 2181
  protocol:
    name: dubbo
    port: 20880
  application:
    name: dubbo_consumer

  consumer:
    check: false