分布式系列二:分布式系统的通信(代码片段)

walkinhalo walkinhalo     2022-12-31     749

关键词:

通信是分布式架构的一个基本问题, 通信是基于通信协议, 通过网络IO来实现的, 基本的通信协议有TCP,HTTP,UDP等, Java的IO分为BIO,NIO,AIO等, java领域有很多支持通信的技术, 如RMI,MINA,JMS等.

网络协议

  • TCP/IP:

    五层模型: 基于OSI七层模型. 包含: 应用层,传输层(TCP/IP协议),网络层(ICMP,IGMP),链路层,物理层. OSI还包含表现层,会话层.

    三次握手:

    技术分享图片

    Dos攻击就是在第三步发生, 发送大量连接请求, 使网络处在半连接状态. server端的连接未完成, 导致阻塞.

    四次挥手:

    TCP协议是全双工的, 全双工是双方可以相互发起通信, 数据可以往两个方向传输; 半双工是某个阶段只能一方传输; 单工是只能一方往另一方传输数据.

    技术分享图片

  • UDP/IP:

阻塞的概念

了解阻塞, 就首先需要了解TCP传输协议的缓存区概念.

应用层发送数据的时候, 首先数据会暂存到传输层的缓存区.

数据传输的时候有个滑动窗口的概念, 窗口的大小可以控制, 这样可以保证接收方缓存区不够大导致缓存溢出. 窗口的数据全部发送且接收方确认收到后才可以向前继续滑动.

发送方和接收方均有缓存区, 当缓存区满(或空, 分别对应写和读)的时候就会发生阻塞, 必须等缓存区有足够空间容纳更多数据的时候才能继续发送或接收.

阻塞分为BIO(同步阻塞),NIO(同步非阻塞, 同路复用技术,netty等使用这种方式),AIO(异步非阻塞, java7开始)

阻塞和非阻塞, 同步和异步分开理解比较好.阻塞和非阻塞是针对调用者, 阻塞是缓冲区读写没有数据的时候线程等待, 非阻塞是缓冲区读写没有数据时立即返回, 线程去做其他的事情; 同步和异步是针对被调用者, 被调用者处理时不返回时, 调用者需要等待结果是同步, 被调用者立即返回,同时做处理时异步.

Java 网络通信

TCP Socket通信

// 服务端
public class SocketServer 
    public static void main(String[] args) throws IOException 
        ServerSocket serverSocket = null;

        try
            serverSocket = new ServerSocket(8888);
            Socket socket= serverSocket.accept();
            // 缓冲区读取
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(reader.readLine());
            reader.close();
            socket.close();
        catch (Exception e)

        finally 
            if(serverSocket!=null)
                serverSocket.close();
            
        
    


//客户端
public class SocketClient 
    public static void main(String[] args) throws IOException 

        try
            Socket socket = new Socket("localhost",8888);
            PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);
            writer.println("this is a message from client");
            writer.close();
            socket.close();
        catch (Exception e)

        finally 

        
    

Multicast 多播, 使用UDP协议

// 服务端
public class MulticastServer 
    public static void main(String[] args) throws IOException, InterruptedException 
        // 多播必须是224网段
        InetAddress group = InetAddress.getByName("224.7.8.9");
        MulticastSocket socket = new MulticastSocket();
        for (int i = 0; i < 10; i++) 
            String data = "multcast"+i;
            byte[] bytes = data.getBytes();
            socket.send(new DatagramPacket(bytes,bytes.length,group,8888));
            TimeUnit.SECONDS.sleep(2);
        
    


// 客户端
public class MulticastClient 
    public static void main(String[] args) throws IOException, InterruptedException 
        // 多播必须是224网段
        InetAddress group = InetAddress.getByName("224.7.8.9");
        MulticastSocket socket = new MulticastSocket(8888);
        socket.joinGroup(group);
        byte[] buf = new byte[32];
        while (true)
            DatagramPacket packet = new DatagramPacket(buf,buf.length);
            socket.receive(packet);
            String reveived = new String(packet.getData());
            System.out.println("received:"+reveived);
        
    

分布式事务系列二:tcc(代码片段)

基于消息的分布式事务处理机制基于消息的分布式事务处理机制可以总结为如下两个阶段:第一阶段:在事务发起方的本地事务中产生消息。在第一篇文章的例子中,是在transaction写入操作的同一个数据库事务中记录... 查看详情

rabbitmq实战:理解消息通信(代码片段)

本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。前段时间总结完了「深入浅出MyBatis」系列,对MyBatis有了更全面和深入的了解,在掘金社区也收到了一些博友的喜欢,很高兴。另外,短暂的陪产假就要结束... 查看详情

重学springcloud系列八之分布式系统流量卫兵sentinel(代码片段)

重学SpringCloud系列八之分布式系统流量卫兵sentinelsentinel简介与安装一、Sentinel是什么?Sentinel分为两个部分:二、单机版下载安装下载启动开放防火墙端口登录客户端集成与实时监控二、微服务集成Sentinel客户端实战流控规则-QP... 查看详情

tensorflow中的通信机制——rendezvousgrpc传输(代码片段)

...单机的异构训练框架,在迭代到0.8版本开始正式支持多机分布式训练。与其他分布式训练框架不同,Google选用了开源项目gRPC作为TensorFlow的跨机通信协议作为支持。gRPC的编程和使用其实是相对复杂的,TensorFlow为了能让gRPC的调用... 查看详情

kafka系列二:多节点分布式集群搭建(代码片段)

上一篇分享了单节点伪分布式集群搭建方法,本篇来分享一下多节点分布式集群搭建方法。多节点分布式集群结构如下图所示:  为了方便查阅,本篇将和上一篇一样从零开始一步一步进行集群搭建。一、安装Jdk  具体安装... 查看详情

spark系列(十五)——sparkstreaming整合flume(代码片段)

一、简介ApacheFlume是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中。SparkStraming提供了以下两种方式用于Flume的整合。二、推送式方法在推送式方法(Flume-sty... 查看详情

重学springboot系列之整合分布式文件系统(代码片段)

重学SpringBoot系列之整合分布式文件系统文件本地上传与提供访问服务复习文件上传目录自定义配置文件上传的Controller实现写一个模拟的文件上传页面,进行测试MinIO简介与选型介绍为什么使用MInIO替换了FastDFS理由一:安... 查看详情

分布式事务系列一:base,一种acid的替代方案(ebay分布式事务解决方案)(代码片段)

前言对于很多业务系统来说,整个系统其实是由多个独立的系统构成的。这些独立的系统由各自的研发小组进行研发和维护,数据往往也存储在各自独立的数据库中。我们以下单流程为例。下单往往涉及到订单系统、库... 查看详情

redis系列分布式锁实现方案详解(setnxluaredissonredlock等)(代码片段)

文章目录前言方案一:SETNX+EXPIRE方案二:SETNX+value值是(系统时间+过期时间)方案三:使用Lua脚本(包含SETNX+EXPIRE两条指令)方案四:SET的扩展命令(SETEXPXNX)方案五:SETEXPXNX+校验唯一随机值... 查看详情

redis系列分布式锁实现方案详解(setnxluaredissonredlock等)(代码片段)

文章目录前言方案一:SETNX+EXPIRE方案二:SETNX+value值是(系统时间+过期时间)方案三:使用Lua脚本(包含SETNX+EXPIRE两条指令)方案四:SET的扩展命令(SETEXPXNX)方案五:SETEXPXNX+校验唯一随机值... 查看详情

分布式系列一:概述

分布式系统的特点高并发,大流量(qps,tps)海量数据什么是分布式分布式系统是由很多计算机组成,他们之间的通信通过网络连接完成,对外表现为一个整体.分布式技术上需要解决两个问题,一个是业务拆解,一个是节点通信.分布式和... 查看详情

zookeeper(代码片段)

一、相关概念分布式系统:是一个硬件或软件组件分布在网络中的不同的计算机上,彼此间仅通过消息传递进行通信和协作的系统。特征:分布性、并发性、缺乏全局时钟、故障必然会发生典型问题:通信异常、网络分区、三态... 查看详情

分布式理论与zookeeper相关概念(代码片段)

分布式理论与ZooKeeper相关概念文章目录分布式理论与ZooKeeper相关概念一、分布式系统与CAP、BASE理论1.1分布式系统和集群1.2CAP理论1.3BASE理论二、分布式一致性协议2.12PC和3PC2.2Paxos算法2.3Raft协议三、ZAB——ZooKeeper的分布式一致性协... 查看详情

分布式系统理论:一致性协议paxos

分布式系统理论(二):一致性协议Paxos摘要:分布式系统理论第二章,此系列主要以理论为主。Paxos算法Paxos算法是莱斯利·兰伯特(LeslieLamport)于1990年提出的一种基于消息传递的一致性算法。 Paxos 算法是一个解决分布... 查看详情

java开发人员不得不收集的代码,不愧是大佬(代码片段)

并发模型和分布式系统很相似并发模型其实和分布式系统模型非常相似,在并发模型中是线程彼此进行通信,而在分布式系统模型中是 进程 彼此进行通信。然而本质上,进程和线程也非常相似。这也就是为什么并... 查看详情

pytest学习系列_插件之分布式执行(代码片段)

一、前言  在我们进行接口自动化的时候,用例往往有成百上千上万条用例,串行执行时间在分钟或者是小时级别。虽然能满足我们一般的回归性测试需求,但是还是对于企业级别的项目来说,还是显得有些力不从心。那么有... 查看详情

消息中间件rabbitmq的使用(代码片段)

...机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。当下主流的消息中间件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等2、消息中间件主要... 查看详情

springcloudalibaba系列dubbo基础入门篇(代码片段)

文章目录Dubbo-基础入门篇一、分布式系统中的相关概念1.大型互联网项目架构目标(1)特点(2)衡量网站的性能指标(3)目标2.集群和分布式3.架构演进(1)单体架构(2)垂直架构(3&#... 查看详情