- 博客(39)
- 收藏
- 关注
原创 支持连接池的netty client核心功能实现剖析
支持连接池的netty client核心功能实现剖析 本文为原创,转载请注明出处 源码地址: https://github.com/zhangxianwu/light-netty-client 1、连接池 由于TCP连接的建立和关闭分别会经历三次握手和四次挥手,而三次握手和四次挥手都是系统开销很大的操作。如果每次一个新的请求发起时,都为其新建一个连接,在请求处...
2015-01-28 17:15:58 820
原创 SFTP信任公钥配置及JSCH库
1、SFTP信用公钥配置1.1 客户端生成密钥对以DSA举例: ssh-keygen –t dsa执行该命令后,在home/用户名/.ssh目录下,会生成id_dsa和id_dsa.pub两个文件1.2 将id_dsa.pub公钥文件上传至服务端的home/用户名/.ssh目录下scp id_dsa.pub 用户名@服务端IP:/home/用户名/.ssh此时...
2014-07-08 16:36:46 660
MCS锁
1、 为什么要引入MCS锁? 在NUMA架构体系下,访问remote memory的速度要远远慢于访问local memory的速度。如下图所示(引自Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit): 在前一篇文章中分析了CLH算...
2014-05-10 15:27:15 347
原创 CLH锁
本文为原创,转载请注明出处1、为什么要引入CLH锁 在前一篇文章中,介绍了TAS、TTAS两种自旋锁。这两种锁的缺点是:任何一个处理器每一次对锁成功的访问(getAndSet(true)和set(false)任意一个方法的调用),都会将其他处理器的cache中的缓存失效掉。这样会导致以下后果:其他处理器无法再采用局部自旋的方式对相同数据进行访问,后续的其他处理器对锁的...
2014-05-09 16:07:50 282
原创 自旋锁和缓存一致性
本文为原创,转载请注明出处1、两种自旋锁的实现:TAS和TTAS1.1 TASclass TasLock { AtomicBoolean state = new AtomicBoolean(false); void lock() { while (state.getAndSet(true)) { ...
2014-04-26 10:15:23 326
并发浅析
之前做的项目里涉及到了一些并发问题,今天总结一下并发是由对共享资源的访问不当引起的,总的来说,常见的共享资源分为两大类:一种是数据库表中的行记录;一种是代码中的共享变量(譬如单例或者静态类型等等)。下面对这两类共享资源引发的并发问题借助一些实际的例子进行阐述。1.数据库表中的行记录共享此类资源共享导致并发问题的原因一般分为以下三类: 没有加锁 加锁的时机不对 加锁的顺序不...
2014-04-26 09:48:00 125
自旋锁和缓存一致性
1、两种自旋锁的实现:TAS和TTAS1.1 TASclass TasLock { AtomicBoolean state = new AtomicBoolean(false); void lock() { while (state.getAndSet(true)) { } } ...
2014-04-25 20:59:00 226
原创 ExecutorCompletionService分析及使用
ExecutorCompletionService分析及使用 当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一:通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成。如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那...
2013-12-29 16:54:34 183
原创 闭锁/栅栏/信号量/FutureTask分析及使用
闭锁/栅栏/信号量/FutureTask分析及使用 1、闭锁 用途:可用于命令一组线程在同一个时刻开始执行某个任务,或者等待一组相关的操作结束。尤其适合计算并发执行某个任务的耗时。 public class CountDownLatchTest { public void timeTasks(int nThreads, final Runnable task) ...
2013-12-18 20:06:17 188
原创 基于echo例子的netty4通信总结
本文为原创,转载请注明出处基于echo例子的netty4通信总结 在netty4源码分析系列文章中分别详细介绍了echo例子中涉及到网络通讯的每一个环节,本文对echo例子中服务端和客户端依次发生的步骤做个总结: 服务端依次发生的步骤建立服务端监听套接字ServerSocketChannel,以及对应的管道pipeline;启动boss线程,将ServerSock...
2013-11-08 17:48:51 173
原创 Netty4源码分析- read
本文为原创,转载请注明出处Netty4源码分析- read 当selector检测到OP_READ事件时,触发read操作://NioEventLoopif ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { ...
2013-11-07 19:06:46 195
原创 Netty4源码分析-flush
本文为原创,转载请注明出处 Netty4源码分析-flush Netty的写操作由两个步骤组成:Write:将msg存储到ChannelOutboundBuff...
2013-11-06 10:40:16 300
原创 netty 4源码分析-write
本文为原创,转载请注明出处netty 4源码分析-write Netty的写操作由两个步骤组成:Write:将msg存储到ChannelOutboundBuffer中Flush:将msg从ChannelOutboundBuffer中flush到套接字的发送缓冲区中。 本文介绍第一个步骤write//DefaultChannelHandlerCont...
2013-11-05 11:00:19 180
原创 netty4源码分析-accept
本文为原创,转载请注明出处netty4源码分析-accept 本文分析服务端如何accept客户端的connect请求,首先看下selector的I/O多路复用的分发逻辑://NioEventLoopprivate static void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {...
2013-09-13 10:56:17 183
原创 netty4源码分析-connect
本文为原创,转载请注明出处netty4源码分析-connect 客户端向服务端发起connect请求由以下代码触发:ChannelFuture f = b.connect(host, port).sync(); 调用Bootstrap的connect方法://Bootstrappublic ChannelFuture connect(String inetHo...
2013-09-06 15:06:25 268
原创 开放平台体系结构及网关分析
本文为原创,转载请注明出处开放平台体系结构及网关分析 开放平台以API的方式将公司的核心基础服务(譬如支付、交易等)开放给ISV(Independent Software Vendors,独立软件开发商),而这些功能由公司的各业务平台(为ISV提供API底层服务的提供部门)在开放平台的基础上,按一定的规范将其内部的数据或业务流程以API的形式提供给ISV。ISV基于这些基础...
2013-09-04 14:23:55 1210 1
原创 JAVA/PHP/C#版RSA验签
本文为原创,转载请注明出处JAVA/PHP/C#版RSA验签 本文是上一篇文章的兄弟篇,上篇文章介绍了客户端的sdk中如何基于JAVA/PHP/C#使用RSA私钥签名,然后服务端基于JAVA使用RSA公钥验签,客户端签名/服务端验签的模式只能帮助服务端检查客户端来的请求数据是否被篡改,同样的,客户端也需要对服务端的返回结果检查是否被篡改,因此就引出了本片文章。 ...
2013-08-23 14:34:57 155
原创 Netty4源码分析-NioEventLoop实现的线程运行逻辑
Netty4源码分析-NioEventLoop实现的线程运行逻辑 在netty服务端启动源码分析-线程创建一文中已分析SingleThreadEventExecutor所持有的线程的运行逻辑由NioEventLoop实现,那么本文就着手分析NioEventLoop实现的线程运行逻辑: // NioEventLoopprotected void run() { ...
2013-08-21 16:42:42 279
原创 netty4服务端启动源码分析-线程的创建
本文为原创,转载请注明出处netty4服务端启动源码分析-线程的创建 本文分析Netty中boss和worker的线程的创建过程:以下代码是服务端的启动代码,线程的创建就发生在其中。EventLoopGroup bossGroup = new NioEventLoopGroup(); NioEventLoopGroup的类关系图如下: 构造方法执行过程如下:...
2013-08-15 16:14:08 254
原创 netty4源码分析-bind
本文为原创,转载请注明出处netty4源码分析-bind 在前一篇文章中分析了监听套接字ServerSocketChannel的创建过程,本文接着分析绑定IP和端口的过程。 回到之前未分析完的doBind逻辑,前一篇文章已分析到dobind方法中initAndRegister方法,该方法最终触发了对regPromise 的listener的回调,Listener将bind任务加到b...
2013-08-13 19:15:03 209
原创 netty4源码分析-socket
本文为原创,转载请注明出处netty4源码分析-socket 服务端启动的第一步必须先创建一个监听套接字ServerSocketChannel,该过程是由ChannelFuture f = b.bind(port)中的bind触发。下面详细分析其过程: Bind源码如下,代码位于ServerBootstrap的父类AbstractBootstrap//A...
2013-08-12 15:00:07 118
原创 netty 4.x源码分析
netty 4.x源码分析 服务端需要经过socket、bind、accept、read、write等步骤,客户端需要经过socket、connect、read、write等步骤,后续此系列文章会对每一个步骤如何发生进行分析。 netty4源码分析-线程的创建netty4源码分析-socketnetty4源码分析-bind Netty4源码分...
2013-08-12 14:59:48 138
原创 分库分表对老业务功能带来的冲击
本文为原创,转载请注明出处分库分表对老业务功能带来的冲击 当业务量发展到一定的程度时,不可避免的需要对数据进行分库分表。以用户的签约数据为例,当用户量很少时,单库单表是可以满足的,但当用户量达到某个级别,譬如亿级,那么单库就会成为瓶颈,需要根据某种维度(譬如userId)来进行分库分表。分库分表如何实现本文就不阐述了,可以参考一下淘宝的tddl。本文主要阐述分...
2013-07-31 20:47:45 200
数据灰度发布中碰到的一个坑
在一个产品研发过程中,一般在发布前都有线下测试阶段,那么是不是线下测试验证通过后,就可以直接将产品的新代码发布上线,覆盖原来的版本呢?这样做其实有很大的风险,因为线下测试的运行环境和线上环境不是完全一致的,可能线下运行OK,到线上就出问题;另外,对于用户体验方面,在线下测试阶段的用户是不全的,只有测试、开发和PD等人,他们的体验不能完全代表线上的大量用户。另外还有性能方面的原因等等。所以,一般...
2013-05-03 16:51:57 1429
原创 基于velocity生成静态文件
在做开放平台的文档中心过程中,由于api文档不是经常变化的,所以如果每次页面渲染的时候,都去查询DB获取数据,这种性能浪费就太大了,而且文档中心是不需要登录就可以访问的,这样会给DB带来很大的压力。 对于这种情况,可以采用静态文件方案,基本思路如下:小二在后台发布api时,api管控后台基于velocity生成静态文档,并将该文档存储至共享文件目录,存储的完整路径根据预定的...
2013-04-25 19:44:09 195
原创 如何安全的更新java本地缓存
对于某类数据,如果读的频率远远大于写的频率,数据不会经常被修改,则最适合采用本地缓存。但使用缓存,不可避免的就需要对缓存进行更新。最近在做一个项目的时候,发现多个老系统里采用了一种不安全的更新方案,该方案的主要思路如下:/** 本地缓存 */private List<InterfaceConfig> configs = null;/** ...
2013-04-24 20:46:15 920
原创 java/php/c#版rsa签名以及java验签实现
在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一。由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本。譬如java、php、c#。另外,在电子商务尤其是支付领域,对安全性的要求比较高,所以会采用非对称密钥RSA 本文主要介绍如何基于java、php、c#在客户端使用rsa签名,然后在服务端使用Java验签。 基于...
2013-03-27 16:32:56 459 1
Php发送请求参数丢失问题以及中文乱码问题
最近由于开放平台项目的需要,在写php版的sdk,过程中碰到一些问题,做个记号,以免后面忘记 Php发送请求参数丢失: curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString, 0, -1)); $reponse = curl_exec($ch); 发现请求到达服务端后,postBody...
2013-03-20 20:05:48 137
原创 NIO+reactor模式的网路服务器设计方案
NIO+reactor 模式的网路服务器设计方案 1、前言 在前一篇文章中,介绍了基于 BlockingIO +thread-per-connection 的方案,由于该方案为每一个连接分配一个线程,而线程里的大部分操作都是阻塞式的,所以在高并发的情况下,会导致产生大量的线程,线程间的上下文切换会浪费大量的 CPU 时间,而且每个线程是需要占用堆栈空...
2012-12-16 16:59:37 123
原创 BlockingIO +thread-per-connection的网络服务器设计方案
BlockingIO +thread-per-connection的网络服务器设计方案 1、 前言 在 java1.4引入 NIO之前,网络服务器的典型实现方案是采用阻塞 IO+多线程模型,后来出现了非阻塞 IO( NIO),常用的实现方案则变成 NIO+Reactor模式,还有 NIO+proactor模式。本文主要是介绍阻塞 IO+多线程模...
2012-12-16 16:01:13 272
原创 HttpSession和ModelMap里存储变量名称重名问题
HttpSession和ModelMap里存储变量名称重名问题 在HttpSession里设置了某个属性譬如status,然后在controller里又在ModelMap里设置了同样的属性,譬如: httpSession.setAttribute(status, “VALID”);modelMap.addAttribute("status", “DEV”)...
2012-11-27 15:10:19 314
原创 jvm学习笔记2--虚拟机类加载机制
虚拟机类加载机制 生命周期从被加载到虚拟机内存,到卸载内存为止,包含7个阶段:加载 、验证、解析、 准备、初始化、使用、卸载。 验证、准备和解析统称为连接。 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,而解析则不一定,它可以在初始化阶段之后再开始,以支持java的运行时绑定。 2. 3种情况必须对类进...
2012-11-25 17:42:16 133
原创 jvm学习笔记1--内存区域与内存溢出
jvm学习笔记1--内存区域与内存溢出运行时数据区域组成 1.1 程序计数器 当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令。 为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,因此属于“线程私有”的内存。执行 java方法,则记录的是虚拟机字节码的...
2012-11-25 14:59:49 187
如何校验RSA公钥的合法性
最近在做开放平台相关的项目,外部开发者(isv)创建应用前,需要生成一对RSA公私钥对,私钥自己保留,公钥上传给我们。Isv的应用访问公司服务时,需要用私钥对请求进行加签,然后我们用他之前提供的公钥进行验签。 当isv将公钥上传后,需要对公钥的合法性进行验证,以下是验证工具类 /** * RSA密钥合法性验证器 * * @author xianw...
2012-11-21 17:43:08 3577
原创 基于拦截器和注解实现页面的访问权限控制
基于拦截器和注解实现页面的访问权限控制 在 web 系统中,经常需要对每个页面的访问进行权限控制。譬如,要进入 xx 公司的开放 平台, isv 需要注册成为开发者,开发者的状态有审核中、有效、冻结、拒绝、删除等状态,然后根据不同的状态,开发者可以访问不同的页面。只有有效或冻结状态可以访问只读功能的页面(即该页面的访问不会造成后台数据的变化),只有有效...
2012-11-21 16:56:04 331
原创 从url下载图片--java与python实现方式比较
一、java的实现方式首先读取图片//方式一:直接根据url读取图片private static BufferedImage read(String imageUrl) throws IOException { URL url = new URL(imageUrl); BufferedImage image = ImageIO.read(url); return ...
2012-10-14 20:01:34 149
原创 一篇codereview报告--类的职责分配与代码冗余
以下内容引自某个项目的一篇codereview报告 目前的codereview好像对代码的结构、代码的冗余关注的太少,这两天看了一下,发现xx系统里存在不少的冗余,这些都是由一些代码功能片段放置位置的不合理,类的职责分配不合理造成的。譬如:对于领域模型CreditCont,它的状态是否终止、有效、关闭;它是否已过期;它是否已生效等均属于领域模...
2012-08-23 19:06:15 972
原创 系统分析过程—确定关键技术方案的可行性
系统分析过程到底该做什么,仅仅是产出一份系统分析文档吗?个人认为,系统分析的最重要的产出之一就是确定关键技术方案的可行性。 对于一些关键技术的选择,首先肯定是先选择已成熟的方案,避免重复发明轮子,但要注意的是,没有一种技术是适合 所有场景的,成熟的方案不一定适合解决当前的需求。如果在系统分析阶段不把这个问题确定,到编码阶段突然发现之前分析设计的方案不可行,那么就会造成设计变更,增...
2012-08-19 17:26:44 1346
原创 并发浅析
之前做的项目里涉及到了一些并发问题,今天总结一下并发是由对共享资源的访问不当引起的,总的来说,常见的共享资源分为两大类:一种是数据库表中的行记录;一种是代码中的共享变量(譬如单例或者静态类型等等)。下面对这两类共享资源引发的并发问题借助一些实际的例子进行阐述。[color=blue][b]1.数据库表中的行记录共享[/b][/color]此类资源共享导致并发问题的原因一般分为以...
2012-04-22 18:04:33 100
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人