V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
odirus
V2EX  ›  分享创造

Java 项目最佳实践分享和探讨,项目模块层级如何划分, Docker、Apollo 能够给我们带来哪些便利。

  •  
  •   odirus · 2019-10-25 13:41:49 +08:00 · 3625 次点击
    这是一个创建于 1616 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们在项目中遇到了下面这些问题,看是否引起大家的共鸣。

    1. 项目开发的时候需要依赖 MySQL、Redis、ElasticSearch 等服务,之前大家都是用公司内某台服务器上提供的服务,但为了能够调试、跟踪程序的一些细微问题,需要自己独享这些服务来避免其他人运行程序时干扰自己的工作,难道需要让运维为每个人提供一组单独的服务吗?

    2. 项目进行单元测试、集成测试的时候或多或少都会用到外部服务,而且有时候同一个测试还不能多次运行,往往会因为数据库里面的主键冲突而导致运行失败,这个问题怎么解决呢?

    3. 不希望在正式打包的时候混杂了任何测试代码,这该怎么办呢?

    4. 我们在每个应用或者微服务中的项目结构是怎么样的呢,他们每层的职责是什么?

    针对以上问题,我们把我们的解决方案放到了这个项目中 github demo-server ,希望对大家有帮助。

    如果有误人子弟地方,欢迎批评;如果有更好的解决方案,欢迎讨论,不吝赐教。

    12 条回复    2019-10-26 13:13:21 +08:00
    gz911122
        1
    gz911122  
       2019-10-25 14:01:23 +08:00   ❤️ 1
    1.弹性测试环境
    2.mock service
    3.本来就不会
    4.个人习惯按功能分包而不是按层分包
    odirus
        2
    odirus  
    OP
       2019-10-25 14:03:21 +08:00
    我说一下为什么我们要把这些东西放到 github,主要有以下原因:
    * 不希望我们再固步自封,我们希望和大家沟通技术,改正我们错的地方,也希望吸收新的想法和实践。
    * 希望通过 github 持续输出一些我们的最佳实践和技术规范,帮助到有需要的人,这个过程中我们也可以完善自己的标准体系。
    odirus
        3
    odirus  
    OP
       2019-10-25 15:49:07 +08:00
    @gz911122
    1. 第一次听到弹性环境这个词,请问有更多资料吗?我想了解和学习一下
    2. 我们单个微服务内的集成测试是没有把 MySQL、Redis 等 mock,因为我们会对数据库里面的一些记录做断言。
    3. 我们把测试依赖的基础代码写到 sever-test 的 main 里面的,而不是 test,是为了在测试阶段其他模块可以服用代码。
    4. 嗯,这只是我们目前的模式

    再次感谢,不吝赐教
    gz911122
        4
    gz911122  
       2019-10-25 16:16:54 +08:00
    @odirus 弹性环境你可以理解成 很方便拓展的一个服务治理平台...
    需要某个组件 or 服务的时候新建一个就可以了,用完可以删掉,我们目前是基于 k8s 做的
    lx91714
        5
    lx91714  
       2019-10-25 16:21:18 +08:00
    其实我比较关心项目模块层级如何划分,每次搭项目都要纠结很久
    odirus
        6
    odirus  
    OP
       2019-10-25 17:14:02 +08:00
    @gz911122 哦哦,这个倒挺有意思的,主要是我希望认为参与越少越好,免得出错
    leon0903
        7
    leon0903  
       2019-10-25 17:35:05 +08:00
    @lx91714 我也是 感觉 Java 项目代码模块划分好像都不太统一。
    odirus
        8
    odirus  
    OP
       2019-10-25 17:39:21 +08:00
    @leon0903 其实很正常,每个公司、公司内的每个团队都有自己的风格,所以项目结构是不可能统一的,只要能说服大家或者强制推动大家使用就可以了。
    OxO
        9
    OxO  
       2019-10-25 18:08:30 +08:00
    支持
    findsomeone
        10
    findsomeone  
       2019-10-25 19:40:28 +08:00 via iPhone
    谢谢分享!
    zhazi
        11
    zhazi  
       2019-10-26 09:28:44 +08:00 via Android   ❤️ 1
    2,单元测试不涉及到数据存储,不存 3 在脏数据的问题,更多是对充血模型中对象里业务“动词”的测试,断言“名词”属性就可以了。
    集成测试可以使用 rollback 处理脏数据问题。
    4,看你的结构上有引用 ddd 的概念,但是几个概念上明显的错误,facade 模式应该对应的是应用服务层,不管 web 还是 api 只需要通过 facade 接口调用应用就可以了,不需要考虑程序内部实现。防腐层是一个适配器的概念,将外部的感念转变成内部的概念。避免内部业务被外部侵蚀。比如商城项目中,有用户领域,用订单领域,订单中有 buyer,用户中有 user,是两个业务名词,需要用防腐层隔离。
    在分包上,每个业务对象都要有对应的测试。说的意思是,这组业务的核心功能和他的测试代码一定要同步进行,不能说,我拿到业务的核心代码,但是没有测试类。还要单独引用一个业务代码测试包才能对这个代码进行检验呢。接口测试代码要在 web,api 层。应该是同步进行的,测试接口不需要考虑应用层的问题。应用服务是 mock 出来的。
    itmyhome126
        12
    itmyhome126  
       2019-10-26 13:13:21 +08:00
    标记学习一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3747 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:37 · PVG 18:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.