Jetty源码剖析系列(3)-Connector如何接收处理网络请求

在本系列的第一篇提到,Jetty由Connector组件负责接收网络请求,如下图: ServerConnector是Jetty Connector的实现类,我们直接看它的doStart方法: 它先是调用了父类AbstractNetworkConnector的doStart方法: 这个父类的doStart方法先是调用了open方法,注意这里实际调用的是ServerConnector实现的open方法: 它先是调用openAcceptChannel方法来创建一个NIO的ServerSocketChannel: 上面的就是一个经典的NIO ServerSocketChannel创建过程:先是ServerSocketChannel.open(),然后再把ServerSocketChannel的ServerSocket绑定到相应的InetSocketAddress,熟悉的配方,熟悉的味道:) 再回到ServerConnector的open方法,它拿到这个ServerSocketChannel后,会调用它的configureBlocking方法,把它设置为阻塞的,这里其实是为了设置它的ServerSocket在调用accept方法的时是阻塞模式(即调用accept方法就会进入线程阻塞直到有网络连接进来)。 我们再回到AbstractNetworkConnector的doStart方法,当它执行完open方法打开ServerSocketChannel后,接着会调用它的父类AbstractConnector的doStart方法: »

Read More

Scalable IO in Java解读

大神Doug Lea的Scalable IO in Java,篇幅虽短,但大家之作,高屋建瓴,有如内功心法。每当我在对NIO的一些东西不甚了解的时候,翻出它来仔细研读,总能找到我想要的答案。 当今基于TCPIP的网络应用服务(分布式?),大多数都有着类似的结构(流程): 从底层IO读取网络字节请求 把读取的网络字节请求进行解码,封装成为业务请求对象 对解码封装后的业务请求对象进行业务处理 将业务逻辑处理完后的响应进行编码为底层IO可传输的字节响应 利用底层IO发送已编码的字节响应 整体流程如上图所示,但具体每一步所用到的技术手段有可能都不一样,比如解码协议是自定义的还是业界流行的?(比如是用XML还是JSON, »

Read More

旧文一篇-我的2015之跳槽

2015年年底我从HSBC跳槽出来后,在我原来的博客写下了这篇文章,当时被黑客派收录,但后来我的VPS被黑了后,博客也挂了,也没有存档,所以 我也早就忘了我还写过这篇文章。 后来我进爱立信广研的时候,这篇文章不知道被哪位同事在黑客派看到然后发到广研的微信大群里面,结果让我好生尴尬。 时光荏苒,岁月如梭,光阴似箭,白驹过隙,斗转星移,潜龙勿用,亢龙有悔,How time flies..... 又逢岁末,自然不能免俗地想来做个年终总结,今天又恰好是我在爱立信广州研发中心工作了整整一个月,就应景总结一下这次的跳槽历程。 其实我想离开 »

Read More

Spring Boot源码剖析系列(1) - 启动

写好一个启动类,Application,然后通过Spring Boot将它启动: 顺流而下, SpringApplication.run(): 从上面的run方法看到,启动类将会作为SpringApplication的构造函数的参数,而main方法的参数将会作为run方法的参数。 我们再来看SpringApplication的构造函数: initialize方法,一看名字就知道不一般,我们来仔细分析一下初始化了么。它首先是把启动类加到sources里, 接着判断是否是为web environment,调用了deduceWebEnvironment方法: 它是到classpath里面是否有javax.servlet.Servlet和org.springframework.web.context.ConfigurableWebApplicationContext这两个类,只有这两个类都存在, »

Read More

Spring Boot学习笔记(1)

1.如果想用Maven来build一个executable的基于SpringBoot的jar包,可以用Spring Boot Maven Plugin。只需要将以下配置加到pom.xml的plugins里面: 这个配置将会把在Maven package时创建的jar或者war重新打包,在target目录下,你会发现除了有两个jar包,其中一个带着original后缀,这个是由maven package创建的,而没带original后缀的就是由Spring Boot Maven Plugin重新打包的: $ mvn package $ ls target/*.jar target/myproject-1. »

Read More

Jetty源码剖析系列(2)-web.xml的解析与执行

当用Jetty来启动一个web项目的时候, Jetty会去读取war包的WEB-INFO目录里面的web.xml文件,然后解析这个web.xml。那这一步是什么时候进行和整个过程是怎样的?我们一起来分析一下。 以用Jetty Runner来启动一个war包为例, 在org.eclipse.jetty.runner.Runner类的configure方法里,我们看到它先构建出一个WebAppContext: 上面的代码中我们要注意webapp.setConfigurationClasses(_plusConfigurationClasses)这一句,我们先来看看_plusConfigurationClasses是什么东西: 我们可以看到就是一个String数组,里面包含了各种Configuration类的类名,这里我们要注意的是WebXmlConfiguration这个类,一看名字就知道是跟web.xml有关的: »

Read More

Jetty源码剖析系列(1)

Jetty是Eclipse Foundation出的一个轻量级Web服务器和Servlet容器。Spark使用了Jetty作为它的内嵌服务器。我一直都对Web服务器有着迷之兴趣,前前后后去读过好几个Web服务器的源码,有代码量太大设计模式复杂而半途而废的,如Tomcat,有因为代码量小而简单而读完的,如NanoHTTPD。相比之下,Jetty大小适中,而且也够成熟,之前在工作中写的一个项目就是用了Jetty Runner来实现了一个RESTful Service。这段时间重新去学习了一遍Java NIO,所以这次就趁机把Jetty的源码好好撸一遍。 Jetty Version: 9.4.5 Let's hit on »

Read More

给博客添加了留言评论功能

Ghost没有built in的留言评论功能,但它支持通过第三方平台来留言评论。它的官方指南里提供了几个第三方平台。我选了Disqus。方法很简单,就是先在Disqus上注册一个账号,设置你的博客地址,然后将Disqus生成的一段JavaScript的脚本放到你的Ghost的theme里面的post.hbs文件里面,重启Ghost就可以了。效果如下图: 感觉还不错哦。 只是不知道有没有什么安全隐患。先适用一段时间再看看。或许我可以自己实现一个留言评论功能。 Update: 原来Disqus被天朝屏蔽掉了,所以如果不翻墙的话,是无法给本博客留言评论的,也看不到。。。。。 »

Read More

NanoHTTPD源码剖析

NanoHttpd是一个用Java写的HTTP服务器,堪称蝇级,但麻雀虽小,五脏俱全,在GitHub上有着两千多个Star,甚为可观。 我之前有读过好几个Java的HTTP Server的源码,有Tomcat,Jetty,Spark(一个内嵌了Jetty的RESTful Framework),Undertow(JBoss出的一个轻量级Web Server),Vert.x等等,但它们的代码量都不小,同时还糅合了各种设计模式,很容易就迷失在里面各种细节当中。 这个NanoHttpd相比之下就简单得多,正如它的名字所说的,纳米级的HTTP Daemon,只需要对Java »

Read More

Java URL类源码剖析

前几天重新把URL厘清了一下(这里), 趁热打铁,把JDK的URL类源码也仔细读了,务求把URL的方方面面都了然于胸。 注:在此用的JDK8的版本。 首先,URL在java.net这个包,类签名如下: public final class URL implements java.io.Serializable 可见URL是一个final类,即URL类无法被继承,并实现了Serializable接口,即URL对象可被序列化。 再看URL主要的实例属性: private String »

Read More