使用jvisualvm 监控服务器VM

最近业务服务器在早上并发时出现地区性无法响应问题,初步推断是内存爆掉,导致swap交换不过来了,为了寻找占用内存的怪兽,使用jvisualvm协助监控。

环境JDK1.8,在jdk下的bin目录提供了很多优秀的工具,例如:jvisualvm

然后在服务端启动jstatd。在当前目录下心间jstatd.all.policy文件

grant codebase "file:${java.home}/../lib/tools.jar" {  
   permission java.security.AllPermission;  
};

命令启动:

./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.233

然后本地使用jvisualvm连接吧:)
69eaf9d5-5de0-42ee-a938-fcd5fbf50c4f

微信订阅号获取用户openID

一天时间,某企业需要搞一次活动,微信一天内需要上线,达到扩大宣传,吸粉的目的。

困境:

一天不到的时间

微信只有认证过的订阅号

订阅号管理员找不到了

没有法办,只能硬顶。拦截器拦截初次访问用户,生成永久Ucode来标识用户。

结果:活动顺利上线,页面PV20W+,

出现了问题:

1.刷票

处理:识别屏蔽,限制微信端打开。

结果:取关人数上升,遭到恶意举报,然后活动页面被微信暂停了 ?

======================

困境:活动被禁跳了,又一次短时间上线继续活动

优势:微信号管理员找回来了

换了思路,更换了新域名,取消了微信人工连接,采用了订阅号开发者模式。

新问题:订阅号不能通过网页获取用户openID,WTF。

心中飘过一万个草尼马。

新方案:微信号新增“活动入口”按钮,动态回复入口消息,第一次进入的时候绑定openID。

窃喜ing,

现在关注人数飙升。

总结,建议采用服务号来搞活动。

BTW:由于技术过硬,曾经在高速运转的系统中升级核心模块等,玩的就是心跳~

Spring boot 部署服务

Spring Boot 出来之后,大家都振臂高呼,一些反应慢的还有些摸不着头脑,剩下的一群喷子……算了不说了

就说spring boot 有什么用吧,随着越来越多的人不停的嘲讽Java是如何的落后,如何的缓慢,就像一个老态龙钟的老人,弄的好多从业Javaer人心惶惶,这里还是不扯淡了,有一件事能做好也能做好另一件事,大家都不用纠结了。

先说Spring boot 有什么好处,首先它构建在spring 上,开发建立在spring上面,减少了很多配置,可以自己集成容器启动,这个在业界不停的讨论是否还需要容器来运行程序这个论调上算是Spring帮java扳回一城。

那么接下来就是如何玩了,当你在eclipse+maven的环境中开发完你的微服务,接下来部署开始打jar包,我推荐把依赖copy到单独的文件夹,这样在你的MANIFEST.MF 已经帮你搞定MainClass和classpath的问题,剩下就是自己指定所需要的配置文件位置

一个简单的启动参考: java -jar easyzhxSwap.jar –spring.config.location=/Users/72/Desktop/application.properties

如何优化?你猜?你再猜!

Jfinal中事务测试

昨天跟波总了解了下事务的处理,今天写个Test备忘一下。

在控制层中使用事务,简单的代码展示

@Before({POST.class , Tx.class})
public void saveWxSetting(){
log.info("saveWxSetting");
SysConfig sys1 = new SysConfig();
sys1.setId(PKUtil.getPK());
sys1.setKey("1");
sys1.setVal("1");
sys1.save();
SysConfig sys2 = new SysConfig();
sys2.setId(PKUtil.getPK());
sys2.setKey("1");
sys2.setVal("1");
sys2.save();
renderText("");
}

其中key为唯一所以,事务生效。
后来探讨了下static方法是用与测试,代码有些变化:
在业务层增加:

public static boolean test(SysConfig sys){
return sys.save();
}

控制层:

@Before({POST.class , Tx.class})
	public void saveWxSetting(){
		log.info("saveWxSetting");
		SysConfig sys1 = new SysConfig();
		sys1.setId(PKUtil.getPK());
		sys1.setKey("1");
		sys1.setVal("1");
		SysConfig.test(sys1);
		SysConfig sys2 = new SysConfig();
		sys2.setId(PKUtil.getPK());
		sys2.setKey("1");
		sys2.setVal("1");
		SysConfig.test(sys2);
		renderText("");
	}

测试依旧OK:)
后台回到业务层,意味着取消控制层的事务

@Before(POST.class)
	public void saveWxSetting(){
		log.info("saveWxSetting");
		SysConfig sys1 = new SysConfig();
		sys1.setId(PKUtil.getPK());
		sys1.setKey("1");
		sys1.setVal("1");
		SysConfig sys2 = new SysConfig();
		sys2.setId(PKUtil.getPK());
		sys2.setKey("1");
		sys2.setVal("1");
		SysConfig.test(sys1,sys2);
		renderText("");
	}
///
@Before(Tx.class)
	public static boolean test(SysConfig sys1,SysConfig sys2){
		return sys1.save()&&sys2.save();
	}

显然是失败了:( 因为:你这是业务层 aop 实现的事务,注意要用一下 Duang.duang(…) 去触发

如果在业务层中调用,代码变为:

@Before({POST.class})
	public void saveWxSetting(){
		log.info("saveWxSetting");
		SysConfig sys1 = new SysConfig();
		sys1.setId(PKUtil.getPK());
		sys1.setKey("1");
		sys1.setVal("1");
		SysConfig sys2 = new SysConfig();
		sys2.setId(PKUtil.getPK());
		sys2.setKey("1");
		sys2.setVal("1");
		SysConfig sys = Duang.duang(SysConfig.class);
		sys.test(sys1, sys2);
		renderText("");
	}
 
@Before(Tx.class)
	public boolean test(SysConfig sys1,SysConfig sys2){
		return sys1.save()&&sys2.save();
	}
 
测试下来  Dung 和 Enhancer 效果一样:)

yum 安装mysql5.7

曾经mysql落入oracle之手,原作者开创了MariaDB,此后不久各大Linux厂商纷纷转投MariaDB阵营(oracle可见多不得人心)。

随着Oracle发布mysql5.7开始支持原生json,大家又开始蠢蠢欲动了,因为之前的源都已经指向mariaDB,所以不得不采用rpm来安装,但是门槛相对傻瓜式的yum复杂一些,好在mysql提供源方便安装了

环境:centos 6.5 64bit

源地址:http://dev.mysql.com/downloads/repo/yum/

接下来不说了,继续吧

centos安装ngxtop

nginx受众很大,可以监控的工具很多,但是对简单粗暴的想知道直观数据的我们来说,ngxtop不可错过。

在centos中yum还不能安装,所以还是人肉安装吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
######
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py build
python setup.py install
######
wget https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#md5=3823d2343d9f3aaab21cf9c917710196
tar zxvf pip-7.1.2.tar.gz
cd pip-7.1.2
python setup.py install
######
pip install ngxtop

接下来就可以使用了:

ngxtop [options]
ngxtop [options] (print|top|avg|sum) <var>
ngxtop info

一些通用选项:

  • -l : 指定日志文件的完整路径 (Nginx 或 Apache2)
  • -f : 日志格式
  • –no-follow: 处理当前已经写入的日志文件,而不是实时处理新添加到日志文件的日志
  • -t : 更新频率
  • -n : 显示行号
  • -o : 排序规则(默认是访问计数)
  • -a …, –a …: 添加表达式(一般是聚合表达式如: sum, avg, min, max 等)到输出中。
  • -v: 输出详细信息
  • -i : 只处理符合规则的记录

一些内置变量:

  • bodybytessend
  • http_referer
  • httpuseragent
  • remote_addr
  • remote_user
  • request
  • status
  • time_local

 

centos 安装memcached

官方的教程很简单

Debian/Ubuntu: apt-get install libevent-dev Redhat/Centos: yum install libevent-devel

wget http://memcached.org/latest
tar -zxvf memcached-1.x.x.tar.gz
cd memcached-1.x.x
./configure && make && make test && sudo make install

不过必要的准备还是的有的吧

yum -y install gcc
yum -y install gcc-c++ libstdc++-devel
yum -y install zlib-devel

然后按照官方搞定吧

启动参数
-p 设置TCP端口号(默认不设置为: 11211)
-U UDP监听端口(默认: 11211, 0 时关闭)
-l 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-d 以daemon方式运行
-u 绑定使用指定用于运行进程
-m 允许最大内存用量,单位M (默认: 64 MB)
-P 将PID写入文件,这样可以使得后边进行快速进程终止, 需要与-d 一起使用

启动命令:例如:memcached -d -u root

使用jodd发送邮件设置发件人问题

使用odd mail的好处就是不用自己实现各种协议,还可以轻松搞定问题,发送邮件就是一件小事儿了,但是有时候需要设置一下发件人,生的人家都是 各种公司CEO的,到我们这都是 devp@sxnuoyun.com  之类的low掉渣渣。

无奈E文差,网速更差,jodd mail 说的蛮简单,以至于没找见怎么设置发件人字段了,干脆去猜吧,看着哪个像点哪个

Email email = new Email();

email.setFrom(new MailAddress(FROMEMAIL));

65E26EA5-7591-4B7B-B622-50DBD2440DEC

手感不错,猜的蛮准, 使用xxxx <email> 格式自动截取发件人:)

iterm2免密码登录Linux

用惯了Win的xshell,忽然到了mac下面就忽然茫然了,后来厚着脸问人家用什么工具,人家说用 iterm2+证书登录,恍然大悟,

os x 不也就是linux吗?

那就简单了,在iterm2 中输入ssh-keygen 一路回车

然后在~/.ssh 产生了id_rsa.pub和id_rsa 文件,将pub公钥上传到服务器的~/.ssh/authorized_keys ,然后修改配置

修改sshd配置文件(/etc/ssh/sshd_config).
找到以下内容,并去掉注释符”#“
=========================
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
=========================

 

然后重启ssh,这下在iterm2 中配置下连接指令,搞定。

关于Chrome调试中.min.js.map 404的问题

前端在Chrmo F12模式下调试的时候,经常会遇到js.map文件找不到的情况,例如:

http://domain/AngularJS/v1.3.11/angular.min.js.map 404 (Not Found)

关于这个问题其实大可不比过分的纠集,一般只会在你引用了压缩的min.js 文件,chrome浏览器中才会出现

实际并不影响页面的执行效果。这里简单说下原理:

map文件是js文件压缩后,文件的变量名替换对应、变量所在位置等元信息数据文件,一般这种文件和min.js主文件放在同一个目录下。

使开发者可以用未压缩前的代码来调试,这样就不会出现这个问题了,但是往往想使用min文件,而且还有强迫症的患者是非常难受的,那么取掉这个小x也很简单
打开chrome的F12界面,然后点击“设置”,去掉 Sources里面的 Enable JavaScript source maps

EG:

min.js.map - 副本