Fork me on GitHub

NIO网络通信

阻塞式IO与非阻塞式IO

传统的IO流都是阻塞式的。也就是说,当一个线程调用read() 或write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务。因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理,当服务器端需要处理大量客户端时,性能急剧下降。

Java NIO是非阻塞模式的。当线程从某通道进行读写数据时,若没有数据可用时,该线程可以进行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行I0操作,所以单独的线程可以管理多个输入和输出通道。因此,NIO可以让服务器端使用一个或有限几个线程来同时处理连接到服务器端的所有客户端。

mark

阅读更多...

NIO与通道数据传输

NIO的通道

通道( Channel) :由java.nio.channels包定义的。Channel 表示IO源与目标打开的连接。Channel类似于传统的“流”, 只不过Channel本身不能直接访问数据,Channel只能与Buffer进行交互。

应用程序与磁盘之间的数据写入或者读出,都需要由用户地址空间和内存地址空间之间来回复制数据,内存地址空间中的数据通过操作系统层面的IO接口,完成与磁盘的数据存取。在应用程序调用这些系统IO接口时,由CPU完成一系列调度、任务分配,在早期这些IO接口都是由CPU独立负责。所以当发生大规模读写请求时,CPU的占用率很高。

mark

阅读更多...

NIO与缓冲区

mark

Java NIO简介

Java NIO (New IO/Non Blocking IO),官方给的定义是New IO,但是我们也可以当作是Non Blocking IO,即非阻塞式IO,是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支 持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。

阅读更多...

SYN Cookie

mark

SYN泛洪攻击

SYN攻击其实就是Server收到Client的SYN,Server向Client发送SYN-ACK之后未收到Client的ACK确认报文, 这样服务器就需要维护海量的半开连接 ,等待客户端的 ACK, 最终导致服务器资源耗尽(sync queue 满)而丢弃新的连接。 Server会不断重发SYN-ACK,Linux服务器默认直到63秒才断开连接!

其中一种防护方式是SYN Cookie, SYN Cookies 的应用允许服务器当 SYN 队列被填满时避免丢弃连接。相反,服务器会表现得像 SYN 队列扩大了一样。服务器会返回适当的SYN+ACK响应,但会丢弃 SYN 队列条目。如果服务器接收到客户端随后的ACK响应,服务器能够使用编码在 TCP 序号内的信息重构 SYN 队列条目。

阅读更多...

服务注册与发现

mark

本篇主要讲述了微服务架构的组成,每个组件的作用是什么,重点是实现了Eureka Server和Eureka Client的实战演练,总体来说服务注册与发现就是微服务入门的基础,了解并掌握了在SpringCloud体系中的服务注册与发现的组件原理以及使用方法,由于start.spring.io的访问速度实在是不能忍,白天自己编译了整个SpringBoot的初始化器,我直接给出地址了,方便其他的朋友也可以用:

  • http://139.159.234.67:8080
  • http://zouchanglin.cn:8080 就是上面的IP地址

如果还是很慢的话,可以下载我编译好的文件(下载地址),直接

1
java -jar Spring-Initializr.jar

在IDEA自定义初始化器地址填写 http://localhost:8080 即可,注意这个版本是没有Web UI的,只有供三分初始化器使用的JSON串,Web UI几乎不咋用所以没考虑编译进来!

阅读更多...

Golang工程管理

工作区介绍

Go代码必须放在工作区中。工作区其实就是一个对应于特定工程的目录,它应包含3个子目录: src目录、pkg目录和bin目录。

  • src目录:用于以代码包的形式组织并保存Go源码文件。 (比如: .go .c .h .s等)
  • pkg目录:用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的.a归档文件
  • bin目录:与pkg目录类似,在通过go install命令完成安装后,保存由Go俞令源码文件生成的可执行文件

目录src用于包含所有的源代码,是Go命令行工具一个强制的规则,而pkg和bin则无需手动创建,如果必要Go命令行工具在构建过程中会自动创建这些目录

需要特别注意的是,只有当环境变量GOPATH中只包含一个工作区的目录路径时,go install命令才会把命令源码安装到当前工作区的bin目录下。若环境变量GOPATH中包含多个工作区的目录路径,像这样执行go install命令就会失效,此时必须设置环境变量GOBIN。

阅读更多...

Golang函数相关

本文主要记录了Golang的函数定义,可变参数,函数返回值,函数类型匿名函数和闭包, 延迟调用,变量的作用域以及如何获取命令行参数,Golang是可以有多个返回值的,这一点能干很多事情,函数类型的主要功能在于回调和多态的实现,就像函数指针一样,用起来也很方便!

阅读更多...
  • © 2018-2020 changlin zou
    • Page View:
    • Unique Visitor:

请我喝杯咖啡吧~

支付宝
微信