tmsp轻量级J2EE框架第一次压测

由于资源的有限,J2EE传统的框架已经超过了我们对资源的预期,无奈只能转向底层的原始开发,自己写了轻量级的框架。

其实这个框架我们一直说轻量级,到底能多轻,另外我们能不能保证服务保证。

今天做了一下压力测试。

系统Centos5.7 内存256M CPU:Intel(R) Xeon(R) CPU E31230 @ 3.20GHz ×2

系统环境 mysql5.0 默认配置100链接, tomcat7 bio模式,默认链接,Nginx1.0 默认链接

Nginx前端,tomcat7一个作为后端。

并发测试:

第一次,并发100,10分钟,执行6分钟,丢失6次,CPU在3% 内存占用100M左右,系统框架无压力。

第二次,并发500,10分钟,执行完毕,丢失2次 CPU在3%,内存占用150M左右,系统框架无压力。

目前在增加数据库记录9770条,做第三次压力测试。稍后放出。

java实现短地址算法

网上流行的短地址算法很多,但是大部分都会存在小概率的重复时间,其实使用短地址无非就是实现映射关系。

我们举个很简单的例子,我们把地址分配成一个映射关系

记录标识——源地址

这样,我们将记录标识设置为自增长主键,这样就是十进制的1-N,通过跳转方法可以轻松实现由数字地址到跳转地址的功能,

但是往往很多人看到市面上都是由数字,字母类组成表示跳转,如此以来我们可以将这个十进制主键来转换成64进制算法,岂不是很简单,也不会存在重复主键的问题了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	public static String Dec2AnyHex(int dec, int shift) {
		char[] buf = new char[32];
		int charPos = 32;
		int radix = 1 < < shift;
		int mask = radix - 1;
		do {
			buf[--charPos] = Config.digits[dec & mask];
			dec >>>= shift;
		} while (dec != 0);
		return new String(buf, charPos, (32 - charPos));
	}
 
 
	public static Integer AnyHex2Dec(String anyHex, int shift) {
		char[] s = anyHex.toCharArray();
		String digitsString = new String(Config.digits);
		int Num = 0;
		for (int i = s.length; i > 0; i--) {
			int j = digitsString.indexOf(s[i - 1]);
			Num += j * Math.pow(1 < < shift, s.length - i);
		}
		return Num;
	}

仅供参考,谢谢。

移动互联网,云计算,安全

我认为当今互联网的圈子热衷的话题无非三个:移动互联网,云计算,安全。

无论是移动互联网,还是云计算,安全都是一个首要的问题,然而我们的安全意识还是很淡薄,从之前各大网站的拖库门事件就能看出。

事件一出很多人骂娘,难道程序员不知道用明文的危险性?我想应该有其他的原因,或上头指明,或心存鬼胎。

但是无论哪种猜测这件事也终将过去,我们只是想说,用户名和密码的方式进行权限验证是最不安全的方式了,至于那种方式安全,

我觉得见仁见智吧。

就如同移动互联网发展至今,我觉得现在是时候把移动支付推到一个顶峰,这样的话安全就尤为的重要了。

如果是支付宝是PC支付的一个标杆的话,那么移动支付又将何去何从?从我个人来讲,支付宝和paypal的安全简直不是一个量级的,

支付宝根本不存在任何的安全性。怎么讲?我们从支付宝骗来一笔资金,可以很方便的分流出去,而支付宝方面只会爱莫能助或者咬死了说

这个是你的问题,我们有提示,我们有证书,我们也有权限验证,我觉得这就是在混淆视听,我们并没有说是帐户被盗,而是被骗。

被骗之后我们希望的是支付宝方面能有些作为让我们的损失降到最低,然后结果总是让人很失望的。因为我从支付宝的客服学到,你如果

有笔来源不明的资金,最快最安全的洗白方式就是使用虚拟充值卡来套现,安全方便不留痕迹!!!

然后从paypal的角度来说,如果你登录的IP地址就很异常的话,很可能会遭遇到帐户锁定,这样就不难理解了,如果你此时在米国,登录,突然

在其他国家或地区登录的话,很可能遭到帐户被盗的可能性,这样也让很多使用代理的朋友很恼火,仔细想一想,有什么恼火的呢?

另外如果你的paypal有一笔资金来源不明的话,那么你只能心存侥幸了,因为这笔资金流向的所有帐户都会被锁定调查,很多人认为

蛋疼,但是当你的资金损失的时候你才追悔莫及的话,你才会明白该如何选择。

所谓IT技术公司应该分为三类,A类公司创新 B类公司模仿 C类公司跟风,往往很不幸的我们国内我只能看到BC。

我们从国外A类公司抄过来之后弄自己所谓的高新技术创新设计研发,但是或多或少总是看到人家的影子。

亚马逊的云计算项目 AWS火起来后,国内的阿里云,盛大云,各种云一触即发,无论从价格还是技术上来说感觉都是在模仿。

很多人会说服务出来肯定有它的道理,但是换句话来说这些云计算,如何保证安全性,我们看到很多在线服务网站搬家到了云平台,但是

涉及到支付以及电子商务类型的公司为什么还是不愿意将自己的平台架设到云呢?

那么接下来,我们该如何发展?

Hello Node.js

What’s node.js 嘿嘿,这不是我们讨论的话题了,有兴趣自然回去研究,其实我也刚在了解。

手痒痒,于是在服务器上写个Hello  Word。

环境:Centos5+ 32bit

那么我们首先需要搭建环境对不对?

1
2
3
4
5
6
yum install gcc-c++ openssl-devel make
wget -c http://nodejs.org/dist/v0.6.17/node-v0.6.17.tar.gz
tar zxvf node-v0.6.17.tar.gz
./configure  
make  
make install

那么下来我们来写个Hello Word ,顺便来验证我们的Node环境。

hello.js

1
2
3
4
5
6
var http = require('http');  
http.createServer(function (req, res) {  
  res.writeHead(200, {'Content-Type': 'text/plain'});  
  res.end('Hello Node.js');  
}).listen(8888, "localhost");  
console.log('Server running ......');

这里大家注意一下,如果你是本地的环境,localhost 或者 127.0.0.1 都可以,但是如果你在服务器端来运行的话,就填写你的服务器IP地址吧。

然后就是运行我们的程序

node hello.js
成功的话你应该可以看到Server running ……

然后在你的浏览器输入http://localhost:8888

运气不是很糟的话,你应该可以看到你想看到的东西鸟?

是不是很简单,那么什么是node.js 他会代替谁呢?又或者我们在什么地方又有了解决方案:)

知名网站的技术发展

看了Programmer的知名网站的技术发展流程,感慨万千,互联网的发展虽然经历了起起伏伏,也才不过十几年的时间,而互联网生可多少又死了多少,我们无法得知了,经过这十几年的发展,存活下来的网站自然有他们

的方式,有新兴的,有老牌的,我们在这个发展的洪流中,真的太过于稚嫩和单薄了。

Google

诞生于1997年,1999年增加了一个Cache Cluster,2000年Google开始自行设计DataCenter,2001年Google对Index进行的修改,所有的Index放到了内存中.

2003年发表了 Google Cluster Architecture 其Cluster结构组成为硬件LB+Index Cluster+Doc Cluster+大量的廉价服务器。

2004年,Google对Index的格式进行了修改,通过MapReduce+大量廉价的服务器既可以实现小型机,中型机或者大型机才能完成的任务。

2006年,Google发表了关于BigTable的论文,对于海量数据的分析起到很大的帮助。在一些场景中,Google同样使用Mysql作为数据存储。,同样Google对Mysql进行了很多修改。

2007年,Google将build索引的时间缩短到几分钟。Google的一次搜索大概需要调用内部50个以上的Service,Service主要用C++或者java来编写。

2009年,Google发表《How Google uses Linux》,之后研发了Colossus,Spanner,除了海量数据相关技术上的革新外,Google也不断对业界的传统进行创新。

在Google的发展过程中,技术主要围绕在 可伸缩性,性能,成本,和可用性四个方面。

Facebook

采用LAMP构建,我想很多人都知道,LAMP非常流行,我们不做过多的阐述了,我们知道facebook的发展非常迅速,LAMP根本不能胜任了,于是脸谱增加了Memcached,只有又增加了Service层,将News Feed、Search等功能作为Service

提供给前端PHP,针对不同的Service采用不同的语言,例如,C++,Java,Erlang。

而后Facebook发现PHP的消耗问题,研发了HipHop,可以自动的将PHP转换成C++代码,相同的配置支撑的请求是之前的6倍。

2009年研发了BigPipe。对于存储MySQL中的数据,蚕蛹垂直拆分库和水平拆分表的方式来支撑不断增长的数据量。

2011年,尝试从MySQL迁移到HBase。

在Facebook的发展中,主要围绕在可伸缩性、性能、成本和可用性四个方面。

Twitter

2006年诞生,采用Ruby On Rails + MySQL构建的,

2007年增加了Memcached作为Cache层。

2008年Twitter决定逐步往Java迁移,选择了Scala作为主力开发语言,理由是:难以向一层子的Ruby程序员推销Java :)

eBay

1995年诞生,采用CGI,数据库是GDBM,只能支撑5万件商品。

1997年,eBay将OS从FreeBSD迁移到Win NT,将数据库改为Oracle。

1999年,eBay将前段系统改造为Cluster。

2001-2002年,eBay将数据库进行了水平拆分。

2002年,将整个网站迁移为Java构建。

从eBay的发展来看,主要围绕可伸缩性和可用性两点。

Tencent

QQ虽然一路走来都是模仿路线,但是我想如果没有技术创新,一味的模仿也是无法发展的。

2009年到现在,腾讯决定对QQ IM重构,数据存储也不再存储与MySQL中,而是全部存储在自己设计的系统里。

从QQ IM的技术演变来看,其技术改造是围绕在可伸缩性和可用性上。

淘宝网

2003年诞生,直接购买了phpAction的软件。

2004年将系统由PHP迁徙到Java,MySQL迁徙为Oracle,应用服务器采用WebLogic。

2005年-2007年发展中,JBoss替代了WebLogic,对数据库进行了分库,基于BDB做了分布式缓存,自行开发了分布式文件系统TFS,并自建CDN。

2007-2009年,对应用系统进行垂直拆分,拆分的系统都已Service的方式对外提供,对数据进行了垂直和水平拆分。

进行数据拆分后,Oracle的成本越来越高,于是数据逐渐从Oracle迁移到MySQL,同时开始采用HBase来支撑历史交易订单的存储和检索。

近几年,淘宝开始对Linux内核,JVM,Nginx等软件进行修改定制。

从淘宝的发展过程来看,围绕可伸缩性和可用性,现在也将精力投入在性能和成本上。

 

从上面互联网精英的历史演变过程中,我们不难看出,可伸缩性,可用性,性能以及成本一直是互联网发展的技术核心。

我见过很多人在争论Java和PHP,亦或者使用Tomcat,WebLogic ,MySQL和Oracle,我想说这些都没有什么好争论的,适合自己的才是最好的,同时技术和模式都是不可能照搬照套的,需要自己来进行创新。

我总觉得自己该做些什么了,我想现在应该不算晚了。让我们努力吧:)

 

这里留下一些资料,有情趣的可以自己去研究了。点击下载

 

 

关于java中switch使用的一些说明

很久没有使用switch这个东西了,想想也不无用处,至少可以改变一下看起来一样的代码结构,哦也。

switch(表达式)
{
case 常量表达式1:语句1;
....
case 常量表达式2:语句2;
default:语句;
}
default就是如果没有符合的case就执行它,default并不是必须的.
case后的语句可以不用大括号.
switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型.
一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句.

例如:

switch(x)

{

case 1:

case 2:

case3: System.out.println("haha");

break;

case4: System.out.println("hehe");

}

很多时候可以做很多事情,嘿嘿~

java 二维码生成

二维码已经满大街了,这里放出一个工具供大家使用

说明:
第一个参数是二维码内容,2-3 是 高度和宽度,最后一个是生成的文件路径和名称,以png格式,几个目录要存在。

哦也,自己玩玩试试吧。

1
System.err.println(TDCodeTools.CreateTDCode("欢迎使用TM-SP二维码生成工具", 400,400, "c:/xxx.png"));

点击下载

centos5.X 安装perl环境

一般的Linux上是会自动安装了perl的环境的,但是也难免有些例外。

那么如果是Centos使用yum工具就很简单了,

1
2
3
4
5
6
wget -c http://down1.chinaunix.net/distfiles/perl-5.8.8.tar.bz2
bzip2 -d perl-5.8.8.tar.bz2
tar -xvf perl-5.8.8.tar
./Configure -de
make
make install

使用perl -V 可以查看perl的版本

同样

#!/usr/local/bin/perl
print “hello perl !\n”;

shell监控服务脚本

最近频繁发现服务老是莫名停止,于是写一个简单的监控shell程序,以防在半夜突发情况来应急。

1
2
3
4
5
6
7
8
#!/bin/bash
ria=`ps -ef | grep java | grep -v portalAgent | awk '{if($3==1)print $3}'`
if [ "$ria"=="" ]; then
tdate=`date +%Y/%m/%d-%T`
/home/T3-2.8/2.4ria/riaServer/start.sh &amp;
echo "$tdate &gt;&gt; /home/T3-2.8/2.4ria/riaServer/start.sh &amp;" &gt;&gt; /home/ria.log
fi
exit 0

 

这个脚本修改一下可以完成其他程序的监控,当然也能完善做出来很多事情。其实编程语言只不过是一种工具,何必纠结那个更好,甚至非要争个高下。
在不同的场景用不同的方法才是最高境界,毕竟人是主导程序,而不是程序主导人。

在shell中需要注意的是 if then 语句,在[]中开始和结束需要有空格,否则会出现:
syntax error near unexpected token `then’

Centos搭建SVN服务

SVN服务对于开发者来说实在太重要了,手上有服务器资源,于是近水楼台,哦也。

在centos下搭建相对比较简单

yum -y install subversion

接下来创建我们的软件仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
svnadmin create /home/svn/tmsp
来创建你的SVN仓库。会在tmsp目录下建立多个文件, 分别是conf, db,format,hooks, locks, README.txt
接下来配置你的conf  cd conf
authz  passwd  svnserve.conf
配置文件,svnserver.conf [general]下
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
 
接下来配置 passwd  用户名=密码的形式
[users]
harry = harryssecret
sally = sallyssecret
配置 authz
[/]
harry =rw
 
要想根据文件夹分权限可以使用
[/文件夹]
sally = rw
 
接下来启动SVN服务
svnserve -d -r /home/svn/tmsp/
或者 
svnserve -d -r /home/svn/tmsp/ --list-port 3333 启动在别的端口