- 博客(54)
- 问答 (1)
- 收藏
- 关注
使用HttpClient做请求响应中转
现网中有个应用A,之前一直是请求透传访问的,最近从安全方面考虑将该A应用不直接暴露给客户端访问,而是从有一定安全校验机制的应用B做访问入口,由B的后端将HTTP请求中转到A,再将A的响应通过B输出到客户端。这种方案有两个好处,1.可以利用应用B已有的安全校验机制,而不需要应用A再复制一份安全校验。2.原来在客户端需要同时访问应用A和应用B,这就涉及到浏览器的同源策略的安全性问题,所以在配置上必...
2016-08-29 15:11:15 1341
基于Gor实现流量复制(加middleware功能增强)
最近做功能重构,在上线前要求验证重构后的代码与老代码实现逻辑是否一致,基于这个需求,需要在生产环境做一个功能将生产服务器上的流量复制一份发送到测试服务器上。 就这个事情这几天考察了三种技术,1.基于nginx+lua脚本,2.tcpcopy,3.gor。这里大概说一下这三种方案: 1.nginx+lua脚本这种方案的思路是在生产服务器前端架一层壳子,将请求拦截,然后基于...
2016-07-18 17:33:00 1365
使用源码编译安装nginx
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息。 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好。 我是在centos平台下的,所以编译环境使用如下指令 安装make:yum -y install gcc automake autoconf libtool make 安装g++:...
2016-07-14 14:54:01 223
一个线上JVM的CPU资源占用过高问题的排查
上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题了,现在将问题排查步骤总结记录一下。 1.通过top命令查看当前机器的CPU使用情况此时发现如果是Java的进程占用过高,并且一直下不来,则排查是什么线程导致占比过高。以图中进程举例,假如发现PID为31357的Java进程占CPU比一直很高,则记录下它的PID 2...
2016-04-23 23:47:53 906
spring事务异常回滚使用注意点
最近写了一个后台定时任务用于自动扣款,测试时还好好的,上线后第一次执行处理也没问题,到第二次执行时,发现并没有生成数据,一开始以为是Redis判断时出了问题,导致后面的方法没执行,但是查询线上的redis相关日期key的value,发现是正确的。 定时任务的方法代码如下: /** * 自动收款第一次 <br> * 每天15点触发 ...
2016-03-07 20:27:56 646
mybatis的org.apache.ibatis.builder.IncompleteElementException问题
一上午被mybatis的这个问题搞得都没法工作,springboot启动一直报错:2016-02-19 12:47:45.380 [localhost-startStop-1] WARN o.a.c.loader.WebappClassLoaderBase - The web application [ROOT] appears to have started a thread name...
2016-02-19 13:02:12 258
Tomcat7中NIO处理分析(二)
6.PollerEvent处理流程Poller处理的核心是启动执行事件队列中的PollerEvent,接着从selector中遍历已经就绪的key,一旦发生了感兴趣的事件,则交由processSocket方法处理。PollerEvent的作用是向socket注册或更新感兴趣的事件: /** * * PollerEvent, cacheable obje...
2015-11-15 15:50:40 207
Tomcat7中NIO处理分析(一)
Tomcat的Connector有三种运行模式bio、nio、apr,先了解一下这三种的区别。bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。一般而言,bio模式是三种运行模式中性能最低的一种。2.nio(new I/O),是Java ...
2015-11-15 15:02:15 626
略谈软件本质复杂性——再读《人月神话》
上周逛山西路军人俱乐部,偶然看见《人月神话》40周年中文纪念版,翻了几页感觉不错,就买回来看看。记得大学时老师推荐过,一晃过去了十年,工作也有八年了,如果是刚毕业或只做几个人的小项目时读这书跟做过几个数十人到数百人的项目之后再读感觉肯定大不同。书的开头就说明这里谈的是大型系统的开发,如果一直是几个人的小团队看到书里的论述或许会觉得匪夷所思。主要内容实际才二百多页,却经常有闪光的格言警句给予你阅读...
2015-08-10 15:32:06 1378
Java中ArrayList循环遍历并删除元素的陷阱
Java中的ArrayList循环遍历并且删除元素时经常不小心掉坑里,昨天又碰到了,感觉有必要单独写篇文章记一下。 先写个测试代码:import java.util.ArrayList;public class ArrayListRemove { public static void main(String[] args) { ArrayList<Str...
2015-04-17 16:11:07 417
推荐给毕业季跳槽季的Java码农们《关于Java集合的小抄》
午休时间看了江南白衣的最新博文《关于Java集合的小抄》,总结的还不错,正值毕业季、找工作季、跳槽季。。。蛮适合各位依然奋斗在背负无数骂名的Java码农一线的程序员参考 业务代码写久了算法类的东西就容易忘,很多源码当时看的时候茅塞顿开,三年后再面对(卧槽!who are u) ...
2015-04-15 14:09:18 134
数据库,终究还是数据结构
好久不写博客了,也是ITEYE最近的首页文章实在太水,来逛的少。最近在看淘宝沈询的博客文章,讲数据库方面的理论和实践,科普性的小文,有时来点小幽默,看起来蛮轻松。微博上也大概录了二十条笔记,现在满脑子各类数据结构的特性,如范围查找、读写性能、是否面向磁盘结构、并行指标、内存占用。像把大学时学的不怎么好的数据结构重新捡起了理了一遍,当时觉得这一大坨各种烦人还绕人的数据结构究竟有啥用(其实现在工作...
2015-02-05 15:29:32 130
外系统单个功能页面嵌入填坑记
最近在做项目的涉及嵌入旧系统页面部分,前后一个多月时间,里面踩到各种坑,不写篇文章记录一下感觉都对不起这辛酸历程。 1.两个系统js操作跨域问题一般来说企业应用系统登录成功之后的主要操作界面如下: 可以看到整个操作界面实际上是由多个iframe组成的,我们的需求是嵌入【功能页面显示区域】的页面,但这些页面很多情况下会取父页面上的js变量值,这就需要新系统在嵌入页面时模拟出旧系统...
2014-09-12 13:14:52 587
为黑客正名——《黑客与画家》读后感
这样的书值得一版再版,更值得我这样的人一读再读。 如果不是上周末听Podcast时池建强也提到了它,这本书不知将在我的kindle里睡到何时。节目里提到了这本“名著”(擦,这竟然是本名著,现在只有用这样猛的字眼才能引起我的注意,好像我又错过了什么?),听完我赶紧从kindle列表最后一页调出了这本书,记得当时纯粹是因为译者阮一峰才买的,之后却没怎么看过,电子书方便倒是方便,却总是买了一...
2014-07-08 13:39:23 133
《大型网站系统与JAVA中间件开发实践》读后感
最近买的技术书比较多,一本还没看完又来一本,前端、后端都涉足一些,可惜都不深,这点需要改进,持续一段时间思考一个方面的问题这样的效果应该会好点。具体这本书已经忘了当时从哪儿看到的介绍,发现一堆业界名人的推荐,到豆瓣看了看目录和评论,当然三百来页也是个重要指标(估计一到两周也就看完了),于是就下单买了。这段时间Tomcat源码分析暂停,有些思路没理清,看着看着就看到别的框架上了,注意力不够集中,...
2014-06-05 18:20:46 114
Tomcat7中的JMX使用(二)Dynamic MBean
如上一篇文章所见Standard MBean在Tomcat的例子并不多,在jconsole中所看到的大量MBean(如Catalina下的Connector、Engine、Server、Service等),实际上是动态MBean(Dynamic MBean)。本文主要讲述Tomcat7中如何通过动态MBean的方式构造MBean的。 接触过动态MBean的朋友一定知道,它的实例肯...
2014-05-12 08:48:23 249
Tomcat7中的JMX使用(一)Standard MBean
做过Java平台下的应用服务器监控的对JMX应该不会陌生,简单说,JMX就是提供了一个标准的管理方案的框架。这里所说的管理的含义包括监控平台运行状况、应用级别配置资源、收集应用统计数据、调试、监视服务器性能,JMX 允许你将所有的资源(硬件和软件)打包成java 对象,然后将他们暴露在分布式环境中,并且JMX 提供了一个机制,可以很简单的将既存的管理协议,如SNMP ,映射到JMX 自己的管理...
2014-05-10 13:41:51 210
javascript中div不响应onkeydown事件问题及解决
这两周被js坑了好几次,所以最近几篇写写这个,记录下被坑的日子。 这次有一个需求,要做一个类似百度搜索之类的效果出来,输入拼音字母,直接列出与该拼音相关的中文结果。效果如下:这里我是通过在js中动态添加div的方式来做的,即每一行结果一个div。问题来了,需要支持在输入框中按下向下键时光标即移到下一行的【充值金额查询(渠道)】。我给这些js写的div都注册了onkeydown事件,...
2014-03-31 14:36:13 3765
javascript中循环添加事件时的闭包问题解决
这是一个经典问题,只不过有一段时间不写纯js了,最近老是掉进以前跌过的坑,这次花了半天时间爬出来,所以记录一下。 昨天写js代码在给自定义的div注册onclick事件时发现得到的值始终是循环里的最后一个层里的值。最早的代码: for(var i in array){ var rowDiv = document.createElement("div"); rowDi...
2014-03-27 11:49:30 189
《浏览器网络技术》读后感
最近买了Kindle Paperwhite2,出差不用带厚重的书了,背包轻了很多。不足的是亚马逊的电子书不多,很多出版社新出的书支持Kindle的也不多,相对来说图灵社区的电子书已经不少了。闲话不扯,就说说在它那儿买的这边《浏览器网络技术》吧。 原书英文名《High Performance Browser Networking》,微博上对英文版的评价还是比较高的,可惜咱英语不够,这本中...
2014-03-24 20:22:24 525
Ad-hoc线程封闭
最近重新在读《Java并发编程实战》这本书,早上看到线程封闭这一节,讲线程封闭的三种方式:Ad-hoc线程封闭、栈封闭、ThreadLocal封闭。后两种我能理解,第一种实在以前没接触过,不行,这事不了解个究竟不算完。 按照这本书的翻译“Ad-hoc线程封闭是指,维护线程封闭性的职责完全由程序实现来承担。Ad-hoc线程封闭是非常脆弱的,因为没有任何一种语言特性,例如可见性修饰符或局部...
2013-11-18 14:33:00 1212
原创 高性能服务器架构
最近忙于项目上线,源码分析的文章暂停一段时间,这里主要贴一些最近读到的比较好的文章,蓝色粗体的字是我个人所做的评论。 高性能服务器架构 引言本文将与你分享我多年来在服务器开发方面的一些经验。对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或者请求的服务程序,网络服务器更符合这种情况,但并非所有的网络程序都是严格意义上的服务器。使用“高性能请求处理程序”是一个很糟...
2013-10-29 17:43:05 118
走出类加载器迷宫
这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜相应的中文资料,感觉很多意思没有翻译出来,这两天我试着自己翻译了一下,供同道参考。英文文章地址:Find a way out of the ClassLoader maze 走出类加载器迷宫(本人翻译,转载请注明出处) 系统类加载器, 当前类加载器, 上下文类加载器? 你应该用哪一个?By Vladimir Rou...
2013-10-16 13:16:28 152
原创 Find a way out of the ClassLoader maze
Find a way out of the ClassLoader mazeSystem, current, context? Which ClassLoader should you use?By Vladimir Roubtsov, JavaWorld.com, 06/06/03June 6, 2003When should I useThread.getContextCl...
2013-10-12 16:53:22 143
Tomcat7自动加载类及检测文件变动原理
在一般的web应用开发里通常会使用开发工具(如Eclipse、IntelJ)集成tomcat,这样可以将web工程项目直接发布到tomcat中,然后一键启动。经常遇到的一种情况是直接修改一个类的源文件,此时开发工具会直接将编译后的class文件发布到tomcat的web工程里,但如果tomcat没有配置应用的自动加载功能的话,当前JVM中运行的class还是源文件修改之前编译好的class文件...
2013-09-26 17:53:10 246
原创 Java远程通讯可选技术及原理
好文不该被埋没,之前转了一篇Java中各种通信协议性能数据比较的文章,被批评概念杂糅,术语使用不严谨。这里转一篇与其论域相似,讲的稍微系统点的文章,淘宝的毕玄大神几年前写的,文中我认为比较精彩的地方已用蓝色字体标识。因为此文是作者几年前的思考,某些术语较真起来有点问题,比如http其实是基于tcp之上的一层协议,把它与tcp、udp并立讨论有点奇怪。还有NIO的框架只介绍了mina,能介绍...
2013-09-23 14:36:28 143
Tomcat7中web应用加载原理(三)Listener、Filter、Servlet的加载和调用
前一篇文章分析到了org.apache.catalina.deploy.WebXml类的configureContext方法,可以看到在这个方法中通过各种setXXX、addXXX方法的调用,使得每个应用中的web.xml文件的解析后将应用内部的表示Servlet、Listener、Filter的配置信息与表示一个web应用的Context对象关联起来。这里列出configureConte...
2013-09-20 15:04:41 419
Tomcat7中web应用加载原理(二)web.xml解析
前一篇文章讲了org.apache.catalina.startup.HostConfig的lifecycleEvent方法中所做的事情。最后看到在Tomcat启动时或启动后(后台线程定时扫描)会调用HostConfig类的deployApps方法: /** * Deploy applications for any directories or WAR files th...
2013-09-19 08:44:06 321
Tomcat7中web应用加载原理(一)Context构建
为什么关心Tomcat中一个web应用的加载过程?在前面的文章中看过多次Tomcat的组件结构图,这里再贴出来回顾一下:之前的《Tomcat7启动分析》系列文章中看到Tomcat启动的时候将会解析server.xml,根据里面所配置的各个节点信息逐一初始化和启动相应组件(即分别调用它们的init和start方法),但浏览一下Tomcat7源码中的server.xml的内容,里面对应上图中的...
2013-09-10 17:11:12 237
Tomcat7中一次请求处理的前世今生(四)Tomcat7阀机制原理
通过前面的三篇文章看到了一次客户端连接在Tomcat内部被转换成了请求对象(org.apache.catalina.connector.Request类的实例),并在该请求对象内部将与本次请求相关的Host、Context、Wrapper对象的引用。本文主要分析该请求对象在容器内部流转的经过。再来看一下Tomcat7内部的组件结构图:其实这张图已经给出了答案,在Connector接收到...
2013-08-31 17:10:50 223
Tomcat7中一次请求处理的前世今生(三)请求与容器中具体组件的匹配
前一篇文章分析到了org.apache.coyote.http11.AbstractHttp11Processor类process方法,以解析请求头的getInputBuffer().parseRequestLine方法调用为例,看到如何从Socket的IO流中取出字节流数据,根据Http协议将字节流组装到Tomcat内部的org.apache.coyote.Request对象的相关属性中。...
2013-08-30 15:34:08 252
Tomcat7中一次请求处理的前世今生(二)Socket连接转换成内部请求对象
先抛开之前所看到的Tomcat源码不谈,Tomcat作为一个用Java实现的Web服务器,如果让你来实现,那么从何入手?这里首先需要厘清的是Web服务器的概念,谷歌了一下,发现这条解释还算靠谱点,【在网络环境下可以向发出请求的浏览器提供文档的程序】。这里面重点有两条,1.网络环境下,2.能够给出响应。用Java写过网络通信程序的都知道,这里必然会用到Socket编程。我们自己要实现的服务器...
2013-08-28 20:09:45 261
Tomcat7中一次请求处理的前世今生(一)处理线程的产生
在默认的配置下Tomcat启动好之后会看到后台上总共有6个线程在运行。其中1个用户线程,剩下5个为守护线程(如下图所示)。如果你对用户线程、守护线程等概念不熟悉,请参看前一篇文章——Tomcat7服务器关闭原理。这里重点关注以http-bio-8080开头的两个守护线程(即http-bio-8080-Acceptor-0和http-bio-8080-AsyncTimeout),因为这是...
2013-08-20 16:33:06 166
Tomcat7服务器关闭原理
之前的几篇文章讲了Tomcat的启动过程,在默认的配置下启动完之后会看到后台实际上总共有6个线程在运行。即1个用户线程,剩下5个为守护线程(下图中的Daemon Thread)。如果你对什么叫守护线程的概念比较陌生,这里再重复一下:所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程。这种线程并不属于程序中不可或缺的部分,当所有的非守护线程结束时,程序也就终...
2013-08-16 21:52:49 268
也谈Spring,为何用它?
一个老生常谈的话题,最近出去面试,十之八九还会问这个,今天在博客园里有人说Spring的问题,忍不住点进去看了看,感觉没说出个所以然,所以写篇小文谈谈我的看法。 Spring的由来在其作者Rod Johnson的两本名著(《Expert One-on-One J2EE Development without EJB》和《Expert One-on-One J2EE Design and...
2013-08-16 18:53:18 92
Tomcat7启动分析(五)Lifecycle机制和实现原理
在上篇文章分析Tomcat7的各组件的init、start方法时经常会看到有一个setStateInternal方法的调用,在查看LifecycleBase类及其它各组件的源码时会在多处看到这个方法的调用,这篇文章就来说说这方法,以及与这个方法相关的Tomcat的Lifecycle机制和实现原理。 上篇文章里谈到Tomcat7的各组件的父类LifecycleBase类,该类实现了接口o...
2013-08-06 14:02:49 431
Tomcat7启动分析(四)各组件init、start方法调用
在正常启动Tomcat7的情况下,上篇文章分析到了执行org.apache.catalina.core.StandardServer的init和start方法这儿,那么就来看看这两个方法里面到底干了些什么。但是在StandardServer类里面并没有发现这两个方法:由此推知这两方法必定是在该类的父类中已实现了,在StandardServer类的父类LifecycleMBeanBase...
2013-08-05 17:38:28 315
Tomcat7启动分析(三)Digester的使用
前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catalina.startup.Catalina对象的load和start两个方法,那么就来看看这两个方法里面到底做了些什么。 load方法: /** * Start a new server instance. */ public void load() ...
2013-07-23 17:02:41 201
Tomcat7启动分析(二)Bootstrap类中的main方法
之前分析了Tomcat的启动脚本,如果从startup.bat开始启动Tomcat的话会发现最后会调用org.apache.catalina.startup.Bootstrap里的main方法,并且传过来的最后一个命令行参数是start,接下来的启动代码分析就从这里开始。 先看下这个main方法的代码:/** * Main method and entry point ...
2013-07-23 11:54:30 177
Tomcat7启动分析(一)启动脚本
在之前的环境搭建那篇文章里是通过直接运行BootStarp的main函数来启动的,只是加了一个catalina.home的系统属性。而正常情况下启动Tomcat是通过运行脚本的方式,这个就涉及到建立工程时拷贝过来的script目录下的一堆脚本文件了。以我的windows系统举例,实际上最终是执行startup.bat这个批处理文件来启动tomcat的。那么启动分析就冲这个文件开始吧:...
2013-07-17 13:07:13 253
空空如也
Apache的Derby项目现在是不是停止了?
2013-02-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人