自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (4)
  • 收藏
  • 关注

原创 Thrift源码分析(八)--总结加一个完整的可运行的Thrift例子

前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解。Thrift源码分析(一)-- 基本概念Thrift源码分析(二)-- 协议和编解码Thrift源码分析(三)-- IDL和生成代码分析Thrift源码分析(四)-- 方法调用模型分析Thrift源码分析(五)-- FrameBuffer类分析Thrift源码分析(六)-- Transpo

2014-09-30 16:32:58 7211

原创 Thrift源码分析(七)-- TServer服务器分析

Thrift采用了TServer来作为服务器的抽象,提供了多种类型的服务器实现。用TServerTransport作为服务器的Acceptor抽象,来监听端口,创建客户端Socket连接先来看看TServerTransport。主要有两类1. TNonblockingServerTransport和TNonblockingServerSocket作为非阻塞IO的Acceptor,封装了

2014-09-30 16:20:24 6924

原创 Thrift源码分析(六)-- Transport传输层分析

RPC作为一种特殊的网络编程,会封装一层传输层来支持底层的网络通信。Thrift使用了Transport来封装传输层,但Transport不仅仅是底层网络传输,它还是上层流的封装。关于Transport的设计,从架构上看,IO流和网络流都是IO的范畴,用一个统一的接口来抽象并无不可,但是个人感觉看Thrift的代码时,都用的Transport来表示流,不知道是普通IO流还是底层的网络流。还不如

2014-09-30 13:58:03 10383

原创 Thrift源码分析(五)-- FrameBuffer类分析

FrameBuffer是Thrift NIO服务器端的一个核心组件,它一方面承担了NIO编程中的缓冲区的功能,另一方面还承担了RPC方法调用的职责。FrameBufferState定义了FrameBuffer作为缓冲区的读写状态private enum FrameBufferState { // in the midst of reading the fra

2014-09-30 11:34:06 7193

原创 Thrift源码分析(四)-- 方法调用模型分析

RPC调用本质上就是一种网络编程,客户端向服务器发送消息,服务器拿到消息之后做后续动作。只是RPC这种消息比较特殊,它封装了方法调用,包括方法名,方法参数。服务端拿到这个消息之后,解码消息,然后要通过方法调用模型来完成实际服务器端业务方法的调用。这篇讲讲Thrfit的方法调用模型。Thrift的方法调用模型很简单,就是通过方法名和实际方法实现类的注册完成,没有使用反射机制,类加载机制。

2014-09-30 10:12:46 6250 2

原创 聊聊高并发(二)结合实例说说线程封闭和背后的设计思想

高并发问题抛去架构层面的问题,落实到代码层面就是多线程的问题。多线程的问题主要是线程安全的问题(其他还有活跃性问题,性能问题等)。那什么是线程安全?下面这个定义来自《Java并发编程实战》,这本书强烈推荐,是几个Java语言的作者合写的,都是并发编程方面的大神。线程安全指的是:当多个线程访问某个类时,这个类始终都能表现出正确的行为。正确指的是“所见即所知”,程序执行的结果和你所预想的结

2014-09-25 09:51:52 10478 7

原创 聊聊高并发(一)背景及大纲

我有幸参与了几个高并发项目的开发,之前参与设计和开发了一款答题手游的服务器端代码,并在上线后和同事奋战了几个昼夜解决上线后出现的高并发问题,目前该游戏已经运行稳定了几个月,日活在百万级别。和一些大型购物网站比起来,百万级别算不上高,但是麻雀虽小,五脏俱全,代码处理并发的设计思路和解决方案大致是相同的。这几天翻看别人写的博客,大家都很关心并发的问题,也涉及到了实际处理并发的总总技术。结合

2014-09-25 09:47:38 8727 5

原创 Thrift源码分析(三)-- IDL和生成代码分析

IDL是很多RPC框架用来支持跨语言环境调用的一个服务

2014-09-24 14:10:11 11330 1

原创 Thrift源码分析(二)-- 协议和编解码

协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用。Thrift的协议比较简单,它把协议和编解码整合在了一起。抽象类TProtocol定义了协议和编解码的顶层接口。个人感觉采用抽象类而不是接口的方式来定义顶层接口并不好,TProtocol关联了一个TTransport传输对象,而不是提

2014-09-23 14:16:14 11606 1

原创 Thrift源码分析(一)-- 基本概念

我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架。公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开发效率。Thrift源于Facebook, 目前已经作为开源项目提交给了Apahce。Thrift解决了Facebook各系统的大数据量传输通信和内部不同语言环境的跨平台调用。Thrift的官

2014-09-23 11:56:27 12333

原创 Netty5源码分析(八) -- 总结

这个系列通过七篇文章,结合Netty5的原代码1. 分析了服务器绑定端口的过程,从整体上可以看到Netty执行的流程和主要组件2. 分析了Netty的线程模型,解析了Reactor模式。很多人都不理解这块,被EventLoop的名称和复杂的类层次所迷惑3. 通过比较使用Java原生的NIO API来编程的流程,再分析了Netty是如何把这些基本流程封装地,进一步地理清了Netty的封装

2014-09-23 10:34:05 3204

原创 Netty5源码分析(七) -- 异步执行Future和Promise

java.util.concurrent.Future是Java提供的接口,表示异步执行的状态,Future的get方法会判断任务是否执行完成,如果完成就返回结果,否则阻塞线程,直到任务完成。// Java FutureTask.get()public V get() throws InterruptedException, ExecutionException { i

2014-09-23 09:42:20 8805

原创 Netty5源码分析(六) -- CodeC编解码分析

Netty5的CodeC编解码对以往的版本进行了简化,没有单独的Encoder / Decoder接口,都继承了ChannelHandlerApdater类,来实现ChannelHandler接口。对Decoder来说,主要有两个顶层的抽象类,一个是从字节流到消息的ByteToMessageDecoder,一个是中间消息到业务消息的MessageToMessageDecoder。B

2014-09-22 17:45:59 5199

原创 Netty5源码分析(五) -- ByteBuf缓冲区

Netty的ByteBuf缓冲区实现地比Java本身的ByteBuffer更加灵活,方便。它的类结构也比较复杂,这里只说ByteBuf核心的几个要点。1. 最重要的是要理解为什么要ByteBuf这个组件。主要还是因为基于select / poll / epoll这种IO多路复用技术的NIO是非阻塞同步IO的模型,由于是同步IO,需要用户线程自己来处理IO的读写,由于是非阻塞的,每次调用

2014-09-22 16:31:21 5602

原创 Netty5源码分析(四) -- 事件分发模型

所谓Netty5的事件分发模型,主要指的是ChannelPipline, ChannelHandlerContext, ChannelHandler, Unsafe ChannelHandlerInvoker这几个核心接口之间的交互模型。首先是ChannelPipline接口,它是Netty中事件分发的路径。每个Channel都会绑定一个ChannelPipeline来分发事件。p

2014-09-22 12:26:50 4083

原创 Netty5源码分析(三) -- Channel如何注册OP_ACCEPT, OP_READ, OP_WRITE

抛开Netty,一个典型的Java NIO服务端开发需要做几件事:1.  创建ServerSocketChannel,设置为非阻塞,并绑定端口2. 创建Selector对象3. 给ServerSocketChannel注册SelectionKey.OP_ACCEPT事件4. 启动一个线程循环,调用Selector的select方法来检查IO就绪事件,一旦有IO就绪事件,就通知用

2014-09-19 11:44:43 9060

原创 Netty5源码分析(二) -- 线程模型分析

线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证。Netty5的类层次结构和之前的版本变化很大,网上也有很多文章写Netty的线程模型,Reactor模式,比如这篇http://blog.csdn.net/xiaolang85/article/details/37873059, 应该是引自《Net

2014-09-18 18:11:02 6062

原创 Netty5源码分析(一) -- 服务器绑定过程分析

Netty5的类层次结构相比于之前版本有了很大的变化,我准备写一系列文章来分析Netty5的源码。这篇讲讲服务器绑定的过程。一个典型的Netty5服务器端代码如下,首先需要提供两个EventLoopGroup线程池,在随后的文章中会分析Netty的线程模型,这里只需要知道两个线程池,bossGroup是用来接受客户端TCP连接,workGroup是用来处理IO事件。然后指定采用何种Ch

2014-09-17 22:22:22 5176 2

原创 几种分布式调用技术的比较 -- RPC VS REST

我之前在传统IT公司干活,后来来了互联网,感受到了很多不同,其中有一点就是两者使用到的技术有一些差别。比如说分布式调用技术。我在的这家公司内部的服务架构是基于Thrift的,服务基于Thrift进行发布,以至于很多人没有听过、使用过Web Service。话说传统IT传了很多年的SOA就是基于Web Service,已经有了一整套完整的理论和产品进行支持,互联网竟然很多没涉及过。后来想了想

2014-09-17 14:06:24 19961 4

原创 TCP三次握手和四次握手最直接的理解

网上有很多文章讲TCP为什么建立连接时需要三次握手,关闭连接时需要四次握手,讲了很多原理,反而让很多人难以理解。其实只有一句话:TCP连接是两个端点之间的事,由于TCP连接是可靠连接,所以不管是建立连接还是关闭连接,需要两个端点都要发送请求和收到确认其次要理解TCP的通道是全双工的,是可以读和写数据的,理解这个之后就明白了为什么关闭连接时需要四次握手。首先讲三次

2014-09-17 11:06:53 3094

原创 理解WSDL,IDL

很多RPC技术都会使用中间语言来定义接口描述,比如Web Service常用的WSDL, Thrift使用的IDL。这类文件都是接口定义/描述语言 (Interface Definition/Description Language),有几个特点:1. 采用中间语言来描述接口,以及接口使用到的数据结构(类)2. 一般都采用文本文件,方便传递3. 语法上可以使用XML,也可以

2014-09-17 09:58:00 3704 1

原创 Netty的几个要点

Netty是一个传输层的框架,主要的功能就是两个:封装了NIO的操作,封装了CodeC接口,从而使得NIO的开发者只需要关注与业务功能本身的ChannelHandler。不只是Netty,传输层主要解决的问题就是这两个,处理IO,处理CodeCCodeC主要处理的问题就是字节流的分帧(Frame),一般有以下几种按结束符,比如http定长使用消息头消息体的方式,在消

2014-09-16 15:26:58 3778 2

原创 《Netty权威指南》私有协议开发的可运行源代码分享

之前看了《Netty权威指南》一书,第14章用整个章节介绍了如何设计和实现一个简单的私有协议,内容很好,但是作者提供的代码片段有很多错误,根本不可能正确编译。比如MarshallingEncoder这个类是Netty提供了JBoss Marshalling的一个适配类,它的encode方法是protected,不是public,并且其中用到的ChannelBufferByteOutput类是

2014-09-16 14:53:17 8539 17

原创 关于软件架构设计的一些思考--通用架构设计模式

最近在着手设计一个服务发布,治理的框架,参考了几个主流框架的代码,比如阿里的Dubbo,传输层的Netty,容器层的Tomcat等等,有一些体会。经典的《面向对象分析与设计》一书中阐述了为什么设计是按层次划分的,种种好处自己去翻书,总结这么多框架,有一些架构设计的基本模式可以抓住。通用的设计,尤其是大型的框架可以分为4层:接口层,抽象层,流程实现与适配层,具体实现层。接

2014-09-16 11:44:50 3810 1

原创 深入理解非阻塞同步IO和非阻塞异步IO

这篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/hguisu/article/details/7453390很多人对阻塞 / 非阻塞, 同步 / 异步 的概念理解的不深入,搞不清楚非阻塞和异步IO的区别,笼统的认为非阻塞IO就是异步IO。其实区别很大,编程模型完全不同。阻塞 / 非阻塞描述的是函数,指访问某个函数时是否会阻塞线程(bl

2014-09-15 13:45:05 19725 8

原创 NIO的写操作分析

很多人对NIO的写操作理解的不深,不知道为什么要注册写事件,何时注册写事件,为什么写完之后要取消注册写事件。Selector.isWriteable()方法监控的是内核的写缓冲器是否可写,所以除非内核的写缓冲区满了,否则一旦一个SocketChannel注册了写事件,每次selector都会选中这个SocketChannel,进入到isWriteable()分支中去。实际上

2014-09-15 12:46:07 4893

聊聊锁的那些事

包括硬件,操作系统的一些核心概念 线程,进程的实现原理 锁的原理 各种自旋锁算法 Java synchronized内置锁的实现原理 Java并发包的多种同步工具类的实现原理

2015-09-22

深入理解Java内存模型

Agenda: •什么是Java内存模型JMM •内存可见性 •有序性 •指令重排序 •内存屏障 •顺序一致性与Happens-before规则 •volatile, synchronized, 原子变量,锁, final的原理

2015-09-22

数据系统实现

数据库原理的经典书籍,描述了数据库原理,对于想深入理解数据库的人员有很大的指导意义

2014-10-24

jsr133.pdf

Java内存模型JSR官方文档,定义了Java内存模型的概念模型涉及到的所有方面,对理解JMM有很大的帮助

2014-10-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除