[原创]通用验证工具2.0

两年前,我在这里发布了”JAVA通用验证工具”,并开源共享到 github 上。在之后的项目中,也是有使用的,算得上是经历了线上的考验。与其他如:Spring Validator,Apache Validator相比,主要有几个优点:

1.无第三方依懒引入,更轻量更容易扩展。
2.对于JAVA对象支持分组,根据不同业务场景验证必要字段。
3.对Android提供独立支持,验证返回资源引用ID。
继续阅读“[原创]通用验证工具2.0”

JVM之ClassLoader

1.BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等,可通过如下程序获得该类加载器从哪些地方加载了相关的jar或class文件。

2.Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。

3.App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
继续阅读“JVM之ClassLoader”

微服务 – Spring Cloud 2.0

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud 2.0 正式版发布已有一段时间,这次写了一个Demo方便入门学习和测试。
继续阅读“微服务 – Spring Cloud 2.0”

分布式服务框架之Dubbo

从去年(2017)下半年开始,dubbo又重新开始维护了。当初在开发项目时之所以没选择Dubbo是因为前景不明朗,没有人维护和解决已知的问题。而且考虑到团队消化的成本,自己使用rmi+zookeeper实现分布式远程调用。其实解决的问题和dubbo一样,不过dubbo功能上更强大,扩展性好,而且历经很多公司和项目的考验。
继续阅读“分布式服务框架之Dubbo”

制作码牌

目前最流行的支付之一是一码付。公司因业务扩展,需要给商户制作大量收款码。以往的制作流程是,由后台生成支付二维码,再由美工PS到模版里,最后出来码。但是这样的效率太低,一天也只能做百来个,还可能容易出错。于是诞生新的需求,希望靠程序解决。
继续阅读“制作码牌”

原创 Mybatis Generator 插件分享

相信很多java项目都会用到MyBatis。MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

以前使用Mybatis时,都会用基于XML的配置。XML配置方式虽然灵活但烦锁,所以后面又有了基于注解的配置。但是基于注解配置的方式又不够灵活。比如Mybatis强大的动态SQL语句功能,如果使用注解,只能用代码实现相应的Provider达到相同功能。为了解决这个问题,以前自己定过一些使用规范(增、删、改操作用注解,查询用XML配置),也按这个规范写过一个ORM框架。自己写的框架苦于精力有限,没有维护,有些功能不够完善,所以没有在大项目中使用。直到有一天发现Mybatis Generator,我觉得一切都解放了。
继续阅读“原创 Mybatis Generator 插件分享”

log4j2之ThreadContext

系统中使用log4j2作为日志系统,然而在高并发的情况下,多次请求的日志参杂在一起,要跟踪某个用户一次的请求操作所有日志是很麻烦的。幸运的是log4j中有相应的解决方案。

NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。NDC采用了一个类似栈的机制来push和pop上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。MDC和NDC非常相似,所不同的是MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。
继续阅读“log4j2之ThreadContext”

RMI服务多网卡问题

项目中使用了一些RMI服务,部署发现在linux环境下监听了端口,但无法被其他机器调用。于是打印出log分析情况。

注:如果使用spring框架,打印日志需要引入slfj4-api。

在开发环境下(Windows)输出日志如下:

同样的程序部署到生产(linux),输出日志如下:


可以看到,在window下监听的是内网地址,但在linux下是本地127.0.0.1。
继续阅读“RMI服务多网卡问题”

Centos环境下Tomcat启动缓慢

生产环境上tomcat用得好好的,突然启动变很慢,以前几十秒启动完的项目要十几分钟。而我们项目与项目之前有依赖,一次性要启动好几个项目。如果每个要十几分钟那还得了。这个问题以前有出现过,但也没在意。主要是在CentOS系统下出现的。另一台Debian服务器没有问题。

实在无法忍受了,在网上找到了解决办法,修改jre的配置。
继续阅读“Centos环境下Tomcat启动缓慢”

使用proxy_balancer模块做负载均衡

使用apache+tomcat集群多个方案,以前我是用的mod_jk。这种集群虽然性能好,但是较复杂。apache自带的负载均衡模块proxy_balancer简单又正好满足需求。所以选用这种方案。

我查资料有个习惯,就是首先从官网获取信息。因为官网的文档不仅是最新,相信也是最准确的。可是这一次我错了,如果按官网的文档操作没有问题就不会写这篇日志了。
继续阅读“使用proxy_balancer模块做负载均衡”

利用Access-Control-Allow-Origin解决跨域请求

传统的跨域请求没有好的解决方案,无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-Origin Resource Sharing)。IE8、Firefox 3.5 及其以后的版本、Chrome浏览器、Safari 4 等已经实现了 Cross-Origin Resource Sharing 规范,实现了跨域请求。
在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息。
如果设置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。
Access-Control-Allow-Origin:http://www.wangzhengzhen.com,允许特定的域名访问。
继续阅读“利用Access-Control-Allow-Origin解决跨域请求”

[原创]JAVA通用属性验证工具

在程序开发中,少不了属性的效验。最常用的应该是 hibernate 的 validator 或 apache 的 commons-validator 。

这两种框架各有优缺点,首先是 Hibernate的validator,它臃肿了,依赖很多其他jar包。在不使用hibernate框架时使用它还是很不方便的。其次是apache的commons-validator,虽然很灵活,但是配置麻烦,好像没有基于注解的。这两个框架都不适合移动端。所以自己写了一个轻量的验证工具。
继续阅读“[原创]JAVA通用属性验证工具”

J2EE基础框架集成

Spring 4出来很长一段时间了,现在最新稳定版是4.2.4。我把外面做项目常用的框架集成写了一个demo,从请求到保存数据。可以作为项目快速搭建与开发。如果要提高效率和形成团队规范,还需要深度开发。

项目为Maven工程,始用Eclipse创建。导入项目后可能需要一段时间让Eclipse自动下载依赖包。依赖包主要有:Spring、Spring Web、Spring Jdbc、MyBatis、Mybatis Spring、MySQL Connect Java、Apache Common DBCP2、Log4j2。
继续阅读“J2EE基础框架集成”

openssl生成pfx证书

做为一个javaer,生成证书工作理应首选keytool。但是keytool生成的证书是jsk的keystore,不符合要求,只有使用openssl了。

openssl是一个很强大的工具,里面有很多加密算法和证书格式,对此我也只是了解一部分,有时间要好好补补这一块知识。以前在接支付宝时使用openssl生成过pfx证书,没有记住命令。在网上一搜,大部分都是5部生成https证书的。好不容易生成出来,特意mark一下。
继续阅读“openssl生成pfx证书”

mod_jk奇怪的连接问题

最近进行了一次生产环境的迁移。原来的环境是做了虚拟化,所以迁移时把原来的虚拟机保持状态停用,再复制一份。但就是这么简单的理论上不会有问题的迁移,出现了奇怪问题。具体表现在,系统运行一段时间后tomcat无响应。

生产上的应用系统是使用apache+tomcat集群,所有的请求由apache的mod_jk转发至tomcat的apj13监听端口。系统运行一段时间后,tomcat无响应。tomcat1的apj13端口是8010,tomcat2的监听端口是8011。使用

netstat -nt|grep 8010|wc -l

netstat -nt|grep 8011|wc -l

查看到各有二百多个连接。
继续阅读“mod_jk奇怪的连接问题”

spring整合ehcache

20150505171917

20150505171928

ehcache参数说明

name:cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。如果在CacheManager中直接加入了一个其他名字的cache,系统会把defaultCache的设置给它clone一份。

maxElementsInMemory:cache 中最多可以存放的元素的数量。如果放入cache中的元素超过这个数值,有两种情况:1、若overflowToDisk的属性值为true,会将cache中多出的元素放入磁盘文件中。2、若overflowToDisk的属性值为false,会根据memoryStoreEvictionPolicy的策略替换cache中原有的元素。

eternal :意思是是否永驻内存。如果值是true,cache中的元素将一直保存在内存中,不会因为时间超时而丢失,所以在这个值为true的时候,timeToIdleSeconds和timeToLiveSeconds两个属性的值就不起作用了。
继续阅读“spring整合ehcache”