SpringBoot 学习(十)分布式理论

news2024/12/23 12:28:06

12. 分布式理论

12.1 简介

  • 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统。

  • 分布式是一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统,其目的是利用更多的机器,处理更多的数据。

  • 小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。

    ​ —— 张鹏飞

  • 分布式架构四个核心问题

    • 多服务,客户端如何访问?— API 网关,服务路由
    • 多个服务之间如何通信?— HTTP,RPC框架,异步调用
    • 多服务如何治理?— 服务注册与发现,高可用
    • 服务挂了,怎么办?— 熔断机制,服务降级

12.2 Dubbo

(1) 背景

● 架构

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

在这里插入图片描述

单一应用架构(All in One)

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

垂直应用架构(Vertical Application)

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

分布式服务架构(Distributed Service)

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

流动计算架构(Elastic Computing)

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

● RPC
  • RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务

  • 本地过程调用

    直接调用,函数体通过函数指针来指定。
    在这里插入图片描述

  • 远程过程调用

    // Client端 
    1. 将调用映射为 (函数,进程 ID)。
    2. 将 (函数,进程 ID) 序列化,以二进制形式打包
    3. 把 2 中得到的数据包发送给 Server,这需要使用网络传输层
    4. 等待服务器返回结果
    5. 如果服务器调用成功,那么就将结果反序列化.
    
    // Server端
    1. 在本地维护 (函数,进程ID) 到函数指针的映射,可以用 Map<String, Method> map
    2. 等待客户端请求
    3. 得到一个请求后,将其数据包反序列化,得到 (函数,进程ID)
    4. 通过在 map 中查找,得到相应的函数指针
    5. 本地调用函数,得到结果
    6. 将结果序列化后通过网络返回给 Client
    

    在这里插入图片描述

(2) 概念

  • Dubbo 是一个高性能优秀的服务框架,它使应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。

在这里插入图片描述

  • 节点角色说明
节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

(3) 安装

  • 下载地址:apache/dubbo-admin at master (github.com)

  • 指定 zookeeper 注册地址

    # dubbo-admin-master-0.2.0\dubbo-admin\src\main\resources\application.properties
    server.port=7001
    spring.velocity.cache=false
    spring.velocity.charset=UTF-8
    spring.velocity.layout-url=/templates/default.vm
    spring.messages.fallback-to-system-locale=false
    spring.messages.basename=i18n/message
    spring.root.password=root
    spring.guest.password=guest
    # 注册地址
    dubbo.registry.address=zookeeper://127.0.0.1:2181
    
  • 在项目目录下打包 dubbo-admin

    mvn clean package -Dmaven. test. skip=true

    • 配置 maven 的环境变量
    • 以管理员身份运行 cmd
    • 在 dubbo 目录下运行cmd,执行命令

    在这里插入图片描述

    在这里插入图片描述

(4) 测试

  • 启动 zookeeper

  • 启动 dubbo

    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

  • 浏览器访问 http://localhost:7001/,默认用户名和密码都为 root

在这里插入图片描述

12.3 Zookepper

● 简介

  • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
  • 下载地址:http://zookeeper.apache.org/releases.html#download

● 启动服务

  • 以管理员身份运行 zkService.cmd

  • 服务闪退问题

    • 没有配置 zoo.cfg 配置文件
  • 解决方案

    • 编辑 zkService.cmd 文件,末尾添加 pause ,暂停服务,便于查找错误。

      在这里插入图片描述

    • 程序未找到 zoo.cfg

      在这里插入图片描述

    • 复制 conf/zoo_sample.cfg 改名为 zoo.cfg

      在这里插入图片描述

    • 再次以管理员身份启动 zkService.cmd

      在这里插入图片描述

    • 测试

      • 打开用户端 bin/zkCli.cmd

        在这里插入图片描述

        在这里插入图片描述

        在这里插入图片描述

12.4 springboot+dubbo+zookeeper

(1) 建立空工程,创建两个 springboot 服务模块

在这里插入图片描述

(2) 为模块添加服务

● provider-server
<!--pom.xml-->
<!--dubbo-->
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo-spring-boot-starter</artifactId>
   <version>2.7.3</version>
</dependency>

<!--zkCli-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
   <groupId>com.github.sgroschupf</groupId>
   <artifactId>zkclient</artifactId>
   <version>0.1</version>
</dependency>

<!--zookeeper-->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>4.1.0</version>
</dependency>
<!--解决报错:java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListener-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>4.2.0</version>
</dependency>

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.14</version>
   <!--排除 slf4j-log4j12,避免日志冲突-->
   <exclusions>
      <exclusion>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
      </exclusion>
   </exclusions>
</dependency>
# application.properties
server.port=8001

# 服务应用名字
dubbo.application.name=provider-server
# 注册中心地址,即存放服务的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 待注册的服务
dubbo.scan.base-packages=com.why.service
// service
public interface TicketService {
    public String getTicket();
}
// service
// zookeeper:服务注册与发现
// 项目已启动就自动注册到注册中心
// 注意使用 dubbo 的 Service 注解
@Service
@Component
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "Train Ticket";
    }
}
● consumer-server
<!--pom.xml-->
<!--dubbo-->
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo-spring-boot-starter</artifactId>
   <version>2.7.3</version>
</dependency>

<!--zkCli-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
   <groupId>com.github.sgroschupf</groupId>
   <artifactId>zkclient</artifactId>
   <version>0.1</version>
</dependency>

<!--zookeeper-->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>4.1.0</version>
</dependency>
<!--解决报错:java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListener-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>4.2.0</version>
</dependency>

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.14</version>
   <!--排除 slf4j-log4j12,避免日志冲突-->
   <exclusions>
      <exclusion>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
      </exclusion>
   </exclusions>
</dependency>
# application.properties
server.port=8002

# 消费者取服务,需要暴露自己的名字
dubbo.application.name=consumer-server
# 注册中心的地址,即取服务的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
// service
public interface UserService {
    public void buyTick();
}
// service
// 此处的 @Service 是将实现类注册到 Spring 中,注意导包路径
@Service
public class UserServiceImpl implements UserService {

    // 在注册中心拿到 provider-server 的服务
    // 本地可定义与 provider-server 端路径相同的接口,使用 @Reference 引用 provider-server 端注册在注册中心的服务
    @Reference
    private TicketService ticketService;

    @Override
    public void buyTick() {
        String ticket = ticketService.getTicket();
        System.out.println("在注册中心拿到=>" + ticket);
    }
}
// service
public interface TicketService {
    public String getTicket();
}
● 启动服务
  • 启动 zkService

  • 启动 dubbo-admin 程序

  • 启动 provider-server 服务

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  • 编写并启动 consumer-server 测试

    @Test
    void testBuyTick() {
       userService.buyTick();
    }
    

    在这里插入图片描述

    consumer-server 服务并未编写实现类实现 TicketService 接口,此为 consumer-server 在注册中心拿到的结果。即执行了如下过程:

    在这里插入图片描述

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

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

相关文章

Vieworks首款采用CoF接口的工业相机亮相!

Vieworks首款CoF(CoaXPress-over-Fiber&#xff09;接口数字相机&#xff0c;具有高速度、高分辨率。 VC-21MDF-M/C460I在2100万全分辨率下可达到454fps的速率。CoF这个新接口支持传输高达80 Gbps的图像数据&#xff0c;加之配备Vieworks的创新技术&#xff0c;该相机不仅帧速…

钻孔主轴铝铸件微小孔φ2mm钻孔加工方案

随着工业技术的不断发展&#xff0c;铝铸件在现代制造业中发挥着越来越重要的作用。而在铝铸件的制造过程中&#xff0c;微小孔加工一直是一个重要而又具有挑战性的工艺。在这个过程中&#xff0c;钻孔主轴作为一种重要的工具&#xff0c;可以有效地完成铝铸件微小孔的加工。 …

[C++随笔录] list使用

list使用 构造函数insert && 迭代器push_back && pop_back && push_front && pop_fronterasesort && find && reverse list的底层结构就是 带头双向循环链表 构造函数 // 默认构造 list<int> lt; cout << "l…

PyQt5 自定义开关按钮(2)

效果展示 代码展示 from PyQt5.QtCore import Qt, pyqtSignal, QTimer, QRectF, QRect from PyQt5.QtGui import QFont, QColor, QPainter, QPainterPath from PyQt5.QtWidgets import QWidgetclass SwitchBtn(QWidget):clicked = pyqtSignal(bool)# 组件常量BORDER_WIDTH = 4…

【LeetCode-简单题】501. 二叉搜索树中的众数

文章目录 题目方法一&#xff1a;暴力哈希方法二&#xff1a;利用二叉搜索树的特性&#xff08;递归双指针&#xff09; 题目 方法一&#xff1a;暴力哈希 这是针对于普通二叉树的解法 统计number出现次数 然后将次数最大的众数集 取出来 Map<Integer , Integer > map …

世界前沿技术发展报告2023《世界信息技术发展报告》(五)先进计算技术

&#xff08;五&#xff09;先进计算技术 1. 概述2. 超级计算机2.1 美国首台E级超级计算机Crusher上线试运行2.2 欧洲最强大的超级计算机落成2.3 美国英伟达与微软公司联合开发人工智能超级计算机 3. 新型计算技术3.1 中国北京航空航天大学提出“混合概率逻辑计算”机制3.2 奥地…

港联证券:绿柱成交量放大什么意思?

这是许多股民常常遇到的问题。股票的价格涨跌往往与它的成交量有着紧密的联络&#xff0c;而绿柱扩展也意味着股票的成交量在上升&#xff0c;这或许是功德&#xff0c;也或许是坏事。本文将从不同角度评论绿柱成交量扩展的意义。 首要&#xff0c;关于绿柱扩展的情况&#xf…

负载均衡器监控

什么是负载均衡器 负载均衡建立在现有网络结构之上&#xff0c;它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行&#xff0c;例如Web服务器、FTP服务器、企…

MySQL数据库入门到精通7--进阶篇( InnoDB引擎)

6. InnoDB引擎 6.1 逻辑存储结构 InnoDB的逻辑存储结构如下图所示: 1). 表空间 表空间是InnoDB存储引擎逻辑结构的最高层&#xff0c; 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08;xxx.ibd&#xff0…

centos 6使用yum安装软件

1. 执行以下命令&#xff0c;查看当前操作系统 CentOS 版本。 cat /etc/centos-release返回结果如下图所示&#xff0c;则说明当前操作系统版本为 CentOS 6.9。 2. 执行以下命令&#xff0c;编辑 CentOS-Base.repo 和CentOS-Epel.repo文件。 vim /etc/yum.repos.d/CentOS-Bas…

三极管和MOS管抗静电?|深圳比创达EMC

抗静电为什么是三极管优于MOS&#xff1f;那么三极管和MOS管抗静电&#xff1f;接下来就跟着深圳比创达EMC小编一起来看下吧&#xff01; 首先要了解电子元件的特性&#xff0c;三极管是电流驱动元件&#xff0c;MOS管是电压驱动元件&#xff0c;为什么说MOS管用手触摸容易坏&a…

SpringAOP入门案例

package com.elf.spring.aop.aspectj; /*** author 45* version 1.0*/ public interface UsbInterface {public void work(); }package com.elf.spring.aop.aspectj; import org.springframework.stereotype.Component; /*** author 45* version 1.0*/ Component //把Phone对象…

如何快速提高沃尔玛、亚马逊产品的权重和销量,自养号测评的重要性!

据沃尔玛最新财报显示&#xff0c;其第二季度营业收入达到1616亿美元&#xff0c;同比增长5.74%&#xff1b;第二季度净利润约为79亿美元&#xff0c;同比增长53%。其中&#xff0c;沃尔玛在美国电商业务销售额同比增长24%。 其用户忠诚度也很较高&#xff0c;沃尔玛每月独立访…

Linux - Python安装

准备 openssl下载 python3下载 openssl安装目录&#xff1a;/usr/local/openssl python安装目录&#xff1a;/usr/local/python 将下载的文件上传至上面目录 部署 openssl安装 cd /usr/local/openssl tar -zxvf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --pref…

公网远程访问GeoServe Web管理界面【内网穿透】

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

蓝桥杯备赛-上学迟到

上学迟到 P5707 【深基2.例12】上学迟到 - 洛谷 |https://www.luogu.com.cn/problem/P5707 题目介绍 题目描述 学校和 yyy 的家之间的距离为 s 米&#xff0c;而 yyy 以v 米每分钟的速度匀速走向学校。 在上学的路上&#xff0c;yyy 还要额外花费 1010 分钟的时间进行垃圾分…

RHCE---时间/远程连接服务器

文章目录 目录 文章目录 前言 一.安装时间服务器软件 初始化系统 二.配置时间服务器的服务端 三.配置时间服务器的客户端 四.远程连接服务器 前言 Linux中的时间服务器是指NTP服务器&#xff0c;NTP是Network Time Protocol的缩写&#xff0c;即网络时间协议。NTP服务器可以…

工业互联网:数字化革命的引擎

工业互联网&#xff0c;作为数字化革命的引擎&#xff0c;正以前所未有的速度和力度改变着我们的世界。这一概念不再局限于企业内部的信息技术应用&#xff0c;而是将互联网、大数据、人工智能等技术深度融入到制造业、能源、交通、农业等各个领域&#xff0c;实现了设备、系统…

竞赛选题 基于深度学的图像修复 图像补全

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-se…

项目管理中,产品经理如何合理分配任务?

大部分工作在软件行业中的分配是明确的&#xff0c;例如开发人员负责编写代码&#xff0c;产品经理负责编写文档&#xff0c;设计师负责绘制图形。然而&#xff0c;仍有一部分工作并不明确由谁负责。无论是产品经理还是开发人员都可以完成这些工作。 如果产品经理不擅长分配任…