近年来,Java技术栈发展非常快,成百上千种技术工具不断问世,这也带来了一个问题:作为开发者,我们应该选择哪些工具来构建最合适的技术栈?今天给大家推荐一波自己常用的,自己理解的工具和框架。一、项目工具1.1IDE现在主流的Java开发工具是IntelliJIDEA。几年前,Eclipse或许还能和IDEA抗衡,但现在基本被IDEA统治了。以我自己为例,我先用IDEA,然后用了几年Eclipse,再用IDEA。包括我身边的程序员,以前用过Eclipse的,最近几年很多人都转用IDEA了。如果你问我IDEA最酷的使用方式是什么,我觉得有3点:智能代码提示,酷!自动代码生成,酷!代码调试,爽!而这3点恰恰是能够大大提高程序员开发效率的3点。所以建议做Java后端开发的程序员可以优先考虑IDEA作为开发工具。1.2版本管理工具Git已经垄断了项目中的代码版本管理工具,新建项目无需考虑SVN和CVS。Git现在之所以处于垄断地位主要是因为两点:Git是分布式的,完整的代码历史版本不会因为版本管理服务器的崩溃而丢失。Git创建分支是一个非常廉价的操作,可以随意创建分支,使得并行开发容易实现。但是SVN、CVS等版本管理工具创建分支很别扭,并行开发很麻烦。以上第一点大大提高了代码资产的安全性和可靠性;第二点完美适应了当代敏捷开发的需求。因此,难怪Git如此受欢迎。1.3构建工具Java项目的构建工具大打出手,业界普遍有两种选择:Maven和Gradle。如果是后端的Java项目,大部分还是使用Maven来构建项目。对于前端Android项目,请选择Gradle。Gradle本身比Maven先进很多:配置灵活,性能优秀,确实是一个非常好的构建工具。那为什么大部分后端Java项目都用Maven呢?因为Gradle本身过于灵活,这种灵活性带来了两个与后端工程构建特点不匹配的问题:Gradle因为灵活,所以使用规则多变,导致学习门槛过高——构建过程后端工程本身比较死板,改动很少,不需要过多的构建特征和构建规则。也就是说,Flexibility本身引入的各种用法、规则、特性,对于后端项目意义不大。为了构建工具本身的使用,投入时间学习是不划算的。上文提到,后端项目的构建过程本身就比较常规,需要一些强约束来保证这个常规的可靠性和稳定性。但是Gradle由于其灵活的配置规则而失去了Maven的强约束。这很可能会在团队使用Gradle时造成各种冲突和潜在的错误,从而导致项目构建。不稳定,对于后端项目来说得不偿失。2.开发框架2.1Web框架目前的Web项目开发大多转向了SpringBoot。使用SpringBoot最大的三个优点:配置非常少,可以说是基于Spring的即插即用,入门门槛很低,可以直接运行,不用考虑web容器的问题。SpringBoot大部分人都比较熟悉,这里不再赘述。2.2持久层框架项目开发中使用的持久层框架基本上有两类:Mybatis系列衍生框架和JPA系列衍生框架。在国内,大部分的持久层框架还是比较喜欢Mybatis,国外的项目好像都用的比较多。JPA框架。在我看来,互联网项目和toC项目更适合Mybatis,toB项目更适合JPA。toC项目的业务需求往往是灵活多变的,因此往往要求项目技术也是灵活多变的。Mybatis本身就是对SQL的简单封装,添加表和字段,改SQL很容易。toB项目不同。需求基本稳定,设计的数据模型不会经常变化。因此不需要Mybatis的灵活性,而是需要一系列的强约束来随意修改模型。而这也是JPA本身的特点:很规范,约束也很多,改变JPA的数据模型的成本比较高。所以大家在选择持久层框架的时候一定要看清楚项目的特点,根据实际情况选择Mybatis或者JPA。2.3RPC框架Java项目的架构基本都在向分布式架构转变。分布式系统集成的核心是RPC,所以很多项目都引入了RPC框架。RPC框架,现在比较常用的是Dubbo框架。Dubbo的性能非常好:很多RPC框架使用的底层通信协议是HTTP,而Dubbo选择了TCP协议作为通信协议。单从性能上来说,TCP的性能肯定比HTTP好很多。而且,Dubbo本身也大量使用了NIO异步编程来进一步优化性能。因此,如果你的项目中需要使用RPC,可以首先考虑Dubbo框架。3.中间件3.1Web服务器目前Java开发大多使用SpringBoot,所以Tomcat、Jetty、Resin等常用的Web容器都没有单独部署和使用。然而,有一个Web容器正在蓬勃发展,那就是Nginx。Nginx在Java项目开发中有着非常特殊的地位。它在Java项目架构中扮演两个角色:处理静态资源请求的web容器——Nginx负责处理Java项目中图片、html、js、css等静态资源的Http请求。反向代理分发——Nginx除了作为专门处理静态资源请求的web容器外,后期还会将对servlet、controller等动态资源的请求转发给SpringBoot内置的Tomcat容器。还有一点,因为有反向代理的特性,后面会在集群上部署Nginx。Nginx在转发请求的时候,也会做一个反向代理,进行负载均衡请求分发。3.2消息队列现在大家的架构越来越分布式了。在分布式架构中,常用的通信手段,除了网络请求,就是消息队列。目前主流的消息队列框架有RabbitMQ、RocketMQ、Kafka等,RabbitMQ虽然性能较低,但使用方便,更适合中小型项目。另外,在做金融领域相关的项目时,如果使用消息队列可以优先使用RabbitMQ。原因有二:RabbitMQ是AMQP协议的实现,AMQP协议本身是由金融行业的软件专家共同制定的。它非常成熟和全面,已经成为行业标准。RabbitMQ是用Erlang编写的。Erlang的虚拟机在保护内存和CPU免于过载方面非常成熟,这使得Erlang应用程序本身可靠且健壮。对于大型项目和非金融类项目,可以选择RocketMQ和Kafka。RocketMQ和Kafka几乎90%的功能和理念都是相似的,只是RocketMQ在Kafka的理念基础上做了一些改进,更适用于更广泛的业务场景。在流数据处理中,应该优先考虑Kafka,因为Kafka的流数据处理生态更加完善和全面。3.3数据库在互联网领域,主流的数据库是MySQL。在一些传统行业,比如银行,Oracle用的比较多。甲骨文很贵。互联网项目的特点之一就是数据库服务器数量多。如果用Oracle的话,成本太高了。而且,大家的版权意识也越来越强,国家在这方面的管控力度也越来越大。因此,互联网领域几乎无一例外地使用MySQL。使用MySQL,有一个常见的MHA方案——MySQL的高可用方案。基本架构是一主二从。当master失效时,slave会提升为master。3.4外部缓存对于高并发架构来说,外部缓存是必不可少的,最常见的就是Redis。大家使用Redis作为外部缓存的原因有以下三个:Redis本身有非常好的性能。Redis有多种数据结构来适应不同的业务缓存需求。Redis的集群高可用方案和分片存储高性能方案都比较成熟。以上就是Java开发中经常遇到的主流技术工具。限于篇幅,我只列出一些最核心的(或者说大家都会用到的)工具和中间件。还有一些比较重要的中间件,我想大家不会用到,所以就不提了,比如ElasticSearch、MongoDB、Zookeeper等(后面会写一篇文章介绍)。希望本文对大家有所帮助,能够帮助大家快速准确的找到当今主流的技术工具,能够帮助大家提高开发效率。
