网络编程
文章平均质量分 93
kobejayandy
十多年互联网产品研发经验,历经华为、腾讯、字节跳动等公司,主要从事后端技术研发及技术管理工作(andyjaykobe)
展开
-
Netty源码解读(二)Netty中的buffer
上一篇文章我们概要介绍了Netty的原理及结构,下面几篇文章我们开始对Netty的各个模块进行比较详细的分析。Netty的结构最底层是buffer模块,这部分也相对独立,我们就先从buffer讲起。What: buffer二三事buffer中文名又叫缓冲区,按照维基百科的解释,是”在数据传输时,在内存里开辟的一块临时保存数据的区域”。它其实是一种化同步为异步的机制,可以解决数据传输的速转载 2014-02-16 21:51:02 · 2201 阅读 · 0 评论 -
ZeroMQ(java)中组件间数据传输(Pipe的实现)
在ZeroMQ(java)中,整个IO的处理流程都是分层来进行的,当然处于最下端的肯定是前面介绍过的poller以及StreamEngin了。。。。涉及到上层的话就还有session,以及socket,先用一张图来大概的描述一下整个层次关系吧。。整个分层的结构大概就是这样吧,其中poller与StreamEngin是怎么交互的,这个就不说饿了吧,然后Session这转载 2014-02-28 23:21:13 · 2366 阅读 · 0 评论 -
ZeroMQ(java)中监控Socket
基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情。。而且由于ZeroMQ中将连接的建立和重连接都进行了隔离,用户不需要做什么事情来维护连接,当然这样做的好处是使程序员的编码工作变少了,但是当然也有不好的地方,那就是用户失去了对ZeroMQ整个运行阶段的控制。。例如,当我们转载 2014-02-28 23:24:21 · 5078 阅读 · 1 评论 -
Jetty的Servlt请求路由与ContextHandlerColleection的实现
们一般会在tomcat下面部署多个应用,每个应用都对应着一个自己的context,那么就需要一个collection将他们管理起来,而且需要对http请求进行路由,将http请求交个相应的应用来处理。。。。这件事情在jetty中就是ContextHanlerCollection干的事情,它维护者当前jetty中部署的应用。。。将http请求交给匹配的context,然后context再转由转载 2014-02-28 23:45:34 · 2909 阅读 · 0 评论 -
Jetty的SelectChannelConnector分析
以前的一篇文章曾经分析过jetty的socketConnector,其实它的实现相对来说是比较简单的了,但是由于它是阻塞的io,所以在性能上并不好。。一般情况下都推荐使用SelectChannelConnector来替换掉。。。也就是所谓的NioConnectorSelectChannelConnector的实现就要复杂的多了。。而且因为将底层的io揉在了一起。。。。所以感觉这一块的代码不转载 2014-02-28 23:48:04 · 11788 阅读 · 0 评论 -
ZeroMQ(java)之Publish/Subscribe模式
前面的文章介绍了比较简单的Request/Subscribe模式, 这篇文章介绍更为经典的Publish/Subscribe通信模式用来ZeroMQ的实现,其通信方式如下图:客户端(subscriber)向服务器(publisher)订阅消息,然后服务器可以将消息推送到所有订阅了消息的客户端,这里也可以理解为广播吧。。。。好了,闲话不多说了,直接转载 2014-02-28 23:09:19 · 9264 阅读 · 0 评论 -
ZeroMQ(java)中对IO的封装(StreamEngine)
哎,各种各样杂七杂八的事情。。。好久没有看代码了,其实要搞明白一个与IO相关的框架,最好的办法就是把它的I/0的读写两个过程搞清楚。。。例如在netty中,如果能将eventLoop的运行原理搞清楚,然后摸清楚整个I/O读写两个过程,那么也就差不太多了。。。。这次来看看ZeroMQ(java)中如何来处理I/O的,先来看看一个类型的定义,IOObject类型,这个类型应该扮演的是工具类的形转载 2014-02-28 23:20:38 · 3005 阅读 · 0 评论 -
Jetty之AbstractHandler
因为要弄清楚java Web那一套东西,所以就要弄懂整个servlet定义的一些东西,那么就需要搞清楚servlet的容器是怎么搞的,其实最出名的servlet容器应该是tomcat吧,不过我准备拿jetty的源码开刀,因为它更轻量。。。这篇文章来看看AbstractHandler的定义吧,因为jetty可以说是面向handler的服务器,这一点课netty很相似。。。先来看看它的继承体系转载 2014-02-28 23:39:32 · 5057 阅读 · 0 评论 -
Jetty之HandlerWrapper与链式调用的实现
在以前读netty的代码的时候,有一个很重要的东西,那就是pipeline,在上面通过对参数的传递实现了handler的链式调用,在jetty中也涉及到链式的调用,不过它是基于装饰器模式来实现的...与netty的不一样...不过个人觉得还是netty的pipeline更加直观简洁吧.....HanlderWrapper从类型的名字就大概知道了它是对handler的一种包装....它是je转载 2014-02-28 23:41:43 · 3101 阅读 · 0 评论 -
ZeroMQ(java)之Router与Dealer运行原理
在开始这部分的内容之前,先来看看ZeroMQ中HWM概念---High-Water Marks当系统的数据量很大,而且发送频率很高的情况下,内存就很重要了,如果处理不好会出现很多问题,例如如下场景:A很快速的向B发送数据,但是B处理起来却很慢,这样子的话,数据就可能会在A的发送缓冲区,或者B的接收缓冲区累计起来....如果双方速度差太多,就很容易出现问题.......在Ze转载 2014-02-28 23:16:24 · 12713 阅读 · 1 评论 -
Jetty的ServletHandler分析
前面很多文章都提到过ServletHandler这种类型,它在整个http的处理中所占的位置如下:(1)connector -> (2)server->(3)contextHandlerCollection->(4)WebAppContext->(5)ServletHandler->(6)Servlet从上面整个http的处理过程来看,ServletHandler应该算得上是最接近转载 2014-02-28 23:49:31 · 8570 阅读 · 0 评论 -
Jetty之SocketEndPoint分析
这里Endpoint的概念可以按字面来当成是端点吧,因为TCP通信是双工的,那么就存在着两个端点。。。这里我们先来看看SocketEndPint的继承体系:这个够简单的吧,这几就是直线型的,那么这里我们先来看看EndPoint接口的定义吧:[java] view plaincopy//端点的定义 publ转载 2014-02-28 23:40:24 · 1746 阅读 · 0 评论 -
Netty源码解读(三)Channel与Pipeline
Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的“梦境”概念,希望大家喜欢。一层梦境:Channel实现概览在Netty里,Channel是通讯的载体,而ChannelHandler负责Channel中的逻辑处理。转载 2014-02-16 21:52:09 · 2281 阅读 · 0 评论 -
Netty源码解读(四)Netty与Reactor模式
一:Netty、NIO、多线程?时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手。前面的文章我们分析了Netty的结构,这次咱们来分析最错综复杂的一部分-Netty中的多线程以及NIO的应用。理清NIO与Netty的关系之前,我们必须先要来看看Reactor模式。Netty是一个典型的多线程的Reactor模式的使用,理解了这部分,在宏观上理解Netty的NI转载 2014-02-16 21:55:13 · 1772 阅读 · 0 评论 -
ZeroMQ(java)之Push/Pull模式
在ZeroMQ中并没有绝对的服务端与客户端之分,所有的数据接收与发送都是以连接为单位的,只区分ZeroMQ定义的类型,例如Response与Request,Publisher与Subscriber,Push与Pull等。。。例如在前面我们最开始的Response/Request模式,因为只有一个Response端,而有多个Request端,所以我们选择在Response端调用bind方法来转载 2014-02-28 23:10:46 · 9918 阅读 · 3 评论 -
ZeroMQ(java)之Router/Dealer模式
在开始之前先把guid里面提到的几个ZeroMQ的特性列一下吧:(1)ZeroMQ有自己的I/O线程来异步的处理I/O,而且后台采用了无锁的数据结构(2)在ZeroMQ中,所有的组件都可以动态的加入和移除,而且可以启动组件以任何的顺利,例如我们可以先启动request,再启动response,依然可以工作,而且还会自动的重连接。(3)如果有需要的话,会自动的将message转载 2014-02-28 23:12:06 · 18165 阅读 · 1 评论 -
ZeroMQ(java)之负载均衡
我们在实际的应用中最常遇到的场景如下:A向B发送请求,B向A返回结果。。。。但是这种场景就会很容易变成这个样子:很多A向B发送请求,所以B要不断的处理这些请求,所以就会很容易想到对B进行扩展,由多个B来处理这些请求,那么这里就出现了另外一个问题:B对请求处理的速度可能不同,那么B之间他们的负载也是不同的,那么应该如何对请求进行分发就成了一个比转载 2014-02-28 23:17:15 · 9795 阅读 · 2 评论 -
ZeroMQ(java)之I/O线程的实现与组件间的通信
算是开始读ZeroMQ(java)的代码实现了吧,现在有了一个大体的了解,看起来实现是比较的干净的,抽象什么的不算复杂。。。这里先来看看它的I/O线程的实现吧,顺带看看是如何实现组件的通信的。。。。首先要搞清楚I/O线程的实现,就先要弄懂一个类型,Poller(zmq.Poller.java),可以将其看成是对selector的一个封装,同时它还要管理定时事件,看了这么多代码,发现转载 2014-02-28 23:19:00 · 3624 阅读 · 0 评论 -
Jetty之WebAppContext
前面的文章已经提到过,在servlet容器中,每一个webapplication都对应一个contextHandler,但是前面讲到的contextHandler的定义主要是实现了将http的请求进行路由,将其交给sessionHandler,然后再交给servletHandle然后转交给对应的servlet的来进行处理。。。这里的WebAppContext是对其的一种补充,完善了weba转载 2014-02-28 23:44:42 · 19241 阅读 · 0 评论 -
ZeroMQ(java)中的数据流SessionBase与SocketBase
前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO,通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维护Selector对象,然后用IOObject对象来具体的管理SelectableChannel对象在Poller上面的注册,以及事件回调,他们之间的关系可以用下面的图形来简单的描述一下:转载 2014-02-28 23:22:37 · 1910 阅读 · 0 评论 -
Jetty之ContextHandler
这篇文章要分析的类型是非常重要的一个类型...ContextHandler,从名字上来看就是上下文的handler...这里普及一下知识:每一个WebApp都对应相应一个context,那么也就对应一个contextHandler当servlet容器收到外部的http请求之后,会根据其请求的path信息来找到相应的webapplication来处理,也就是要找到对应的context转载 2014-02-28 23:43:39 · 7039 阅读 · 0 评论 -
Java的ClassLoader分析与Jettty的WebAppClassLoader
classLoader,从名字就可以知道,用于加载class的东西。我们知道在java中,源文件是会被编译成class文件的,我们的程序的运行也是需要依赖这些编译成字节码的class文件,而这些字节码文件就必须要被classLoader加载到内存之后才能使用。。。如果classLoader无法加载到我们要用的类型的class文件,那么将会抛出classnodfound的异常。。。先转载 2014-02-28 23:46:45 · 1065 阅读 · 0 评论 -
Netty高性能之道
1. 背景1.1. 惊人的性能数据最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高转载 2014-12-14 23:22:38 · 2081 阅读 · 0 评论 -
Netty服务器线程模型概览
目录[-]一切从ServerBootstrap开始boss线程和worker线程worker线程的生命周期(life circle)减少worker线程的处理占用时间利用netty框架自带的ExecutionHandler一切从ServerBootstrap开始ServerBootstrap 负责初始话netty服务器,并且开始监听端口的sock转载 2014-12-22 00:20:12 · 1557 阅读 · 0 评论 -
ZeroMQ(java)之Requerst/Response模式
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些分布式的环境下,可以极大的方便整个系统的实现。。。。例如如下的形式:在中间通过一个消息中间件,可以很方便的将各个woker的数据发送到最终的统计服务器来做数据的转载 2014-02-28 23:07:49 · 16903 阅读 · 3 评论 -
Netty系列之Netty百万级推送服务设计要点
1. 背景1.1. 话题来源最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类:Netty是否可以做推送服务器?如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端?使用Netty开发推送服务遇到的各种技术问题。由于转载 2015-06-01 23:16:17 · 4146 阅读 · 1 评论 -
Netty通信网络参数配置
Netty服务端/客户端网络通信过程中常用的参数: NameAssociated setter method"writeBufferHighWaterMark"默认64 * 1024(用法未知)"writeBufferLowWaterMark"默认32 * 1024(用法未知)转载 2015-07-09 22:34:28 · 8590 阅读 · 0 评论 -
高并发下的 Nginx 优化
过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行.有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用apt-get,yu转载 2015-07-12 18:04:15 · 2391 阅读 · 0 评论 -
Nginx Upstream Keepalive配置
Nginx 1.1.14版本以前与后端upstream服务器建立的都是短链接,即通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close"。这样nginx往upstream后端发请求时,也会消耗很多的时间与带宽,如果让nginx与upstream后端建立起长链接,从nginx发起的请求就可以挑选一个合适的长链接发往upstream后端服务器,这样即可以节转载 2015-07-13 23:59:53 · 6928 阅读 · 0 评论 -
Netty3 VS Netty4 之线程模型
下面小节我们就详细得对Netty3和Netty4版本的I/O线程模型进行对比,以方便大家掌握两者的差异,在升级和使用中尽量少踩雷。1 Netty 3.X 版本线程模型Netty 3.X的I/O操作线程模型比较复杂,它的处理模型包括两部分:Inbound:主要包括链路建立事件、链路激活事件、读事件、I/O异常事件、链路关闭事件等;Outbound:主要包括写事件、连接转载 2016-03-27 15:45:05 · 9729 阅读 · 0 评论 -
TCP 的那些事儿(上)
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相转载 2014-08-29 23:30:12 · 1245 阅读 · 0 评论 -
Netty实现原理浅析
Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 究。如果下面的内容有错误或不严谨的地方,也请指正和谅解。对于Netty使用者来说,Netty提供了几个典型的example,并有详尽的API doc和guide doc,本文的一些内容及图示也来转载 2014-04-25 00:14:17 · 2234 阅读 · 0 评论 -
Netty服务器线程模型概览
一切从ServerBootstrap开始ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求。12345678910bootstrap bootstrap = newServerBootstrap(转载 2014-04-19 22:56:51 · 1452 阅读 · 0 评论 -
Jetty之SocketConnector
首先说一下connector这东西是干嘛用的。。。。其实按照字面的意思大概就能知道它是用于接收和维护与远程的连接的。。。。它会利用建立的serversocket。。。这里还需要说明一下。。。一般情况下不应该使用这个类型的。。因为还有NIO的实现。。。但是我之所以先看SocketConnector是因为它的实现更简单一些。。先从简单的做起嘛。。毕竟他们上层的接口都是一样的。。。。。转载 2014-02-28 23:41:23 · 4240 阅读 · 0 评论 -
Netty初步之Hello World
Java的学习是从Hello word开始的,Netty也从这里开始吧。这里的例子比较简单,后面会慢慢的对Netty的一些复杂应用、Netty的原理进行一些解析。本文主要是列举Netty初步使用的一个最基本的例子,具体的说明在代码中都有了,所以也不再重复。1、ClientThread.java[java] view plaincopypa转载 2014-02-18 23:43:50 · 4164 阅读 · 0 评论 -
Jetty的Server创建与启动
其实不管是tomcat还是jetty,他们在启动的时候要做的事情都差不太多。。。无非就是下面的内容:(1)创建用于连接的connector,创建线程池,(2)扫描当前的web程序的部署目录,为他们创建上下文环境,并对他们进行path的路由设置(3)初始化创建的web程序上下文,这里就包括创建servlet啥的。,初始化linstener啥的。并做好自己的path路由转载 2014-03-02 15:40:54 · 18543 阅读 · 1 评论 -
Jetty中Web程序的创建与启动
在前面的文章中就已经提到过,在jetty中,我们部署的每一个web应用程序都对应着一个webAppContext。。。因此在jetty中,web应用程序的创建与启动说白了就是WebAppContext的创建于启动。。。在前面我们还分析过ContextHandlerCollection这个类型,它可以看成是WebAppContext的容器,我们常见的部署方法就是在jetty中部署多个转载 2014-03-02 15:41:56 · 11758 阅读 · 0 评论 -
Jetty总体设计框架图
其实读jetty的代码到现在,对整个jetty服务器的运行以及实现概况都已经有了大体的了解,这篇文章就先对整个jetty的实现设计做一个简单的概述吧。。。。先来一张图来描述一下整个jetty服务器的整体结构。。。这里只是只是将一些重要的主线部分给画了出来。。并没有描述一些细节,例如contextListener,sessionHandler什么的。。。转载 2014-03-02 15:42:42 · 1705 阅读 · 1 评论 -
Nginx/Netty/ZeroMQ网络模型
突发奇想,想写一篇综合性的,就算算是对到现在为止读过的框架这方面的一个总结吧,先来点客套话吧,嗯,为啥会有线程或者进程模型这种东西,因为计算机CPU主频已经很难再提高了,现在更倾向于设计多核系统,那么要发挥现在计算机的处理能力,就需要将系统设计成支持多处理器的,最简单的那肯定就是多线程(进程)程序了。。。尤其是在网络编程中,特别是对于每个事物都是独立的情况下,例如没有会话的HTTP请求啥的转载 2014-03-02 16:51:30 · 9938 阅读 · 0 评论 -
Netty的核心组件
ChannelA nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind. ChannelFactoryThe main interface to a transport that creates a Chan原创 2014-02-19 22:42:53 · 3091 阅读 · 0 评论