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) 方案核心思想 继续阅读低成本搭建网站生产环境-反向代理

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接口分压

开源之我见

2016年冬,我决定挣脱束缚的枷锁,不再作为他人的“试验品”,毅然走上那条路。

在迷茫无助之际,感谢我的精神导师——《极客与团队》的作者——引导我走向组建学习型分享型组织与开源运动的道路。

近些年,国内开源运动风生水起。开源项目如雨后春笋般地增长,其中不乏知名互联网企业的贡献,同时也可以看到新兴互联网企业的身影。

说到开源,一般的企业是不赞同,甚至坚决反对的。但这里不谈商业,只谈行业!

程序猿、攻城狮、产品狗等IT从业人员。应该清楚地看到,你们的舞台(亦或是战场)不仅仅是在你所效力的平台,是时候睁开眼去看看分布在全球各地的兄弟姐妹们了。

一、我们是对手,更是朋友

“如果你成功了,要感谢你的家人与朋友;如果你想持续成功,那请向你的对手致敬!”——我说的。同行,是个很微妙的关系。——即存在着竞争关系又存在着合作关系。——无法同时处理好这两种关系,可能会难以理解一些工作(甚至事业)上的“不可思议的游戏规则”。

兴许很多人已经看透了平台里这些潜规则,并能娴熟的做出对自己最有利的决定。但这里,我想说的是,“去与平行世界里的自己做游戏”。——这个“平行世界里的自己”不是“多重宇宙的自己”,而是分布在世界各地的,忙碌在所效力平台的自己(因为我们是一体的)。

感谢互联网,连接了你我的心;感谢开源运动,连接了你我的大脑。

“如果你自满了,那就出去看看外面的世界;如果你孤单了,那就去看看外面的世界。”开源运动,为全球的从业者搭建了一个开放、平等、自由的交流平台。在这里,你可以看到行业前沿,为自己的事业发展指明道路;在这里,你可以进行思想与思想的碰撞,激起创新的火花;在这里,你可以与全球最优秀的同行同台竞技,保持自己的最佳状态。

这是你的归宿——在这里你可以遇到志同道合的朋友,甚至人生的贵人。这是你的起点——积蓄好力量,望着远方,继续出发。 继续阅读开源之我见