JAVA SpringBoot项目初期构建

 

项目初期的工程构建过程只需要按照SpringBoot官方文档启动 hello world 程序就完成了吗? 我的理解是: NO!

举个例子: 客户希望我们建一栋大楼 如果说之前的POC(Prove Of Concept)和Demo得到确认的话,那么紧接着的初期工程构建就是一个打地基的工程了。 打地基是一个很考究的过程。 大房子的地基如何打的好,这个得问思聪,不过SpringBoot项目的地基怎么打咱们就可以聊一聊了。


项目刚开始,我会建议团队讨论,达成第一个契约,即如何管理代码,这里面包括两个话题

  • 代码仓库(Git / SVN)

    这个问题现在可以逐渐淡化了,Git就跟智能手机一样风靡,选择gitlab, github还是其他的,就像选择安卓还是苹果,看团队的实际情况而定了。

  • 代码分支策略

    关于这个问题,我认为初期团队花时间讨论达成一致是很有必要的,甚至可以把之前别人的讨论结果提前整理出来,大家各抒己见,最后投票达成一致便是。 我听得看到最多的两个Trunk Based和Pull/Request, 这两种模式都能够应对团队合作开发的要求,网络和团队上都有关于这两个模式各自的使用场景和使用要求,大家讨论之前拿出来放到decision log里面就可以了。


有了仓库就可以checkout了,来啊,一起嗨,每个人先在本地把SpringBoot hello world给搭建起来,然后兴奋的跟团队说,跑起来了!咱们接下来是不是可以开始开发业务功能了呀。开发一半你突然发现,唉,怎么A同学用的Maven, B同学用了Gradle, 哈哈, 这真是一个难搞的问题,尤其对于某些强迫症的童鞋来讲。

慢慢你发现,我 X,怎么把代码跑起来越来越难,尤其是那些该死的配置文件!每次提交都包括了好多与业务代码无关的文件,后来发现那是IDE的代码风格在作祟!每次开发新功能,发现当前设计与自己期待的不太符合,内心一万头***!系统出了问题,QA找到你,日志去哪找,问题怎么重现,找Devops帮忙,你得到了一次善意的回复!系统上线之前,为了解决重构的风险,你噼里啪啦的添加了几百个单元测试!后期代码安全验收测试,你又得在报出来的几百个问题里挑挑哪些是自己作的孽,与此种种,让你从开始到结束都欲罢不能啊。

还能不能嗨皮的写代码了,与其欠的债最后一起还,不如分期啊! 看看在工程初期构建过程还能做些什么来避免未来的深坑

  • 确定代码编译工具,给Devops省点心

    Maven, Gradle傻傻分不清楚,还是干一架统一项目编译语言吧。

  • 统一团队代码规范,把问题暴露在你提交代码之前。

    编译过程添加代码,以gradle举例,添加两个plugin,‘findbugs’和‘checkstyle’,具体细节稍微spike一下就能搞定,别让测试追着你屁股跑

  • 让单元测试为你的代码质量和重构保航

    编译过程添加单元覆盖率检查,以gradle举例,添加plugin jacoco,你可以一步到位,覆盖率不得低于90%,如果那样难受的话,可以用后一次提交的覆盖率不得低于前一次这样的policy来逐步改善。 我鼓励并建议采用TDD开发,它更像是一种开发新的思维,不会造成冗余的设计,以目标驱动,直接简单,如果你觉得它拖慢了开发速度,那至少针对核心模块应该这么做,剩下的应尽快补上。

  • 针对系统的外部依赖,应该快速的构建相应的mock server, 保证开发的流畅度。

    如果有条件,使用在线的mock server来帮助快速搭建服务吧,RAP2, mockapi都不错。 简单的话,可以自己用jsonserver搭建一个 如果还有SSL链接需求的话,可以使用wiremock。

  • 针对外部依赖,添加集成测试用例,

    使用 spring integration test 应该有对应的集成测试来保证mock或者真实系统的正确性,减少集成调试时间。

  • 统一环境依赖,避免冲突

    为了开发者使用同一套环境的mock和其他依赖,使用docker是明智的选择,写个docker-compose文件轻松搞定


话说,jian到这个地步是不是可以了啊,など,还剩两个问题要撕逼,说完咱就撸起袖子干

  • Dev 和 Dev之间的问题

    自己嗨还不够,大家好才是真的好

    是用微服务呢,还是单体应用,这得具体情况具体分析,比如一个业务很简单的订单服务,用单体+load balancer就能轻松解决,如果用一个进程查,一个进程创建岂不是用牛刀杀鸡。

    应用设计是用DDD还是传统分层架构呢,将DDD在springboot项目的实践是一个挑战,不过它比传统分层更能直接的表达出领域知识,这两个都是团队可以讨论和尝试的地方。

    接下来的领域模型定义,业务模块划分和功能实现就是顺水推舟的事情了。

  • Dev和devops之间的问题

    开发不仅需要保证业务功能的正确性,也需要关注到Devops提出的部署和运维需求,满足流水线的流畅和稳定。

    比如配置文件的拆分和部署,在Spring boot有多种configuration管理方式,具体可参看其官方文档,比较常见的有两种,基于环境的profile机制,拆解local、dev、qa、pp、p配置文件,基于spring active profile启动应用程序。基于springboot默认的配置加载规则,将部署变量单独抽出来成为配置文件,和项目的基础配置文件applicaion.yml做merge, 并启动应用。

    比如日志的需求,是打印到console呢,还是打印到文件呢,需不需要rolling policy呢,是需要纯文本格式,还是json格式呢,每条日志的内容包含哪些字段呢,需不需要x-trace链呢等等,在springboot和日志相关的,NDC,MDC,Logstash,logback,slf4j了解一下。


如果你读到这儿,那一定是真爱了,相信上面的问题如果得到有效的讨论和实践的话,那么后续的开发过程一定很流畅,非要用一个外语单词表达的话,那就是 nice.

如果你没试过,为啥不动个嘴摸个屁股试试

如果你试过还不爽,也麻烦你分享一下经验,咱们相互学习吸收一下。

猜你喜欢

转载自www.cnblogs.com/lijma/p/10825243.html