网络IO
文章平均质量分 93
weixin_42073629
这个作者很懒,什么都没留下…
展开
-
RestTemplate源码浅析
近几年来,以信息为中心的表述性状态转移(Representational State Transfer,REST)已经称为替代传统SOAP Web 服务的流行方案。REST与RPC几乎没有任何关系。RPC是面向服务的,并关注于行为和动作;而REST是面向资源的,强调描述应用程序的事物和名词。RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。 其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。原创 2021-07-04 16:16:29 · 296 阅读 · 2 评论 -
RestTemplate实践
在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。这里介绍的是RestTemplate。什么是RestTemplate?RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷原创 2021-07-04 16:13:45 · 728 阅读 · 2 评论 -
websocket之三:Tomcat的WebSocket实现
Tomcat自7.0.5版本开始支持WebSocket,并且实现了Java WebSocket规范(JSR356 ),而在7.0.5版本之前(7.0.2版本之后)则采用自定义API,即WebSocketServlet。本节我们仅介绍Tomcat针对规范的实现。根据JSR356的规定,Java WebSocket应用由一系列的WebSocket Endpoint组成。Endpoint是一个Java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体WebSocket消息的接口,就像Se原创 2021-06-21 00:39:25 · 2237 阅读 · 0 评论 -
websocket之二:WebSocket编程入门
一、WebSocket客户端websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信。在websocket中有两个方法: 1、send() 向远程服务器发送数据 2、close() 关闭该websocket链接 websocket同时还定义了几个监听函数 1、onopen 当网络连接建立时触发该事件 2、onerror 当网络发生错误时触发该事件 3、onclose 当websocket被关闭时触发该原创 2021-06-21 00:32:08 · 2046 阅读 · 0 评论 -
websocket之一:websocket简介
Websocketwebsocket为一次HTTP握手后,后续通讯为tcp协议的通讯方式。WebSocket 使用一种被称作“Upgrade handshake(升级握手)”的机制将标准的 HTTP 或HTTPS 协议转为 WebSocket。因此,使用 WebSocket 的应用程序将始终以 HTTP/S 开始,然后进行升级。这种升级发生在什么时候取决于具体的应用;可以在应用启动的时候,或者当一个特定的 URL 被请求的时候。在我们的应用中,仅当 URL 请求以“/ws”结束时,我们才升级协议原创 2021-06-21 00:25:17 · 480 阅读 · 0 评论 -
单服务器最大tcp连接数及调优汇总
启动线程数:启动线程数=【任务执行时间/(任务执行时间-IO等待时间)】*CPU内核数最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比。如果任务都是CPU计算型任务,那么线程数最多不超过CPU内核数,因为启动再多线程,CPU也来不及调度;相反如果是任务需要等待磁盘操作,网络响应,那么多启动线程有助于提高任务并发度,提高系统吞吐能力,改善系统性能。单机最大tcp连接数网络编程在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接原创 2021-06-20 23:44:11 · 377 阅读 · 0 评论 -
Java NIO系列教程(八)JDK AIO编程
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果。通过java.util.concurrent.Future类来表示异步操作的结果; 在执行异步操作的时候传入一个java.nio.channels。CompletionHandler接口的实现类作为操作完成的回调。NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它对应UNIX网络编程中的事件驱动I/O(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮原创 2021-06-20 01:35:41 · 247 阅读 · 0 评论 -
Java NIO系列教程(七) selector原理 Epoll版的Selector
jdk/src/solaris/classes/sun/nio/ch/DefaultSelectorProvider.javapublic static SelectorProvider create() { String osname = AccessController .doPrivileged(new GetPropertyAction("os.name")); if (osname.equals("SunOS"))原创 2021-06-20 01:21:46 · 456 阅读 · 0 评论 -
Java NIO系列教程(六) 多路复用器Selector
多路复用器Selector是Java NIO编程的基础,熟练地掌握Selector对于掌握NIO编程至关重要。多路复用器提供选择已经就绪的任务的能力。简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。 一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用原创 2021-06-20 00:22:22 · 562 阅读 · 0 评论 -
Java NIO系列教程(五)Buffer
Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。交互图如下:缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。原创 2021-06-20 00:14:22 · 170 阅读 · 0 评论 -
Java NIO系列教程(四) Scatter/Gather
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将原创 2021-06-20 00:01:14 · 132 阅读 · 0 评论 -
Java NIO系列教程(三) Channel之Socket通道
本章节介绍socket通道类。一、Socket通道 新的socket通道类可以运行非阻塞模式并且是可选择的。这两个性能可以激活大程序(如网络服务器和中间件组件)巨大的可伸缩性和灵活性。本节中我们会看到,再也没有为每个socket连接使用一个线程的必要了,也避免了管理大量线程所需的上下文交换总开销。借助新的NIO类,一个或几个线程就可以管理成百上千的活动socket连接了并且只有很少甚至可能没有性能损失。所有的socket通道类(DatagramChannel、SocketChannel和Serve原创 2021-06-17 23:57:32 · 1206 阅读 · 1 评论 -
Java NIO系列教程(二) Channel通道介绍及FileChannel详解
Channel是一个通道,可以通过它读取和写入数据,它就像自来水管一样,网络数据通过Channel读取和写入。通道与流的不同之处在于通道是双向的,流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类),而且通道可以用于读、写或者同事用于读写。因为Channel是全双工的,所以它可以比流更好地映射底层操作系统的API。特别是在UNIX网络编程模型中,底层操作系统的通道都是全双工的,同时支持读写操作。NIO中通过channel封装了对数据源的操作,通过channel原创 2021-06-17 23:42:40 · 642 阅读 · 0 评论 -
Java NIO系列教程(一) Java NIO 概述
一、阻塞IO与非阻塞IO阻塞IO: 通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有20原创 2021-06-14 20:05:26 · 166 阅读 · 0 评论 -
I/O模型之四:Java 浅析I/O模型(BIO、NIO、AIO、Reactor、Proactor)
一、传统的BIO网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口,Socket负责发起连接操作,连接成功之后,双方通过输入和输出流进行同步阻塞式通信。1.1、BIO通信模型图首先,我们原创 2021-06-14 17:09:21 · 183 阅读 · 0 评论 -
I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor
平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点;Reactor 和 Proactor 是基于事件驱动,在网络编程中经常用到两种设计模式。说到异步IO,其实现在很难实现真正的异步,大部分情况下仍然需要阻塞在某个多路复用函数,比如select 或者 epoll 上,得到就绪描述符,然后调用注册在相应描述符上的回调函数。这种方式是现在的反应堆设计的基本思路。我截原创 2021-06-14 16:50:44 · 305 阅读 · 0 评论 -
I/O模型之二:Linux IO模式及 select、poll、epoll详解
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。本文讨论的背景是Linux环境下的network IO。一、 概念说明在进行解释之前,首先要说明几个概念:- 用户空间和内核空间 - 进程切换 - 进程的阻塞 - 文件描述符 - 缓存 I/O1.1、用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的原创 2021-06-14 16:41:18 · 270 阅读 · 0 评论 -
I/O模型之一:Unix的五种I/O模型
基本 Linux I/O 模型的简单矩阵:每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。Unix的五种I/O模型: 阻塞I/O:应用程序调用一个IO函数,导致应用程序阻塞,如果数据已经准备好,从内核拷贝到用户空间,否则一直等待下去 非阻塞I/O: I/O复用(select和poll) 信号驱动I/O(SIGIO) 异步I/O(Posix.1的aio_系列函数) Unix的一个输入操作一般有两个不同的阶段:1、等待数原创 2021-06-14 16:22:54 · 156 阅读 · 0 评论
分享