给他人解释什么是dubbo

小小最近开始学习dubbo了,这次进行相关的学习。

简介

思维导图如下

什么是Dubbo

dubbo 是一款高性能的分布式服务框架,高性能的,透明化的RPC远程调用方案,SOA服务治理方案,与Spring 体系同时并驾崎岖于Java体系生态中。
每天为上千个服务提供,使用以及应用。
在上方的词语中,出现了,分布式服务,RPC远程调用执行方案,SOA服务治理方案,这里对这几个词语进行依次解释。

分布式服务 包含,服务注册中心和服务治理中心,对微服务进行有效的治理。

RPC 远程调用方案 RPC为一种通信方式,用于进行远程通信。

SOA服务治理 一种面向服务的体系架构。

YRgHpQ.png
dubbo的logo

Dubbo的由来

网站需要由单一的架构演化到分布式架构,以及流动计算架构,如图所示。
YRgLXn.png
网站演化图
在上图中,网站由最初的一个应用,即单一应用架构,由jsp,hibernate等逐步应用,当流量变大时,逐步发展到垂直应用架构,对机器进行拆分,拆分出多个,用F5等应用,进行负载均衡,流量越来越大,进行分布式服务架构,此时,应用之间交互相当复杂,把核心的抽取出来,使用RPC进行远程调用。流量达到越来越大,此时,增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率,即资源调度与治理,即SOA。

在整个过程中,逐步的衍生出了一些问题,需要解决以下的问题。
1 依赖管理,服务逐渐的变的更加的多,服务的URL配置变的更加的艰难,负债均衡保持单点的压力相当的大,此时需要注册中心,管理相关的依赖管理,以及服务注册等。
2 路由透明,服务的注册,由原先的手动,变成了自动化,这里全部依赖于路由透明。
3 服务治理,当单一节点出现故障的时候,链路出现血崩的时候,如何治理服务。这里需要服务治理。对微服务进行相关的治理。

由此Dubbo应生而出,提供了以上问题的解决方案。

Dubbo的主要应用

dubbo主要应用于中大型应用,主要解决中大型应用的各种疑难问题。即分布式应用架构。

Dubbo 架构

核心 生产者与消费者问题

Dubbo 对应于计算机核心知识的生产者与消费者的问题
生产者与消费者是经典的并发协助的经典问题,该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
YRgv7V.png
Dubbo的核心应用为生产者与消费者问题

节点调用关系

YR2StU.png
此时节点调用关系如上所示

调用关系说明

  1. 服务提供者启动时,向注册中心注册自己的服务。
  2. 消费者启动时候,注册中心订阅自己的服务。
  3. 注册中心返回地址列表给消费者。
  4. 服务消费者,从地址中,获取进行调用。
  5. 服务消费者和提供者,用于每隔一段时间,统计数据到监控中心。

特点

具有以下的特点,连通性,健壮性,伸缩性和升级性。
连通性指注册中心负责注册与查找。监控中心负责进行相关的统计,注册中心和其余服务都是连通的,监控中心与其他服务也是连通的。
健壮性指,监控中心宕机的时候,其余应用也可使用。
伸缩性,可以动态的部署集群。
升级性,未来可以进行逐步的升级。

第一个项目 Hello World

zookeeper 节点安装

这里安装zk节点。使用docker镜像安装

PS C:\Users\Administrator\Desktop\试写参考>  docker pull zookeeper:3.5
3.5: Pulling from library/zookeeper
afb6ec6fdc1c: Pull complete
ee19e84e8bd1: Pull complete
6ac787417531: Pull complete
f3f781d4d83e: Pull complete
424c9e43d19a: Pull complete
f0929561e8a7: Pull complete
f1cf0c087cb3: Pull complete
2f47bb4dd07a: Pull complete
Digest: sha256:883b014b6535574503bda8fc6a7430ba009c0273242f86d401095689652e5731
Status: Downloaded newer image for zookeeper:3.5
docker.io/library/zookeeper:3.5
PS C:\Users\Administrator\Desktop\试写参考>
PS C:\Users\Administrator\Desktop\试写参考> docker create --name zddk -p 2181:2181 zookeeper:3.5
15b27748e07dc6cf44ca7943c49f9881e6d488a7cc5c61bfc5d3170a58321ff9
PS C:\Users\Administrator\Desktop\试写参考> docker start zk
zk
PS C:\Users\Administrator\Desktop\试写参考> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                  NAMES
d3eb0b087850        zookeeper           "/docker-entrypoint.…"   2 weeks ago         Up 22 seconds       2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp   zk
PS C:\Users\Administrator\Desktop\试写参考>

先拉取镜像,再创建相关的容器,最后启动docker容器。

编写服务提供方

YR2ic9.png
选择新的maven工程

创建工程目录如下
YR2FXR.png

添加服务提供方
YR2V76.png

添加相关依赖

<?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>untitled9</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-dubbo</artifactId>

    <dependencies>
        <!--添加SpringBoot测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <!--添加dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.4</version>
        </dependency>
    </dependencies>
</project>

创建User对象

package com.ming.pojo;

import java.io.Serial;
import java.io.Serializable;

// 使用dubbo要求传输的对象必须实现序列化接口
public class User implements Serializable {
    private static final long serialversionUID = -809897897879L;

    private Long id;

    private String username;

    private String password;

    private Integer age;

    public static long getSerialversionUID() {
        return serialversionUID;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

创建UserService(接口)提供查询服务

package com.ming.pojo;

import java.util.List;

public interface UserService {
    List<User> queryAll();
}

创建实现类

package com.ming.pojo;

import com.alibaba.dubbo.config.annotation.Service;

import java.util.ArrayList;
import java.util.List;

@Service(version = "${dubbo.service.version}")  // 声明一个服务
public class UserServiceImpl implements UserService {
    public List<User> queryAll() {
        // 实现查询
        List<User> list = new ArrayList<User>();
        for(int i = 0; i < 10; i++){
            User user = new User();
            user.setAge(10 + i);
            user.setId(Long.valueOf(i + 1));
            user.setPassword("123456");
            user.setUsername("username_" + 1);
            list.add(user);
        }
        return list;
    }
}

编写相关的application

// 版本
dubbo:
  service:
    version: 1.0.0
  protocol:
    name: dubbo
    port: 20880
  // 服务扫描
  scan:
    basePackages: com.ming.pojo
  application:
    name: dubbo-provider-demo

//zk
  registry:
    address: zookeeper://172.0.0.1:2181
    client: zkclient

启动以后,查看注册中心,已经注册

服务消费方

导入相关依赖

<?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>untitled9</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer-dubbo</artifactId>

    <dependencies>
        <!--添加springboot依赖,非web项目-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!--引入service的依赖-->
        <dependency>
            <groupId>cn.itcast.dubbo</groupId>
            <artifactId>itcast-dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

编写测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestUserService {
    @Reference(version="1.0.0")
    private UserService userService;

    @TestpublicvoidtestQueryAll(){
        List<User>users=this.userService.queryAll();
    }
    for(Useruser:users){
        System.out.println(user);
    }
}

编写配置文件

spring:
  application:
    name: ming-consumer
  port: 9091

dubbo:
  registry:
    address: zookeeper://172.0.0.1:2181
    client: zkclient

测试

前置知识

Java 基本语法,计算机科学的基础知识体系

适合人群

刚刚走入社会,或正在实习的,大学生们

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments