190417-分布式系统详解-基础知识(通信)

分布式系统详解–基础知识(通信)

前言

上一篇文章我们写到了 分布式系统详解–基础知识(线程),今天再讲解一下它的另外一个必备知识–通信进程之间进行通信是分布式的核心,失去了通信,也就无所谓子系统之间的相互联系。本篇文章主要介绍的几个基础知识,网络的基本概念知识、I/O通信模型、RPC和面向消息通信
pen

一、网络的基础知识

OSI七层参考模型

networklayer7

层次 数据格式 功能 典型设备
(七)应用层(Application) 数据 用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。实现各种服务:该层具有的各种应用程序可以完成和实现用户请求的各种服务。 终端设备:(PC、手机、平板)等。
(六)表示层(Presentation) 数据(Date) 数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。数据的编码:处理字符集和数字的转换。压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复。数据的加密和解密:可以提高网络的安全性。 终端设备:(PC、手机、平板)等。
五)会话层(Session) 数据(Date) 会话管理:组织和协调两个会话进程之间的通信,并对数据交换进行管理。寻址:使用远程地址建立会话连接。出错控制:从逻辑上讲会话层主要负责数据交换的建立、保持和终止。 终端设备:(PC、手机、平板)等
四)传输层(Transport) 数据组织成数据段 传输连接管理:提供建立、维护和拆除传输连接的功能。传输层在网络层 的基础上为高层提供”面向连接”和”面向无连接”服务。处理传输差错:通过这一层传输的数据将由目标设备确认,如果在指定的时间内未收到确认信息,数据将被重发 终端设备:(PC、手机、平板)等。
三)网络层(Network 分割和重新组合数据包(Packet) 基于网络层地址(IP地址)进行网络系统间的路径选择。也就是说:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。 路由器
(二)数据链路层(Data Link) bit信息封住那个为数据帧(Frame) 同个各种控制协议,将有差错的物理信道转化为无差错的、能可靠传输数据帧的数据连接 网桥、交换机
(一)物理层(Physical) 传输bit流 建立、维护和取消物理连接 网卡、光纤、中继器
慢慢看就明白了,提前明白的童鞋们~可以稍作回顾……哈哈。

四层TCP/IP网络模型

networklayer4

  1. 网络接口层:又称”链路层”。作用:A.数据封装/解封装成帧(frame)。B.控制帧传输。C.流量控制。

  2. 网络层:又称”互联网层”。作用:IP地址分类、子网划分、IP路由。处理分组在网络中的活动。

  3. 传输层:作用:两台主机上的应用程序提供端到端的通信。

  4. 应用层:负责处理特定的应用程序细节

二、I/O通信模型

同步、异步、阻塞、非阻塞的定义。可以说一大堆了。简单介绍个例子。

example

小明喜欢喝豆浆,也喜欢喝牛奶。于是,他就买了一个豆浆机,还养了两头奶牛~~

  • 同步阻塞:小明早上想喝豆浆,于是他去先去豆浆机那里磨豆浆,一直看着豆浆磨好之后,他才去做别的事情。

  • 同步非阻塞:小明早上想喝豆浆,于是他去先去豆浆机那里磨豆浆,豆浆机开动后,隔上一段时间回来一趟看看磨好了没。

  • 异步非阻塞:小明早上想喝豆浆,还想喝牛奶,他买了个豆浆机还买了个自动挤奶器,于是他只负责将豆子放在豆浆机,让牛到自动挤奶器旁边,等到豆浆机停下了,挤奶器停下了,小明就知道它的早餐好了,小明很满足~~

三、进入Java NIO

Java NIO的定义

什么是NIO呢?来看看他的全拼(java non-blocking IO(实际上是 new io))提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

NIO的特点:

  1. 既可以从通道中读取数据,又可以写数据到通到。流的读写通常是单项的。

  2. 通道可以异步读写

  3. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

Java NIO和IO的对比

IO NIO
面向流 面向缓存
阻塞IO 非阻塞IO
选择器

NIO有三个核心部分组成:

  1. Channel

    • FileChannel 从文件中读写数据。
    • DatagramChannel 能通过UDP读写网络中的数据。
    • SocketChannel 能通过TCP读写网络中的数据。
    • ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
    1
    2
    RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
    FileChannel inChannel = aFile.getChannel();
  2. Buffer

    1
    ByteBuffer buf = ByteBuffer.allocate(48);
    • 写入数据到Buffer
    • 调用flip()方法
    • 从Buffer中读取数据
    • 调用clear()方法或者compact()方法
  3. Selector

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Selector selector = Selector.open();
    channel.configureBlocking(false);
    SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
    while(true) {
    int readyChannels = selector.select();
    if(readyChannels == 0) continue;
    Set selectedKeys = selector.selectedKeys();
    Iterator keyIterator = selectedKeys.iterator();
    while(keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    .........
    keyIterator.remove();
    }
    }

    在这里我们看Selector,如果要使用他,我们需要进行注册Channel,调用其select()方法。

四、RPC(Remote Procedure Call Protocol)–远程过程调用协议

RPC定义

两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法(进程),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。而RPC就是客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就想调用本地对象一样

rpc-invoke

  1. 客户函数以正常的方式调用客户句柄。

  2. 客户句柄生成一个消息,调用本地的操作系统

  3. 客户端将本地的消息推送到远程的操作系统

  4. 远程的操作系统将消息交给了客户句柄

  5. 客户句柄将参数提取出来,调用服务器

  6. 6-10步重复上面的操作回到了客户函数

那么RPC是做了什么呢?封装图上的2~8步

所以看完这篇文章我们也就应该明白了,想要进行分布式搭建,那么就势必有着服务器之间的通信问题需要的着解决。通信问题又是非常重要的,所以简单介绍了一下网络的基础知识,我们从客户端传输的信息是如何进行传输的,在这里就利用到了I/O技术和NIO技术。进行一套通信又是如此的繁杂,在服务器之间的联系上需要经过十步操作才能到达发送端,那么有一些不需要我们进行必须操作,那么RPC就来了,他成功的帮助了我们解决掉了主机与主机间间通讯的问题,不得不说现在也有一些成熟的框架,比如说Dubbo,它的底层也是基于netty…..

本文参考链接

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×