服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

小A的后端架构升级记:数据库和项目结构(二)

日期: 来源:小A英语阅读收集编辑:小助手Amy

上一期我分享了为什么要升级小A的后端以及框架选择,今天我会分享数据库应用和项目结构(project structure)。


数据库

小A目前使用的是市面上使用最广的关系型数据库MySQL,这两年MySQL有江河日下的趋势,感觉PostgreSQL是一个更好的选择。我大概知道PostgresSQL对JSON支持更好,数据同步比较容易。不过最终我还是决定继续使用MySQL,因为阿里云RDS提供Serverless MySQL,这对我等穷人太友好了,又省下几百块!

(数据库后面还会提到)


项目结构(project structure)

这是一个网上讨论量极大的一个话题,没有绝对的对错,也不存在一种比另一种更好的情况,主要还是看项目本身。每个人的命名方式也不同,所以在此我只分享我认为是最好的。


首先引用一下Clean Architecture图:


https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

基本概念就是自己干自己的事,不是自己的事不干。依赖程度尤里而外递增,Entities不要知道任何外层。(职场上亦是如此。。。)


小A后端的文件夹们

cmd 是程序入口,go项目入口一定是main.go

entity和enum两个组成了Clean Architecture图里的Entities,属于整个程序的最里一层,基本是数据库的映射。enum类我习惯加type后缀。


domain entities

feature相当于Clean Architecture图里的Use Cases,是全部的商业逻辑。我习惯加query(读操作)和 command(写操作)后缀。每一个文件只做一件事。


use cases

每一个query/command都含有Validate和Handle两个function。Validate会返回exception。它们都属于request-validator interface。


validate和handle

middleware用来在数据到达controller之前做检查。


middleware

validate-json-request-middleware 和 validate-query-request-middleware 通过generic调用query/command的Validate功能,这样就不需要重复在controller里做Validate了。很难想象在golang支持generic前要做这些得多麻烦。


validateJsonRequest middleware

controller,middleware,exception,dto就是Clean Architecture图里的第三层

controller

因为有middleware,controller里面只需要获取信息然后handle


controller内部

dto又名Data Transfer Object,用来向外输出从数据库获取的entity,避免敏感信息泄露。有些人会把query/command也归于dto,然后在写一堆handler文件,我觉得太麻烦了,handler直接写在query/command里面了,所以在我这里query/command不算dto。


data transfer object

exception用来返回各种错误,主要有inputException(用户输入错误)和系统错误(数据库错误等)。input-exceptions用来存放多个input-exception。


exception

repository是全部的数据库操作,属于Clean Architecture图最外一层。我先定义了interfaces,然后用dependency injection倒入实际操作


repository

其中unit-of-work是全部repository的合集,可以用来做transaction操作


unit-of-work

service也属于Clean Architecture图最外一层,包含各种外部服务,也是用了dependency injection


service

到这里大概的结构就解释完了。一些外部框架包括

1. gin web框架;

2. gorm 数据库orm;

3. zap logger;

4. sentry记载崩溃;


关于数据库我想再说一点

我以前会把每一个http请求都包在一个数据库transaction里面,现在看是没必要的。只有在多个table写入或更改数据的情况才需要transaction以保证数据一致,所以我把gorm的SkipDefaultTransaction设为true。


本来我想加入读写分离机制,可以通过两个repository,一个master,一个readonly连接两个数据库地址做到;也可以通过微服务+消息列队做到。我看小A短期不会有这方面的需求,最终没有加入。

这期写这么多有一个原因是我在学习编程时总觉得网上能找到的资料虽然很多,但大部分都是互相抄袭,很多时候都没有一个真正在线运营的项目的解析。还有很多概念在ASP.NET里很常见却在go里被忽略了,比如dto,dependency injection等。

如果有同学需要代码可以留言给我。

下一期我想讲代码部署。

相关阅读

  • 上班还是创业?我的亲身经历会解开你的焦虑

  • 每日轻运动:第168天公众号日更:第45天今天太多事,还没抽空写东西,索性拿出2年前我写的文章,里面的观点能对你带来一些帮助。如果让我再重新选择一次,我会在一开始就尝试互联网项目
  • 在江湖上赚钱,掌握一门绝学就够了

  • 每日轻运动:第177天公众号日更:第54天0512 01姑娘有很多,但我们只能择一人终老。项目有很多,但我们最好只死磕一个。02各种教程常常叫你去挖掘需求,挖来挖去也不知道啥是需求。那
  • 最高可日赚2000+的小学项目,明天即将涨价200!

  • 每日轻运动:第389天快过年了,我相信很多人也慢慢放松下来,准备过年。但我的心思已经放在明年的计划上了,人一旦放松下来,再恢复工作的状态,就挺花时间的。关于明年,有人乐观,有人悲
  • 校招+社招!江西核电有限公司招聘岗位推荐!

  • 点击上方“蓝字”关注我们吧!江西核电有限公司于2007年12月在南昌市注册成立,由国家电投控股,赣能股份、赣粤高速和深南电参股组建,是中央特大型国有骨干企业国家电力投资集团下
  • 专访KAUKAU:所谓独特不过是来自遗忘

  • 先分享一个有意思的事情,虽然之前一直都有关注和喜欢KAUKAU的作品,但公司的小伙伴一直都对“KAUKAU”到底怎么读有着多种猜测。2023年的第一篇设计专访,我们终于和来自上海的KA
  • 利用闲暇时间复制粘贴就能日赚500+。(副业项目)

  • 今天是正月十六日,年,算是彻底地过完了,人们都开始正常上班了。村前村尾也几乎看不到人影了,只是,我们还是回味在乡愁里,透溢着满满的心酸与惆怅!因为过年回家再一次看到记忆中的
  • 国通信托频繁踩雷房地产:超20个项目展期

  • 房地产行业陷入低谷之后,作为曾经向房企资金输血的重要渠道,信托公司难以独善其身,不断爆出信托产品违约消息,国通信托就是其中之一。近日,有投资者爆料称,国通信托三款投向地产的

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 1.61版本开发中!

  • 亲爱的新老用户大家好!新的一年已过去1/12了,今年小A 会有一个新的开始,应大家强烈要求需要安卓版本,目前已安排安卓版本的开发,如果不出意外的话会尽快上线!请大家耐心等待,谢谢大
  • 短篇 34- 2022大裁员潮

  • 冬天真的来了。。。Amazon亚马逊预计将裁员超10000 人,总数仍保持开放。FaceBook脸书也已决定将人员规模缩减约 13%,解雇11000多名“才华横溢”的员工。同时Twitter推特解雇数
  • 105. 美加围城 1- 魁北克的困局

  • 终于,回到加州咱们要聊聊魁北克了,五年有余的生活还是有些感触的。这一个是很有趣的地方。。。让我对北美大陆东北角这个殖民历史最久,也是这块大陆上最独特的地方之一,她的美,无
  • 世界好好吃 3- 花生果酱三明治

  • 今天给大家介绍的是一个极具美国特色的极为方便的速食。它由大萧条而流行,经历过第二次世界大战的洗礼,也是国际空间站的必备食品。今天除了它的做法,照旧,我们来聊一聊这道速食