分布式理论及框架设计

1 socket与IO模型

1.1 socket概述

是传输层协议TCP/IP的通信基石。五种主要信息:协议、本地IP地址、本地端口、远程IP地址、远程端口

1.2 socket流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zaAvunxM-1631317458636)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210617072816755.png)]

根据IP+端口号,打开一个套接字,与服务器连接上后,客户端与服务端就可以输入输出流的形式操作了。

1.3 IO模型

I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收

Java 共支持 3 种网络编程模型/IO 模式:BIO(同步并阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)

阻塞:指访问IO的线程是否需要等待

同/异步:指访问数据的方式

1.3.1 BIO

一个连接一个线程,当客户端向服务器连接时,就需要创建一个线程。线程池可以改善。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rtLL4OCx-1631317458639)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210622164552153.png)]

存在问题:

1、每个请求都要创建独立线程,并发量大时,需要大量的线程,系统资源占用大。

2、连接创建后,如果没有数据读取,就阻塞在read,线程资源浪费

1.3.2 NIO

一个线程处理多个请求,多路复用,轮询到有IO请求就处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7JFAYsl-1631317458641)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210622165032739.png)]

1.3.3 AIO

不需要专门建立线程去处理,而是系统在有IO请求时,服务端分配线程去处理。没有IO时,该线程可以处理其他事情。

总结

  1. BIO(同步并阻塞) 方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,
    并发局限于应用中,JDK1.4以前的唯一选择,但程序简单易理解
  2. NIO(同步非阻塞) 方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕
    系统,服务器间通讯等。编程比较复杂,JDK1.4 开始支持
  3. AIO(异步非阻塞) 方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分
    调用 OS 参与并发操作, 编程比较复杂,JDK7 开始支持。

1.4 NIO编程

NIO 有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLzFDJPq-1631317458642)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210622165758730.png)]

2 Netty

对NIO的封装

Reactor模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96jdu8Gp-1631317458644)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210622170005901.png)]

线程模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aga8as1O-1631317458645)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210622170036867.png)]

粘包/丢包

TCP粘包和拆包产生的原因:
数据从发送方到接收方需要经过操作系统的缓冲区,而造成粘包和拆包的主要原因就在这个缓冲区
上。粘包可以理解为缓冲区数据堆积,导致多个请求数据粘在一起,而拆包可以理解为发送的数据大于
缓冲区,进行拆分处理。

解决方案

其实就是给一个可以区分包的界限。

  1. 业内解决方案
    由于底层的TCP无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个
    问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,可以归纳如下。
    消息长度固定,累计读取到长度和为定长LEN的报文后,就认为读取到了一个完整的信息
    将换行符作为消息结束符
    将特殊的分隔符作为消息的结束标志,回车换行符就是一种特殊的结束分隔符
    通过在消息头中定义长度字段来标识消息的总长度
  2. Netty中的粘包和拆包解决方案
    Netty提供了4种解码器来解决,分别如下:
    固定长度的拆包器 FixedLengthFrameDecoder,每个应用层数据包的都拆分成都是固定长度
    的大小
    行拆包器 LineBasedFrameDecoder,每个应用层数据包,都以换行符作为分隔符,进行分割
    拆分
    分隔符拆包器 DelimiterBasedFrameDecoder,每个应用层数据包,都通过自定义的分隔
    符,进行分割拆分
    基于数据包长度的拆包器 LengthFieldBasedFrameDecoder,将应用层数据包的长度,作为
    接收端应用层数据包的拆分依据。按照应用层数据包的大小,拆包。这个拆包器,有一个要
    求,就是应用层协议中包含数据包的长度

3 自定义RPC框架

3.1 分布式架构网络通信

java领域的技术:RMI、Hessian、SOAP、ESB和JMS等

3.2 原理

从底层来讲,将数据流从一台计算机传输到另一台计算机。基于传输层协议和网络IO来实现。传输协议主要有TCP、UDP,这是在基于socket在某类应用场景下(稳定TCP准确不容错误/速度UDP容忍部分丢失)扩展出来的传输协议。网络IO,主要就是BIO,NIO,AIO。

3.3 RPC

remote procedure call,远程过程调用。通过rpc可以实现像本地调用一样调用远程服务,是一种进程间的通信方式。

RPC并不是一个具体的技术,而是整个网络远程调用过程。(多种技术实现)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T636Loxs-1631317458647)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210624025252360.png)]

其实主要就是三方面,C端(调用方),P端(中间转换),S端(被调用)

核心模块就是通讯和序列化

3.3.1 RMI

基于jvm实现,只可以从jvm到jvm调用。

3.3.2 基于Netty实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aSBDDpEK-1631317458648)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210624025940672.png)]

4 分布式理论

分布式:业务拆分成多个子业务,他们分布在不同的服务器节点,共同组成一个系统就是一个分布式系统。这些服务器节点在空间部署上是随意分布的,可以放在不同机柜、不同机房,不同城市。(多个服务器做不同的事

集群:多个服务器做同一件事

4.1 特性

\1. 分布性
空间中随机分布。这些计算机可以分布在不同的机房,不同的城市,甚至不同的国家。
\2. 对等性
分布式系统中的计算机没有主/从之分,组成分布式系统的所有节点都是对等的。
\3. 并发性
同一个分布式系统的多个节点,可能会并发地操作一些共享的资源,诸如数据库或分布式存储。
\4. 缺乏全局时钟
既然各个计算机之间是依赖于交换信息来进行相互通信,很难定义两件事件的先后顺序,缺乏全局
始终控制序列
\5. 故障总会发生
组成分布式的计算机,都有可能在某一时刻突然间崩掉。分的计算机越多,可能崩掉一个的几率就
越大。如果再考虑到设计程序时的异常故障,也会加大故障的概率。
\6. 处理单点故障
单点SPoF(Single Point of Failure):某个角色或者功能只有某一台计算机在支撑,在这台计算
机上出现的故障是单点故障。

4.2 问题

  • 通信异常
  • 网络分区
  • 节点故障
  • 三态(成功、失败、超时)
  • 重发
  • 幂等(多次执行同样的请求结果是相同的,基于分布式场景下出现的问题,需要重新发送请求,保证同一个请求多次过来产生的结果一致。对于非天然幂等的操作,需要判断该请求是否执行过)redis,数据库加version

4.3 数据一致性

节点间数据达到一致。以下有不同的级别

  • 强一致性(立即、实时)
  • 弱一致性(一段时间后)
  • 最终一致性(弱一致性的一种)例子:微信转账,2小时内到账。
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LQKfguS-1631317458649)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210624031809813.png)]

4.4 CAP定理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7f3MWeL-1631317458649)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210624031912125.png)]

一致性:强一致性

可用性:请求必须有服务器响应

分区容错性:允许网络丢失两个节点间的消息传送。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZssTy6EV-1631317458650)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210624032819095.png)]

CA保证一致性+可用性,就是不能容忍网络故障或节点错误,一旦问题出现,拒绝写请求,保证数据不修改。

CP保证分区容错性+一致性,允许部分节点不可用,且数据不一致的节点不可用。

AP可用性+分区容错性:允许数据冲突,维护数据版本。

互联网一般是AP放弃C,多个节点容易出现故障。

4.5 base理论

BASE:全称:Basically Available(基本可用),Soft state(软状态),和 Eventually consistent(最终一
致性)三个短语的缩写 ,Base 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大型互联网分布
式实践的总结,是基于 CAP 定理逐步演化而来的。其核心思想是: 既是无法做到强一致性(Strong
consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual
consistency)。

4.6 分布式一致性协议

4.6.1 2PC

4.6.2 3PC

4.6.3 NWR协议

NWR值的不同组合会产生不同的一致性效果,当W+R>N的时候,整个系统对于客户端来讲能保证强
一致性。

4.6.4 Gossip协议

Gossip 协议的消息传播方式有两种:反熵传播 和 谣言传播
\1. 反熵传播
是以固定的概率传播所有的数据。所有参与节点只有两种状态:Suspective(病原)、
Infective(感染)。过程是种子节点会把所有的数据都跟其他节点共享,以便消除节点之间数据的任
何不一致,它可以保证最终、完全的一致。缺点是消息数量非常庞大,且无限制;通常只用于新加
入节点的数据初始化。
\2. 谣言传播
是以固定的概率仅传播新到达的数据。所有参与节点有三种状态:Suspective(病原)、
Infective(感染)、Removed(愈除)。过程是消息只包含最新 update,谣言消息在某个时间点之后会
被标记为 removed,并且不再被传播。缺点是系统有一定的概率会不一致,通常用于节点间数据
增量同步。

4.6.5 Paxos协议

Paxos协议其实说的就是Paxos算法, Paxos算法是基于消息传递且具有高度容错特性的一致性算
法,是目前公认的解决分布式一致性问题最有效的算法之一

4.6.6 Raft协议

选举

4.6.7 Lease机制

租约

4.7 分布式系统设计策略

关键问题

  • 检测节点存活(心跳检测)
  • 保障高可用(HA:主备,互备,集群)脑裂问题
  • 容错处理(缓存穿透,存放null,布隆过滤器)
  • 负载均衡

4.8 分布式架构服务调用

  • 服务调用
  • 实现方式(HTTP应用协议通信框架,RPC框架)
  • 跨域

4.9 分布式服务治理

4.9.1 服务协调

分布式锁2种:Redis、zookeeper实现

4.9.2 服务削峰

消息队列、层层削峰两种

4.9.3 服务降级

4.9.4 限流

4.9.5 服务熔断

4.9.6 链路追踪

5 架构设计基本原则

利于开发者、公司、客户

5.1 开闭原则

扩展开放,修改关闭。

可以继承已有的类实现扩展,不可修改已有的类代码。这样只需要测试新开发的代码

抽象约束,封装变化

通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

作业:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbEB957W-1631317458651)(C:\Users\Howey\AppData\Roaming\Typora\typora-user-images\image-20210621012955223.png)]

集成springboot,增加controller层。

服务端起多个服务,IP为8899,8898

客户端创建连接时轮询

5 架构设计基本原则

利于开发者、公司、客户

5.1 开闭原则

扩展开放,修改关闭。

可以继承已有的类实现扩展,不可修改已有的类代码。这样只需要测试新开发的代码

抽象约束,封装变化

通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。

作业:

[外链图片转存中…(img-lbEB957W-1631317458651)]

集成springboot,增加controller层。

服务端起多个服务,IP为8899,8898

客户端创建连接时轮询

C端跟S端的端口号问题。

Java进阶之路对标阿里P6(8)——分布式理论及框架设计Netty相关推荐

  1. Java进阶之路对标阿里P6(11)——MYSQL系统化学习(1w字)

    MYSQL 架构演变: 单机单库 主从架构 分库分表 云数据库 一.架构原理 1.1 Mysql体系架构 分为四层:网络连接层.服务层.存储引擎层和系统文件层 查询优化器:选取-投影-联接 策略 日志 ...

  2. 2022最新Java学习路线,对标阿里P6

    阶段一 (夯实基础) 本阶段为JavaSE基础阶段,主要以铺垫JAVA知识为主 Java基础语法 Java面向对象编程 Java核心类库 XML与JSON 算法与数据结构 数据库 JDBC技术 H5前 ...

  3. 对标阿里P6+的Java架构师课程,到底是怎样的牛逼?

    现阶段很多人被表象迷惑,感觉Java的开发人员并不好找工作.一部分人就误以为市场饱和了,却没考虑到是自身能力不足,而且他们在学习的过程中往往是这样的 ↓ ↓ ↓ : 对知识点不会筛选,盲目买书看视频, ...

  4. 《Java 进阶之路》 下--推荐书籍

    真正想提升自己,我感觉最主要的是先把 JVM.并发.网络这三块知识点学会.学通,这三块是基础,后面所有的框架.中间件等相关的都是基于这三块知识点之上的.学完这三块知识点,可以快速的掌握其它的知识,新框 ...

  5. 《java 进阶之路》 上--推荐书籍

    整整一月没有更新博客了,因为十月份和双十一新入手的6本技术相关的书,这个月看完了3本,后面的3本还得慢慢肯. 下面我就介绍下进阶高级工程师必须也是我自己都看的一些书和知识点. 1.深入理解Java虚拟 ...

  6. JAVA进阶之路-CountDownLatch源码走读

    前言 本章用到了之前谈到的AQS,就是在该FIFO阻塞框架的基础上改造的,不理解的,可以去看JAVA进阶之路-AbstractQueuedSynchronizer(AQS)源码走读 用途 CountD ...

  7. 对标阿里p6 - 看看自己什么水平!

    原文:< 阿里巴巴淘系技术>知乎问答 本篇文章将根据阿里P6职级对标需要掌握的技术程度和技能要求,文章内容比较长,请话几分钟时间认真静下心看看,对比下自己现在所掌握的情况,也就能大概预估出 ...

  8. java进阶之路学习笔记

    如果你现在是Web前端零基础学员,大致可以按如下思路学习系统学习: 一.基础部分 1.HTML + CSS 这部分学习,可以模仿一些网站做些页面.在实践中积累了一些经验后,可以系统的读一两本书,推荐& ...

  9. Java 进阶之路:异常处理的内在原理及优雅的处理方式

    永远不要期待程序在完全理想的状态下运行,异常往往不期而遇,如果没有完善的异常处理机制,后果可能是灾难性的.对于 Java 工程师而言,合理地处理异常是一种基本而重要的能力,然而,在近来的面试中,笔者发 ...

  10. Java进阶之路——从初级程序员到架构师,从小工到专家必会的技能

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题.希 ...

最新文章

  1. 23.使用load()方法异步请求数据
  2. STL容器底层数据结构的实现
  3. 服务器在行例维护中,8月14日服务器例行维护公告
  4. cocos2dx中使用iconv转码(win32,iOS,Android)
  5. sql注入 练手网站_靶场sql注入练手----sqlmap篇(纯手打)
  6. selenium 实现循环点击_-循环点击遇到的坑(每次点击后返回,页面元素都会变化的解决方法)...
  7. Maven学习总结(10)——使用Maven编译项目gbk的不可映射问题
  8. linux服务器下安装phpstudy 如何命令行进入mysql
  9. 好的串行代码与好的并行代码的区别(Zz)
  10. oracle表修改语句怎么写,Oracle修改表结构语句
  11. 小米抢购软件_【晓满晓满晓】今日科技新鲜事:小米11、鸿蒙os、摩拜单车
  12. 微信HOOK协议软件,已实现云控,将微信的效率最大化,目前测试中
  13. 哪款投影仪做家庭影院效果好?家用投影仪哪个好
  14. 常用显卡驱动下载合集
  15. 推荐几个免费看漫画的资源网站,请低调收藏
  16. c语言中中文字库,读取汉字库中的汉字
  17. Lumiprobe核酸定量丨QuDye dsDNA BR 检测试剂盒
  18. NP问题真的很难理解
  19. 数组x中数据复制到数组y中,重复的数据只存储一次,最后输出y;计算x中数据的平均值ave及大于平均值的元素个数n。c++实现
  20. GSM短信发送与电话等

热门文章

  1. Leetcode第二期Task01 链表 707. 设计链表 206.反转链表 203.移除链表 328.奇偶链表 234.回文链表 21.合并两个有序链表 019.删除链表的倒数第 N 个结点
  2. word前两页不设置页码,从第三页开始设置页码(word页码设置)
  3. zigbee 协调器与终端通信问题
  4. SpringBoot整合Cache缓存技术(二十一)
  5. vscode快速删除空白行方法
  6. ArcGIS中ObjectID,FID和OID字段区别
  7. C语言中关于中文字符的存储及相关探索
  8. 路由汇总与路由聚合的区别
  9. SAR图像聚焦质量评价插件
  10. POS机31个基础知识你了解多少?