Dubbo【 Dubbo概念(什么是分布式系统、什么是RPC、核心组件、Zookeeper注册中心 )】(一)-全面详解(学习总结---从入门到深化)

news2024/10/7 2:23:55

 

目录

Dubbo概念_什么是分布式系统

什么是分布式 

Dubbo概念_什么是RPC

Dubbo概念_简介 

Dubbo概念_核心组件

Dubbo配置开发环境_Zookeeper注册中心 

Dubbo配置开发环境_管理控制台 

Dubbo入门案例_需求介绍 

 Dubbo入门案例_配置开发环境

Dubbo入门案例_服务生产者配置

Dubbo入门案例_服务生产者代码编写


Dubbo概念_什么是分布式系统

 

单机架构 

一个系统业务量很小的时候所有的代码都放在一个项目中就好了, 然后这个项目部署在一台服务器上,整个项目所有的服务都由这台 服务器提供。

缺点:

  • 服务性能存在瓶颈
  • 代码量庞大,系统臃肿,牵一发动全身
  • 单点故障问题 

 集群架构

单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一 个集群。

集群存在的问题:

当你的业务发展到一定程度的时候,你会发现一个问题无论怎 么增加节点,貌似整个集群性能的提升效果并不明显了。这时 候,你就需要使用分布式架构了。 

什么是分布式 

分布式架构就是将一个完整的系统,按照业务功能,拆分成一个个 独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这 些子系统能够独立运行在web容器中,它们之间通过RPC方式通信。 

 分布式的优势:

1、系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试,系统与系统之间的边界 非常明确,排错也变得相当容易,开发效率大大提升。

2、系统之间的耦合度降低,从而系统更易于扩展。我们可以针对性地扩展某些服务。

3、服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该公司所有的产品都可以 使用该系统作为用户系统,无需重复开发。

三者区别 

总结: 将一套系统拆分成不同子系统部署在不同服务器上(这叫分布 式),然后部署多个相同的子系统在不同的服务器上(这叫集 群)。

集群:多个人在一起作同样的事 。

分布式 :多个人在一起作不同的事 。 

实时学习反馈 

1.下列属于分布式的优势的是___。

A 系统之间的耦合度大大降低

B 服务的复用性更高

C 独立部署、独立测试

D 以上都是正确

2. 下列描述分布式架构正确的是____。

A 将一套系统拆分成不同子系统部署在不同服务器上

B 所有的代码都放在一个项目中

C 多个相同的子系统部署在不同的服务器上

D 以上都是错误

Dubbo概念_什么是RPC

什么是RPC 

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务。

 

 大白话理解就是:RPC让你用别人家的东西就像自己家的一样。

 

RPC两个作用:

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法
  • 隐藏底层网络通信的复杂性,让我们更加专注业务逻辑。 

常用的RPC框架 

RPC是一种技术思想而非一种规范或协议。

常见 RPC 技术和框架:

阿里的 Dubbo/Dubbox、Google gRPC、Spring Cloud。

实时效果反馈

1. RPC是_____技术。

A 本地调用

B 远程过程调用

C 过程调用

D 服务调用

2. 下列__框架不是RPC框架。

A Dubbo

B Spring Cloud

C GooglegRPC

D Spring MVC

Dubbo概念_简介 

Dubbo是什么 

Apache Dubbo是一款高性能、轻量级的开源服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。

Dubbo能做什么

1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵 入。

2、软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。

3、服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地 址,并且能够平滑添加或删除服务提供者

注意:

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有 任何API侵入,只需用Spring加载Dubbo的配置即可。 

Dubbo支持的协议 

协议是两个网络实体进行通信的基础,数据在网络上从一个实体传 输到另一个实体,以字节流的形式传递到对端。在这个字节流的世 界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或 者多维的数据结构以及领域对象。

Dubbo支持的协议

  • Dubbo协议
  • Hessian协议
  • HTTP协议
  • RMI协议
  • WebService协议
  • Memcached协议
  • Redis协议 

推荐: 使用Dubbo协议。

实时效果反馈 

1. Apache Dubbo是_____框架。

A 高性能Web服务框架

B 高性能Web平台

C 高性能RPC分布式服务框架

D RPC框架

2. 使用分布式架构主要原因___。

A 加快响应速度

B 提高系统的高可用性

C 可以承受更大规模的并发流量

D 提高系统的安全性

Dubbo概念_核心组件

注册中心Registry 

在Dubbo微服务体系中,注册中心是其核心组件之一。Dubbo通过 注册中心实现了分布式环境中各服务之间的注册与发现,是各个分布式节点之间的纽带。

其主要作用如下:

动态加入:一个服务提供者通过注册中心可以动态地把自己暴露给其他消费者,无须消费者 逐个去更新配置文件。 

动态发现:一个消费者可以动态地感知新的配置、路由规则和新的服务提供者,无须重启服 务使之生效。

动态调整:注册中心支持参数的动态调整,新参数自动更新到所有相关服务节点。

统一配置:避免了本地配置导致每个服务的配置不一致问题。

常见得注册发现服务

 常见的注册中心有zookeeper 、eureka、consul、etcd。

服务提供者Provider 

服务的提供方

服务消费者Consumer

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

监控中心Monitor 

主要负责监控统计调用次数和调用时间等。

工作流程

实时效果反馈 

1. Apache Dubbo技术中下列____技术可以做服务注册发现服务。

A Spring

B Nginx

C zookeeper

D Redis

Dubbo配置开发环境_Zookeeper注册中心 

下载Zookeeper镜像 

docker pull zookeeper:3.5.9

启动运行容器

docker run --name zk -d -p 2181:2181
zookeeper:3.5.9

参数:

-d:守护进程运行

-p:映射端口号

进入容器 

docker exec -it zk /bin/bash

参数:

exec:在运行的容器中执行命令

-it:交互式

Dubbo配置开发环境_管理控制台 

介绍 

Dubbo-admin管理平台,图形化的服务管理页面,安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理。

下载Dubbo-Admin镜像

docker pull docker.io/apache/dubbo-admin

启动运行容器

docker run -d \
--name dubbo-admin \
-p 9600:8080 \
-e
admin.registry.address=zookeeper://192.168.66.102:2181 \
-e admin.config-center=zookeeper://192.168.66.102:2181 \
-e admin.metadata-report.address=zookeeper://192.168.66.102:2181 \
--restart=always \ docker.io/apache/dubbo-admin

参数:

  • --restart:always 容器退出时总是重启
  • admin.registry.address:注册中心
  • admin.config-center:配置中心
  • admin.metadata-report.address:元数据中心

可视化界面 

浏览器输入http://192.168.66.100:9600,用户名root 密码 root

Dubbo入门案例_需求介绍 

单体架构

 项目架构

订单服务 

功能如下:

创建订单

根据用户id查询订单详情

用户服务

功能如下:

创建订单

根据用户id查询订单详情 

 Dubbo入门案例_配置开发环境

创建Maven项目

创建项目 

设置JDK版本 

  <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>

设置项目为父类型

<packaging>pom</packaging>

 修改字符编码

File->Settings->Editor->File Encodings

 配置忽略文件

File->Editor->File Types->Ignore Files and Folders

*.md;*.gitignore;.mvn;.idea;

设置aliyun阿里云maven本地仓库镜像

<repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
</repositories>

Dubbo入门案例_服务生产者配置

创建服务消费者SpringBoot项目

创建SpringBoot项目 

创建子模块 

选择组件 

修改父项目配置 

服务生产者修改父项目配置

<parent>
 <groupId>com.tong</groupId>
 <artifactId>dubbo-demo</artifactId>
 <version>1.0-SNAPSHOT</version>
</parent>

父项目加入配置

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/>
</parent>

父项目加入模块

在pom.xml文件中加入

<modules>
     <module>dubbo-provider</module>
</modules>

引入依赖

<!-- 整合dubbo -->
<dependency>
     <groupId>io.dubbo.springboot</groupId>
     <artifactId>spring-boot-starter-dubbo</artifactId>
     <version>1.0.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency>
     <groupId>com.101tec</groupId>
     <artifactId>zkclient</artifactId>
     <version>0.7</version>
</dependency>

Dubbo入门案例_服务生产者代码编写

创建订单实体类

/**
* 订单模型
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {
    // 订单id
    private Long id;
    // 用户id
    private Long userId;
    // 订单总价格
    private Double prict;
    // 收货人手机号
    private String mobile;
    // 收货人地址
    private String address;
    // 支付类型 1:微信 2:支付宝
    private Integer pay_method;
}

编写订单接口

public interface IOrderService {
    //创建订单
    void createOrders(Orders orders);
    //根据用户id查询订单详情
    Orders findByuserId(Long userid);
}

创建统一返回结果集实体类

/**
 * 统一返回结果集
 * @param <T>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> implements Serializable {
   // 返回结果编码
   private Integer code;
   // 返回结果描述
   private String message;
   // 数据
   private T data;
   private CommonResult(Integer code,String message){
       this(code,message,null);
   }
}

编写订单业务实现类

import com.alibaba.dubbo.config.annotation.Service;
import com.tong.entity.CommonResult;
import com.tong.entity.Order;
import com.tong.service.IOrderService;
/**
* 订单功能业务层
*/
@Service
public class OrderServiceImpl implements IOrderService {
    /**
     * 创建订单
     * @param order
     * @return
     */
    @Override
    public void create(Orders order) {
        CommonResult commonResult = new CommonResult();
        // 返回结果编码
        commonResult.setCode(200);
        // 返回结果描述信息
        commonResult.setMessage("创建成功");
        return commonResult;
   }
   /**
     * 根据用户id查询订单详情
     * @param userId
     * @return
     */
    @Override
    public CommonResult<Orders> findByUserId(Long userId) {
        //TODO 模拟数据库操作
        CommonResult commonResult = new CommonResult();
         // 返回结果编码
        commonResult.setCode(200);
        // 返回结果描述信息
        commonResult.setMessage("查询成功");
        // 返回结果集
        Orders orders = new Orders();
        orders.setId(1L);
        orders.setUserId(1L);
        orders.setPrict(121.1);
        orders.setMobile("18588888888");
        orders.setAddress("北京市海淀区中关村");
        orders.setPay_method(1);
        commonResult.setData(order);
        return commonResult;
   }
}

服务生产者编写配置文件

# 端口号
server.port=9090
# 1. 配置项目名称
spring.dubbo.application.name=user-service
# 2. 配置注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.66.100
spring.dubbo.registry.port=2181
# 3. 指定dubbo使用的协议、端口
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
# 4. 指定注册到zk上超时时间,ms
spring.dubbo.registry.timeout=10000
# 5. 配置Dubbo包扫描
spring.dubbo.scan=com.tong.service

接口实现类编写Dubbo注解

import com.alibaba.dubbo.config.annotation.Service;
@service // 将这个类提供的方法(服务) 对外发布。将访问的地址 ip 端口路径 注册到注册中心
//@Service //将该类的对象创建出来放到spring的IOC容器中。 bean定义
public class OrderServiceImpl implements IOrderService {
}

可视化平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VLC-QT源码编译(Windows10+VS2020+MSVC20019+QT5.15)

参考VLC-Qt的编译与使用 windows10VS2019qt5.15 下载源码 VLC-QT https://github.com/vlc-qt/vlc-qt可以通过git或者直接下载ZIP文件&#xff0c;但是里面的libvlc-header和packaging没有下载下来&#xff0c;需要再自行下载。 VLC https://download.videolan.org/vlc/las…

行为型模式--备忘录模式

目录 概述 结构 案例实现 “白箱”备忘录模式 总结&#xff1a; “黑箱”备忘录模式 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 又叫快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这…

zeromq的学习笔记

ctx_t 在创建ctx_t时&#xff0c;会设置以下参数 _io_thread_count io线程数默认是1 _max_sockets最大socket数是1023 _starting标识设置为true,此时socket还没有创建 _terminating设置为false,在调用zmq_ctx_term时该标识会设置为true _tag设置为ZMQ_CTX_TAG_VALUE_GOOD&…

mySql和VSC++

确认主机服务里的mysql服务已打开 使用组合键“winR”运行“services.msc”&#xff0c;进入本地服务窗口&#xff1b; 2.进入本地服务窗口后&#xff0c;在右侧服务列表中&#xff0c;查找到“ mysql ”服务选项&#xff1b; 3.查找到mysql服务选项后&#xff0c;双击打开mysq…

C++ 面向对象(3)——重载运算符和重载函数

C 允许在同一作用域中的某个函数和运算符指定多个定义&#xff0c;分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明&#xff0c;但是它们的参数列表和定义&#xff08;实现&#xff09;不相同。 当您调用一个重…

FDM3D打印系列——3、常用打印材料介绍

大家好&#xff0c;我是阿赵。 FDM3D打印机一般都可以支持多种打印材料的&#xff0c;下面来介绍一下几种常用的打印材料 一、PLA 使用FDM打印&#xff0c;最常见的材料就是PLA了 PLA&#xff08;Polylactic acid&#xff09;&#xff0c;中文名为生物降解塑料聚乳酸&#…

网络安全面试题,渗透测试面试总结

1.什么是WebShell? WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的─种命令执行环境&#xff0c;也可以将其称做为─种网页后门。黑客在入侵了─个网站后&#xff0c;通常会将这些asp或php后门文件与网站服务器WEB目录下正常的网页文件混在─起&#xff0c;然后就可…

【Vue3】生命周期(钩子)函数

在 Vue 3 中&#xff0c;生命周期函数已经被重新设计为钩子函数&#xff0c;并且与 Vue 2 中的生命周期函数有所不同&#xff0c;可以在 setup 函数中使用 onXXX 形式的钩子函数来执行对应的操作。以下是选项式 API 和组合式 API 中常用的几个钩子函数对比&#xff1a; beforeC…

【Java】PriorityQueue--优先级队列

目录 一、优先级队列 &#xff08;1&#xff09;概念 二、优先级队列的模拟实现 &#xff08;1&#xff09;堆的概念 &#xff08;2&#xff09;堆的存储方式 &#xff08;3&#xff09;堆的创建 堆向下调整 &#xff08;4&#xff09;堆的插入与删除 堆的插入 堆的…

Kubernetes(k8s)容器编排组件介绍

目录 1 整体架构1.1 Master 架构1.2 Node 架构 2 k8s部署组件介绍2.1 K8s 集群架构图2.2 k8s控制组件2.2.1 控制平面2.2.2 kube-apiserver2.2.3 kube-scheduler2.2.4 kube-controller-manager2.2.5 etcd 2.3 k8s运行组件2.3.1 k8s节点2.3.2 容器集2.3.3 容器运行时引擎2.3.4 ku…

机试复试准备中--梦校真题

一、矩阵转置二、统计单词写法一&#xff1a;读取一整行写法二&#xff1a;依次读入每一个单词 三、二叉排序树&#xff08;DFS&#xff09;四、IP地址五、特殊排序六、ab&#xff08;高精度加法&#xff09;七、奇偶校验八、最大的两个数九、二叉树遍历(DFS)十、成绩排序十一、…

【C++学习】C++入门 | 引用 | 引用的底层原理 | auto关键字 | 范围for(语法糖)

写在前面&#xff1a; 上一篇文章我介绍了缺省参数和函数重载&#xff0c; 探究了C为什么能够支持函数重载而C语言不能&#xff0c; 这里是传送门&#xff0c;有兴趣可以去看看&#xff1a;http://t.csdn.cn/29ycJ 这篇我们继续来学习C的基础知识。 目录 写在前面&#x…

正交编码与正交沃尔什函数详解

本专栏包含信息论与编码的核心知识&#xff0c;按知识点组织&#xff0c;可作为教学或学习的参考。markdown版本已归档至【Github仓库&#xff1a;https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 正交编码正交编码的…

Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

假设有这样一个场景&#xff1a;服务端的资源经常在更新&#xff0c;客户端需要尽量及时地了解到这些更新发生后展示给用户&#xff0c;如果是 HTTP 1.1&#xff0c;通常会开启 ajax 请求询问服务端是否有更新&#xff0c;通过定时器反复轮询服务端响应的资源是否有更新。 在长…

css基础(二)

目录 1. CSS 的复合选择器 1.1 什么是复合选择器 1.2 后代选择器(重要&#xff09; 1.3 子选择器(重要&#xff09; 1.4 并集选择器(重要&#xff09; 1.5 伪类选择器 1.6 链接伪类选择器 1.7 :focus伪类选择器 1.8 复合选择器总结 二、 CSS 的元素显示模式 2.1什么是元素显示模…

多线程编程和并行计算的实例:期货交易及打车软件算法

多线程编程和并行计算的实例:期货交易及打车软件算法 解决现实生活中的问题时&#xff0c;多处理器和多核系统的普及使并行计算成为一个关键的性能提升手段。在这篇博客中&#xff0c;我们将通过深入讨论两个引人入胜而又具有实际意义的场景——期货交易和打车匹配算法&#xf…

CSS圆角进化论

CSS圆角发展过程 大致经历了3个阶段&#xff0c;包括&#xff1a; 背景图片实现圆角CSS2.0标签模拟圆角CSS3.0圆角属性&#xff08;border-radius属性)实现圆角 ☛背景图片实现圆角&#xff1a;使用背景图片实现圆角的方式很多&#xff0c;实现的方式和圆角的切图方式关系密…

AI绘图软件分享:Midjourney 基础教程(三)

大家好&#xff0c;我是权知星球&#xff0c;今天继续给大家分享Midjourney 基础教程&#xff08;三&#xff09;&#xff1a;Midjourney 图生图。 刚开始学习使⽤ AI 绘画时&#xff0c;⼤部分⼈的绘画⽅式&#xff1a; 有⼀个想象中的画⾯&#xff0c;⽤中⽂将这个画⾯描述…

【文件操作与IO】Java中如何操作文件

目录 Java 中操作文件 File 概述 属性 构造方法 方法 代码示例 文件内容的读写 —— 数据流 InputStream 概述 FileInputStream 概述 利用 Scanner 进行字符读取 OutputStream 概述 利用 OutputStreamWriter 进行字符写入 利用 PrintWriter 找到我们熟悉的方法 代码…

D. A Wide, Wide Graph(树的直径)

Problem - 1805D - Codeforces 给定一棵包含n个节点的树&#xff08;一个无环联通图&#xff09;&#xff0c;对于一个固定的整数k&#xff0c;定义Gk为一个具有n个节点的无向图&#xff0c;其中只有当在给定树中节点u和v之间的距离至少为k时才存在边。 对于从1到n的每个k&…