java开发,maven多模块项目管理的喜与恼

谈到java开发的多模块组织,我不禁乐道于maven的强大与高效,以至于在上一年进行前端规范化工作时,还时不时地拿gulpmaven进行对比。

谈到maven就不能不谈ant,早些年代的java库管理多是ant方式,项目需要什么jar包,就往项目的lib文件夹下塞,包出现了冲突解决起来比较费劲。Maven的方式叫做反应池,在项目中只需要一个pom.xml文件就可以管理包的依赖关系,而且可以通过视图能清晰地看到层次依赖关系,便于包冲突的分析与解决。而依赖的jar包文件放在当前用户的.m2文件夹下,打包时,又自动把依赖包组织起来。

Maven除了优秀的库依赖管理与插件依赖管理(这里暂时不多介绍),还有一个优秀的特性——项目模块依赖管理——这使得一个大的项目可以任意拆分成多个相对独立的原子功能(可以是业务功能点也可以是工具类库)。在实际工作中,我通常把工具类库打包成jar,把组织级别的业务功能点打包成war作为微服务。

Maven-module多模块组织固然有如此大的优势,但刚开始过度的原子化分割,是的项目后期维护出现了一定的难度:

一、前期技术储备不足,在eclipse中使用时,每次更新jar模块后,都要maven install下,把jar模块安装到本地库里。但这个问题是,随着项目模块的增加,没修改几行代码就要执行次这个命令,很耗费时间。当然,后期找到了正规的解决方法,但偶尔出现的问题,还是使得团队成员退回install方式。

二、后期维护成本较大。模块过多而且依赖复杂的后果就是,牵一发而动全身。有的功能,管理后台依赖了,会员也依赖了,一次改动,如果测试补充分,很容易添加新的bug.

三、新的团队成员上手难。复杂的项目结构,无疑为新成员设定了很高的门槛,光分析一个业务逻辑就好跨越好几个jar

根据以上几点,我把全公司的项目模块归类为两大类。一个是组织级别的框架模块,一个是项目级别的项目模块。框架模块可以成为项目前期技术选型的素材,优秀的项目模块又可以完善框架模块。两者相辅相成,当然两个都是通过maven-module的形式进行管理。

在业务系统中,在单体模式(这个项目就是一个war)与之前过度分割的原子模式之间进行折中。把整个项目定义为一个pom项目(maven项目有三种类型pom/jar/war),进行项目依赖库与插件的版本控制;每个业务端(比如,管理后台、商家后台、会员中心等)作为war模块,每个war模块相对独立,如果出现业务交集,通过前端调用不同war的接口进行整合,每个war模块所依赖的库或者插件都从父级的pom项目中选定。

业务系统中引来的工具类,在项目阶段审核后提交到框架模块的工具包里统一管理。业务系统中可重用的服务(如:登陆、鉴权、工作流等),则在框架模块中进一步抽象成为微服务。

一个项目的完成,不仅仅是交活收钱,对于公司来说,更大的财产是组织过程资产的积淀。

使用apache反向代理cpanel,实现后端服务器隐藏

一、应用场景

a) 后端服务器

cpanel 虚拟主机。

网站的ip访问路径如:http://192.168.88.27/~mydomain/

b) 前端服务器

可以进行apachevhost配置与反向代理配置的服务器,如:vps

本文使用ubuntu server 14/16作为前端服务器。要绑定的域名如:mydomain.com

二、安装apache

a) 登陆服务器并更新系统库

sudo apt-get update
sudo apt-get dist-upgrade

以上两个命令需要等待一段时间执行完成。

b) 安装并启动apache

sudo apt-get install apache2 #安装apache服务
sudo service apache2 restart

c) 安装所需的apache模块

cd /etc/apaches/mods-available/
a2enmod vhost_alias #安装vhost模块
a2enmod proxy* #安装所有的代理模块
a2enmod rewrite #安装重写模块,用于301重定向
sudo service apache2 restart

三、配置apache vhost与反向代理

a) 绑定域名的vhost配置

比如要绑定的域名为mydomain.com,后端cpanel网站的访问路径为http://192.168.88.27/~mydomain/

cd /etc/apache2/sites-enabled/
sudo vim mydomain.com.conf #需要熟悉vim的基本用法

进行如下配置,按【i】键进入编辑模式左下角会提示INSERT

<VirtualHost *:80>
   ServerAdmin webmaster@mydomain.com
   DocumentRoot "/var/www/"
   ServerName www.mydomain.com

#反向代理配置
ProxyPass  / http://192.168.88.27/~mydomain/
ProxyPassReverse  / http://192.168.88.27/~mydomain/

#cookie的代理
ProxyPassReverseCookieDomain 192.168.88.27 www.mydomain.com
ProxyPassReverseCookiePath  /~mydomain/ /

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
   ServerAdmin webmaster@mydomain.com
   DocumentRoot "/var/www/"
   ServerName mydomain.com

#301重定向
RewriteEngine On  
RewriteRule ^/(.*)$ http://www.mydomain.com/$1 [R=301,L] 

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

b) 重启apache

sudo service apache2 restart

c) 域名解析

把域名mydomain.comwww.mydomain.com解析到前端服务器的公网ip上。

低成本搭建网站生产环境-反向代理

由于工作需要,本人除了开发还要做些必要的运维工作,因此积累了些生产环境搭建与优化的经验。本人还是个人站长,所以又对低成本运营网站十分关注。本文正是结合两者,试图通过技术解决运维成本的问题,而提出的设想。——目前已经在公司做产品展示环境搭建,进行了初步验证。

本文主要提供解决思路,不会提供大篇幅代码。本文适合具有一定技术基础的朋友,而且文中涉及的技术有不少同类替代方案,请因地制宜的实施。有需要或者感兴趣的博友请关注公众号“李德涛博客”或者邮件联系“ldt#lidetao.com(#换成@)

一、一个正常网站的成本分析

a) 域名

域名是网站的名字,一般注册个新域名的成本在20-100元左右。优秀的域名大都被米农收购,需要用较高成本获取,价格有行情确定,极其优秀的域名可价值几百万甚至几千万(当然你要是有能力购买这类域名,就不会看本文章了)。

b) 网站服务器

网站是程序,程序需要运行在计算机上。网站服务器就是运行网站程序的物理(或者虚拟)计算设备资源。这类计算设备资源有物理服务器、虚拟服务器(也叫vps或者ecs)、虚拟空间等,成本依次往下降低。一般使用phpasp或者jspcms进行建站的一般使用虚拟空间就够了,成本在每年几十到几千不等(主要与配置有关,也有免费的低配)。本文构思是由于网站使用了新的技术,传统虚拟空间无法满足要求,但虚拟服务器价格相对较高(对于一个穷酸秀才来说),此方案的核心思想是尽可能少的使用收费的计算资源,而只使用其网络资源。

c) 公网环境

网站需要被访问,需要发布到Internet上,稳定的公网ip与网络服务是必不可少的。对于企业来说,有的会自建机房,拉专线并买独立IP;也有的把服务器托管到运营商的机房里,这对于一个小站长来说都是不可想象的。一般会使用IDC服务商提供的虚拟空间或者虚拟服务器等计算资源,他们一般会绑定网络资源一同销售。

d) 运营成本

对于个人站长来说,运营成本可大可小,主要是花费些时间充实网站内容,做SEO,做产品或者服务营销。

二、反向代理降低成本的解决方案

a) 方案核心思想 继续阅读低成本搭建网站生产环境-反向代理

java实现html转pdf-基于PhantomJS

一、前言

PhantomJS是一个无界面浏览器,可以在服务端通过命令行的方式使用。旨在用于页面自动化(page automation,网络监控(network monitoring, 页面截屏(screen capture,与无界面测试(headless testing)。

本文将介绍使用PhantomJS官方实现将网络页面与本地html文件渲染为pdf文件。

二、安装

去官网(http://phantomjs.org/download.html)下载合适的软件包——本文使用windows的软件包为例子。

下载软件包后,解压到指定位置(本文解压并改名为phantomjs——D:\dev\phantomjs)。

三、使用

PhantomJS官方提供很多优秀的例子(http://phantomjs.org/examples/),本文就是直接使用了其中一个例子(rasterize.js)。 继续阅读java实现html转pdf-基于PhantomJS

apache+tomcat配置负载均衡,实现http与websocket接口分压

一、应用场景

在生产环境中,应用服务器(此文以tomcat为例)不免面临高访问量的压力,相比而言web服务器(此文以apache为例)能够承担更大的并发量。Apache本身带有一些模块,可以完成对应用服务器访问流量分流分压的功能。这里就以apache+tomcat配置负载均衡的方式,实现httpwebsocket接口分压的效果。

二、系统环境

服务器:阿里云ECS服务器;

操作系统:ubuntu 14

应用服务器:tomcat 8.5+;

Web服务器:apache 2.4+;

三、Tomcat配置

tomcat官网下载压缩包,解压为两个tomcat实例(分别为tomcat-8080tomcat-8082)。

a) 修改tomcat-8080的配置文件(conf/server.xml

 <Connector port=”8080″ protocol=”HTTP/1.1″

               connectionTimeout=”20000″

               redirectPort=”8443″ URIEncoding=”UTF-8″ />

 <Connector port=”8010″ protocol=”AJP/1.3″

redirectPort=”8443″ URIEncoding=”UTF-8″ />

 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”jvm8080″>

四、修改tomcat-8082的配置文件(conf/server.xml

 <Connector port=”8082″ protocol=”HTTP/1.1″

               connectionTimeout=”20000″

               redirectPort=”8443″ URIEncoding=”UTF-8″ />

 <Connector port=”8012″ protocol=”AJP/1.3″

redirectPort=”8443″ URIEncoding=”UTF-8″ />

 <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”jvm8082″> 继续阅读apache+tomcat配置负载均衡,实现http与websocket接口分压