simulate http api(json) server.

有这样的一种场景:客户端、后台同时开发。客户端组的同事等后台的接口,而后台的同事在忙于写逻辑实现,为了解决这个问题,去年我用ruby写了一个模拟器,删除公司的业务代码,只保留两个简单的接口,已经放在 gits上 https://gist.github.com/lytsing/d2db3e588990b69e616b。这样,后台的同事定义好接口,也顺便把模拟器给写好了,这样两边都不影响,腾出中间的时间磨合调整接口参数。

ruby是很简单的解释性脚本语言,开发、测试、客户端不需要太多的ruby开发经验,基本上照着写就够了。我们系统小概率出现 302、500、502、503这样的http返回码,而测试组的同事需要拿客户端反复测试,才能出现,浪费不少时间,直接编辑模拟器的脚本,可以手动修改返回码。

如果要支持 gzip数据压缩,前面加上一个 nginx做转发就好了:
假设是使用系统自带的nginx,编辑/etc/nginx/nginx.conf,新增加:

server {
  listen       80;
  server_name  localhost;

  server_name localhost:8080;
  location / {
    proxy_pass http://localhost:8080;
  }
}

新增文件 /etc/nginx/conf.d/gzip.conf,内容为:

gzip on;
gzip_comp_level  9;
gzip_proxied any;
gzip_types application/json;
gzip_vary on;

优化wordpress访问速度

很久没打理博客,最近发现很慢,一看状态栏一直加载 http://fonts.useso.com/css,fuck!又被盾了。网上已经有人解决了,使用360的一个常用前端公共库CDN服务:

[/wp-content/themes/twentytwelve]# diff functions.php functions.php~
121c121
<           $font_url = add_query_arg( $query_args, "$protocol://fonts.useso.com/css" );
---
>           $font_url = add_query_arg( $query_args, "$protocol://fonts.useso.com/css" );

速度快了许多,发现还有一个url stats.wordpress.com,查看源代码,发现是后台统计插件,果断去掉。中间装了几个插件,也忍心放弃之。

发现有一个插件 七牛镜像存储 WordPress 插件,还不错,里面有个勾选项:

使用 360 前端公共库 使用 360 网站卫士常用前端公共库 CDN 服务替换 Google 前端公共库和字体库。

原来可以把上面的问题解决掉。本站是小站,没有那么大的流量,数据库不会有很大的瓶颈,服务器放在美国 bluehost,优先做CDN加速。

试用 zimg服务器

同事推荐这个库做图片服务器,一看作者是88年的,好小,在百度工作过,稍微看了一下,照着 zimg服务器搭建手记 安装,还是遇到一些麻烦,我使用的系统是 CentOS release 6.2,64bit。

安装依赖包 libmemcached,ImageMagick,openssl, libevent:
yum install gcc-c++ gcc automake git libmemcached-devel ImageMagick-devel openssl-devel libevent-devel

安装 cmake

如果使用 yum install cmake 安装,版本太低,编译libevhtp-1.2.6 会报错:
# cmake -DCMAKE_PREFIX_PATH=/usr -DCMAKE_INSTALL_PREFIX=/usr/
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 2.8 or higher is required. You are running version 2.6.4

需要手动下载安装

wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar xvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap --prefix=/usr && make && make install

wget https://github.com/ellzey/libevhtp/archive/1.2.6.tar.gz -O libevhtp-1.2.6.tar.gz
tar xvf libevhtp-1.2.6.tar.gz
cd libevhtp-1.2.6
cmake -DCMAKE_PREFIX_PATH=/usr -DCMAKE_INSTALL_PREFIX=/usr -DLIBEVENT_PTHREADS_LIBRARY=/usr/lib -DLIBEVENT_OPENSSL_LIBRARY=/usr/lib64/openssl/
make && make install

wget https://github.com/buaazp/zimg/archive/master.zip
unzip zimg-master.zip
cd zimg-master
make

报错:

cc -Wall -c -o zimg.o zimg.c
zimg.c:27:29: error: wand/MagickWand.h: No such file or directory

这个 Makefile 写的确实不是很专业,需要手动修改才可以编译通过,至少起码应该使用 automake或cmake。手动添加 MagickWand 头文件路径。然后链接的时候又报错:

zhttpd.o: In function `guess_type’:
zhttpd.c:(.text+0x28): undefined reference to `evutil_ascii_strcasecmp’
zhttpd.o: In function `guess_content_type’:
zhttpd.c:(.text+0xb8): undefined reference to `evutil_ascii_strcasecmp’

需要指定 -L/usr/lib 才行,下面是给Makefile打的补丁:

[root@dmzsrv01 zimg]# git diff Makefile
diff --git a/Makefile b/Makefile
index 315a8c4..05295b1 100644
--- a/Makefile
+++ b/Makefile
@@ -4,10 +4,10 @@ MAC = Darwin
ifeq ($(OS),Darwin)
LIBS = -levent -levent_openssl -levent_pthreads -lssl -lcrypto -levhtp -lMagickWand-6.Q16 -lmemcached
else
- LIBS = -levent -levent_openssl -levent_pthreads -lssl -lcrypto -levhtp -lMagickWand -lmemcached
+ LIBS = -L /usr/lib -levent -levent_openssl -levent_pthreads -lssl -lcrypto -levhtp -lMagickWand -lmemcached
endif
OBJS = zhttpd.o zspinlock.o zlog.o zmd5.o zutil.o zcache.o zimg.o main.o
-CFLAGS = -Wall
+CFLAGS = -Wall -g -I /usr/include/ImageMagick -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16
all: ${OBJS}
gcc ${CFLAGS} -o zimg ${OBJS} ${LIBS}

使用还是比较简单的,help 就可以了。需要注意的是,这个 zimg 不能运行两次,会 core dump,程序本身没处理好。最后,fork 这个项目,花了一会时间写 CMakeLists.txt 使用cmake编译,已经 pull request给作者。现在安装更方便了,在 Ubuntu 13.10 Server 测试通过:

sudo apt-get  install cmake libssl-dev libevent-dev libmagickwand-dev libmemcached-dev

wget https://github.com/ellzey/libevhtp/archive/1.2.6.tar.gz
tar xvf libevhtp-1.2.6.tar.gz
cd libevhtp-1.2.6/
cmake .
make
sudo make install

cd ..
git clone https://github.com/lytsing/zimg
cd zimg/
cmake .

跑了 test目录下的测试脚本,发现性能还是挺不错的,目前这个版本还不支持访问认证以及https,支持https需要手动写,参考 libevhtp 提供的example添加不是难事。至于生产与访问文件的 url名称 是文件的 md5 值,可以在这基础上稍微做个变化,显得更专业一些。文件存储与MooseFS 结合倒是不错的选择。

当心avahi-daemon

我们的系统时不时报

java.net.ConnectException: Connection timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)

这样的错误日志。被连接的server 系统负载不是很高,资源也足够,一时找不到原因。分析日志出现的时间:

$ grep “router socket IO Exception” router.log |awk ‘{print $2}’|sort -u
10:15:05,155
10:15:13,467
12:15:06,129
12:15:13,419
13:15:06,012
13:15:06,148
13:15:07,168
13:15:08,812
13:15:11,781
13:15:14,154
13:15:14,510
15:15:05,306
15:15:05,639
16:15:06,709
16:15:07,083
16:15:07,447
16:15:07,850
16:15:07,915
16:15:08,888
16:15:10,359
16:15:12,553
16:15:14,246
17:15:08,219
17:15:08,239
17:15:09,055
17:15:12,094
18:15:06,008
18:15:08,460
18:15:10,428
18:15:12,057
18:15:12,692
19:15:11,374
19:15:12,061
19:15:12,089
19:15:13,746
21:15:08,496
21:15:11,356
21:15:12,393
21:15:13,462
21:15:14,495

都出现在神秘的15分钟,应该是定时jobs在跑导致的。检查crontab以及jboss的jobs任务,也找不到。最后只能tcpdump在14-16分抓包分析。得知 server 启用了avahi-daemon服务,每隔一个小时发送一个MDNS的广播包,会造成 server 无回应20秒左右。

avahi-daemon 是什么? 来自 http://packages.debian.org/zh-cn/wheezy/avahi-daemon 的解释: Avahi 是一个完全基于 LGPL 框架下的多播 DNS 服务搜寻工具。它能让程序发布或者 发现在本地网络中的服务或者主机,而无需特殊配置。例如,您可以连入一个网络,然后 立刻发现可用于打印的打印机,可查看的文件或者可聊天的朋友。本软件包包含 Avahi 守护进程,它将在网络中展示您的机器,并允许其他应用程序发 布和分析 mDNS/DNS-SD 记录.

服务器上最好把 avahi-daemon 关闭掉。

吐槽一下新浪微博 Android SDK V2.4.0

吐槽一下新浪微博 Android SDK V2.4.0

周末逛逛github,发现新浪更新了SDK,说是重大版本变更,瞄了一下,大概是文档更规范、代码重构之类的。老版本SDK代码全开放,但 2.3之后,封闭了部分代码。不管如何,我还是直奔观看 AsyncWeiboRunner.request 这个方法究竟改变了没有,结果还是失望了。

我建议微博 Android SDK 的开发人员,好好的阅读AQuery,Volley,android-async-http 这几个异步网络请求库,通过回调方式处理请求结果。新浪也是有回调结果,但要自己加 Handler 更新UI,官方的Demo在回调直接更新UI,其实就是在 http 请求线程里操作的,很容易给新手误导。

很多软件的开发都是如此,开始使用现成的,后面发现使用越来越不爽,不能满足自己的需求,决定重新搞。所以,Weibo for Android 计划使用 Volley作为http 处理库,自己写封装接口。我封装了一个GsonRequest,测试发现老是返回403,抓包才知道参数没有上传。使用 http get 传参数需要注意,重写getParams无效。见:

http://stackoverflow.com/questions/18484647/volley-does-not-call-getparams-for-my-custom-request

getParams() is not called on the GET method, so it seems you’ll have to add it to the URL before you send the request

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 19 20 21 Next