项目重构感悟
重构决定
需要提前做好新旧系统的切换方案的规划
要高度重视对数据的重构,对数据的调整和兼容是重中之重
重构是为了解决实际的项目问题,而不只是作为程序员的一个代码洁癖。所以,需要对新系统有可以量化的指标(eg. 性能提升5个点、开发工作量减少30% 等)
技术选型时,不要盲目最求新技术,需要尽量使用成熟、简单的方案,选择成熟简单的方案在遇到问题时多能在网上找到对应的解决方案。文档相对也会更完善。
团队管理
重构过程中需要时刻紧跟,定期review代码,及时调整。可以采用Scrum的方式, 持续的 交付->试用->反馈->调整
树立编码规范、最好是能有一组对应的代码片段作为模板来参考,并通过技术手段做相应的限制,如checkstyke和版本管理工具的结合(为了代码的整洁和统一,这一点在团队中还挺重要的,毕竟团队中的人员各自风格不同[更别提其中还有些非常糟糕的风格])
对代码的改动需要小范围逐步改动,并修改/增加对应的单元测试
团队成员的培也需要重视,团队成员的功底也是不一样的,在项目开展过程中一般就会体现出来。此时可以做相应的学习指导
项目管理的知识和了解 ...
分布式系统一致性问题处理思路
为啥出现一致性问题在传统单体架构中,数据状态的处理都在同一个服务和数据库中,而具有**ACID特性**的数据库支持强一致性,就是说数据库本身是不会出现不一致的状态的,比如我们常用的关系型数据库MySQL就是通过多版本控制协议(MVCC)的实现来保证了强一致性。
但是随着互联网的发展,用户增多&服务也越来越多越来越复杂,数据量和请求的并发量都上来了。为了满足这一变化,越来越多的系统从单体架构投入到服务化或者微服务架构。然而,微服务是把双刃剑,虽然能通过对服务的有效拆分来实现敏捷开发和自动化部署,并提高系统的水兵伸缩能力;但是微服务模式下,服务之间通过网络来通信(网络并不是可靠的),那么当网络异常时,就很容易引起各个系统之间的不一致。
一致性相关思想理论一致性类别
强一致
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可用性。
弱一致性
系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入 ...
Jasperreports OOM问题处理
问题描述项目使用Jasperreports来转换导出PDF,不过在转换过程中有时会出现OOM的异常。将直接导致线上系统不可使用。主要导致OOM的问题有如下两种:
jasper模板文件设计不合理导致Jasperreports进入死循环
需要转换的文件确实很大,超过了系统所支持的内存范围
此前就有遇到过上述情况导致系统不可用的情况,这明显影响了程序的健壮性。是需要处理的。此前对该的处理排查描述请查看之前的博文:线上java程序CPU占用过高问题排查
问题处理既然知道问题由于内存占用过多导致的,那么直接从上面的两个问题可能思考解决方案即可。
jasper模板文件设计不合理在设计模板时,如果勾选了”Print When Detail Overflows“选项时,那么很有可能就会导致OOM了。这个问题官方将其定位为模板设计不合理,并不打算解决。所以只能我们自己严格把关了。
针对该问题我考虑了两种解决方案:
利用SVN钩子函数,在提交jasper模板文件时校验设计文件是否有勾选”Print When Detail Overflows”属性。简要的设计如下:
svnlook chan ...
微信公众平台SDK JAVA实现WeChat-SDK
前言最近有做一些涉及到微信公众平台和第三方平台开发的工作。需要使用微信提供的接口。然而微信只提供了基于基本的HTTP接口,并没有对应各语言的SDK实现。所以如果自己开发的话需要封装一套SDK。不过,微信公众平台出来几年了,市面上早就有不少JAVA实现的微信SDK了。于是便收集了一些开源的JAVA实现的微信SDK,但是最后都不是特别合适。最终决定自己写一个。下面给出各开源SDK的实现对比和自己的写的进展。
微信公众号java sdk技术选型针对目前开源的公众号java sdk对比,之前已经有人对比过了。可以自行前去:微信公众号java sdk技术选型
针对上面几款开源的微信公众号SDK,针对我自己的需求,我自己也做了下简单的对比:
-
jfinal-weixin
weixin-java-tools
fastweixin
weixin-popular
实现简单
√
x
√
√
更新快且全
√
√
√
√
有对应的实体封装
x
√
√
√
依赖少
x
x
√
√
方便支持多公众号
√
x
x
√
代码结构&可拓展性
√
√
√
x
可以看出是没有一 ...
使用checkstyle校验代码
引入背景目前手上接管了一个旧项目,在调整的过程中发现其编码规范非常的多样化。其实就是没有规范了。代码中的命名、注释、换行等风格都有多种,差不多每个曾经修改过代码的程序员都留来过自己的风格。代码风格质量良莠不齐,这导致新员工在阅读代码时需要花更多的时间,也更加痛苦。所以考虑使用checkstyle来校验统一代码风格。
起初考虑是直接在svn上做一个pre-commit的hook的。不过沟通无果,svn服务的权限无法掌控在自己手里。于是便考虑使用maven插件Apache Maven Checkstyle Plugin,在本地编译的时候去校验。不过由于是旧项目,在使用插件时不希望校验以前的老旧代码,不然这将是一个灾难(除非你希望改到天荒地老)。那么,这边就希望只校验新增加和修改的文件。后面给出处理方式。
Checkstyle介绍Checkstyle 是一个帮助程序员使用统一编码风格来编写java代码的开发工具。它能够替代人工自动校验代码,这是希望使用统一编码风格的项目的理想选择。Checkstyle是高可配的,几乎支持任何的编码风格,人们可以使用自己的编码标准。
可以参考下Sun和Go ...
SpringBoot 整合Mybatis/Druid/Quartz
由于项目中定时任务逐渐增多,对系统的压力也慢慢增加。故打算将系统中的定时任务抽离出来。初步决定使用SpringBoot+mybatis+quartz的整合方式进行快速开发。
整个整合会包含如下任务:
整合Mybatis(包括通用Mapper和分页插件)
整合Quartz实现动态定时任务管理
整合Spring AOP编程(定时任务中的AOP也会生效)
整合Druid
Spring单元测试集成H2数据库
整合MyBatis添加依赖12345678910111213<!--mybatis--><dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot-starter.version}</version></dependency& ...
mysql 5.7 group by 1055
最近遇到的一个问题,有个项目使用的mysql升级到5.7后,发现项目中有些sql语句执行会报错。
报错类似如下:
12[SQL]select accountname,accounttype from weixin_account group by accountname;[Err] 1055 - 'wcmgt.weixin_account.accounttype' isn't in GROUP BY
于是便查阅资料了。随后发现,原来mysql5.7.5后,ONLY_FULL_GROUP_BY 默认为真,那么此时select中的字段必须出现在group by中。官方的说明文档如下:
SQL Mode Notes
Incompatible Change: These SQL mode changes were made:
Strict SQL mode for transactional storage engines (STRICT_TRANS_TABLES) is now enabled by default.
Implementation of ...
线上程序CPU过高问题排查
简要工作中负责的有一个项目是使用iReport+JasperReport实现的一个打印系统。最近这个线上程序经常无响应,重启后恢复正常,但是时不时还是会出现类似的问题。
最后发现是JasperReport的一个问题。有个JasperReport的转换任务内存占用特别高,当新对象需要分配内存时就会内存不够了,于是GC线程就不断GC,占用CPU。
导致系统CPU占用超高。
下面说下问题排查的一个思路步骤
基本环境
tomcat 7
JDK 7
Linux
问题定位查看后台异常通过查看系统的后台日志,发现各个请求都正常,没有异常抛出。于是考虑系统状况
查看系统状况top 命令查看CPU、内存等使用情况123456789101112131415161718[root@DEV-L002323 ~]# toptop - 14:52:54 up 514 days, 7:00, 8 users, load average: 2.85, 1.35, 1.62Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie ...
docker初识:运行mysql实例
环境
CentOS 7.3 64bit
安装docker
移除旧版本Docker
yum remove docker docker-common docker-selinux docker-engine
设置Docker仓库
2.1 安装所需要的包
yum install -y yum-utils device-mapper-persistent-data lvm2
2.2 设置添加稳定版的Docker仓库
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 DOCKER CE
3.1 更新yum
yum makecache fast
3.2 安装最新版的docker ce
yum -y install docker-ce
3.3 也可以安装指定版本的docker ce
列举可用的docker ce
yum list docker-ce.x86_64 –showduplicates | sort -r
安装指定版本
yum ...
CentOS 7.3 搭建OpenCart
环境
Centos 7.3 64-bit
OpenCart 2.3.0.2
安装LAMP环境和OpenCart
How To Install OpenCart On CentOS 7 Linux
配置支持SEO ,在OpenCart项目部署根目录下创建.htaccess文件,内容如下(需要在OpenCart后台打开SEO支持)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# 1.To use URL Alias you need to be running apache with mod_rewrite enabled.# 2. In your opencart directory rename htaccess.txt to .htaccess.# For any support issues please visit: http://www.opencart.comOptions +Follow ...