自营商城架构杂谈

前言

自营商城在技术层面来说是比较简单的系统,难点一般都在业务逻辑,只要业务逻辑理通顺了,技术实现起来并不难。但是做一个可靠的系统还是需要一定的功夫打磨,毕竟再简单的系统如果没有一定的规划与架构,后续维护与扩展也是一个头疼的问题。以下是我从事商城开发一年多的个人经验,分享给大家一起探讨学习。

技术栈架构图

架构图

详细说明

后台

自营商城最开始开发一般都是小团队进行开发,后台不会有前端工程师的参与,我个人非常推荐使用 ElementUI 进行后台开发(原始引入的方式,非打包),后台程序员参考官方文档就能写出很好看的 UI,结合上 Vue 对于一些复杂的表单页面也会比 jQuery 好写很多。

前台

前台是商城的重要组成部分,一般会先由设计部出设计稿,评审通过后再交给前端进行开发。

  • 商城是一个非常需要 SEO 的网站,所以在技术选型上优先考虑使用框架模板引擎作为基础,对于一些不需要 SEO 的页面(购物车,个人中心)可以使用 Vue 渲染。

  • 对于静态资源的引入会涉及到 CDN 缓存的问题,所以使用 Webpack 对静态资源(css,js)进行打包,而后结合 Laravel mix 进行版本更迭。

  • axios 是替代原有 jQuery ajax 的,他拥有非常完善的请求机制,代码层面也更加语义化。

  • Promise:商城中会涉及到第三方平台数据上报,有时候部分业务逻辑在前台是异步的,这时候就需要用到 Promise。

服务器

软件

服务器基本架构还是 LNMP,但是对于完善的系统应该还需要一些工具的辅助。

  • Redis:作为缓存驱动、队列驱动、锁、Session驱动 等

  • Supervisor: 守护队列进程

  • Shell:切割日志、服务器备份等

  • ElasticSearch:前台搜索引擎、日志收集等

代码

在传统的 MVC 上,多加一层 service ,用于放置业务逻辑,结合公司实际业务需求也可继续划分。

  • Middleware: 用于权限校验、日志采集等全局性的逻辑

  • Job: 不影响主流程的业务逻辑都应该使用队列,例如客户注册成功发送邮件,客户注册是主流程,只要客户注册数据写入数据库成功,就可以跟客户端返回成功,发邮件使用异步进行处理。这样既优化了业务流程,也优化了代码结构

  • Event: 事件是 Job 的升级版,业务初始逻辑可能是客户注册成功发送邮件,后面产品经理又加需求:客户注册成功要发优惠券,如果去注册逻辑那里再派发个优惠券任务是不是显得不够优雅(如果产品经理又双叒叕加逻辑,揍他),这时候就可以使用事件来代替了,只用在主流程结束后派发一个事件,然后再给事件定义监听者即可

  • Exception: 我很少在业务逻辑中看到有人写专门的异常类,但是我十分推荐大家使用异常,每个业务逻辑都应该有自己的异常类,一个方法只有异常跟正常,上层只用放心调用、处理异常就行,不需要关心方法的返回值(返回值必然是成功)

数据库管理

migration 是一个十分符合版本管理的工具,以前使用 SQL 文件进行数据库管理,往往会有数据库跟线上不一致的情况,而且执行起来也麻烦,自从用上了 migration ,一行命令轻松迁移(点一下用一年,超快迁移不要钱),结合上 seed,能够对数据库结构与初始数据进行一个很好的统一。

依赖管理

0202年了,还有人把 vendor 文件夹纳入版本管理(气冷抖)

之前接手一个项目, vendor 文件夹纳入了版本管理,并且更改了框架底层代码(之前程序员说没办法只能改底层,后续出了一堆莫名奇妙的 Bug),说多了都是泪。对于第三方依赖尽量不要去改底层,如果真的是有问题,可以单独拿出来(或者给作者提 issue),一旦更改了第三方依赖,等于说放弃了版本升级、官方 Bug 修复,一切都只能自己来,耗时又费力还不一定搞的好。

权限管理

这里指的是后台系统的权限,商城系统比较简单,使用一般的 RBAC 即可。

异常通知

针对项目中的各种异常,可结合公司办公 IM 软件进行告警,企业微信和钉钉都有群机器人,结合 Laravel 的 Exception Handler 进行异常告警,发现 Bug 的速度大大提升(偷偷改 Bug ,业务还不知道)

定时任务

主要用于订单超时处理、日志切割、数据备份等

代码更新

在部署服务器代码更新完后,更新第三方依赖,打包静态资源,然后 rsync 同步到生产服务器,减少生产服务器宕机时间。

深圳求职中,坑位介绍可私信,笔芯

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 19

@wongvio 谢谢大佬的评论,最近在忙生活中的事,上社区比较少,回复慢了请多担待,对于大佬说的几点我做几个说明:

  1. 罗列炫耀?并没有什么值得炫耀的东西,我开头文章就说了,商城就是一个很简单的系统,没有什么很高深的技术,我写这篇文章的目的不是去炫耀我会什么,而是总结一下我做这个系统用了有大概哪些东西(这点东西在很多大佬眼中更像事玩具),php、nginx、mysql 这东西难道没用到吗?既然总结当然全部写上,不是说这种东西是“默认”了就忽视掉,至于laravel blade 为什么写上,可能是我没表达清楚,我更想说的是前端开发还是按照 PHP 框架的模板语言去渲染(对SEO友好,简单上手)。
  2. 新手劝退?首先我写的是自己的博客,并不是写的教程,新手能看懂多少,跟我有什么关系呢,况且我写的东西是基础的不能再基础的东西,这都看不明白还谈开发?你说的用 php+div+css+mysql+js 可以开发出很好的商城,那么如果少了其他工具的辅助,你系统的稳定性、拓展性有保证吗?我这篇文章只是分享一下自己在做整个系统所用到的东西,去保证整个系统的可用性,并没有说让大家都这么用,程序员都有自己的思维,把事情做好不就行了吗?
  3. es6 不是语法吗? ES6 是语法,但是用到实际项目中的又有多少了,不去开始就明确项目的语法版本,后续开发能否保证一致性?
  4. webpack 配置好了,基本不用管了,这都算技术栈了??? webpack 配置好了,谁配置的?怎么配置的?官方配置就能满足实际需求吗?不需要人去研究?任何技术都是能够拿来就契合业务的吗?
3年前 评论
wongvio 3年前
aruisi 3年前

@wongvio 谢谢大佬的评论,最近在忙生活中的事,上社区比较少,回复慢了请多担待,对于大佬说的几点我做几个说明:

  1. 罗列炫耀?并没有什么值得炫耀的东西,我开头文章就说了,商城就是一个很简单的系统,没有什么很高深的技术,我写这篇文章的目的不是去炫耀我会什么,而是总结一下我做这个系统用了有大概哪些东西(这点东西在很多大佬眼中更像事玩具),php、nginx、mysql 这东西难道没用到吗?既然总结当然全部写上,不是说这种东西是“默认”了就忽视掉,至于laravel blade 为什么写上,可能是我没表达清楚,我更想说的是前端开发还是按照 PHP 框架的模板语言去渲染(对SEO友好,简单上手)。
  2. 新手劝退?首先我写的是自己的博客,并不是写的教程,新手能看懂多少,跟我有什么关系呢,况且我写的东西是基础的不能再基础的东西,这都看不明白还谈开发?你说的用 php+div+css+mysql+js 可以开发出很好的商城,那么如果少了其他工具的辅助,你系统的稳定性、拓展性有保证吗?我这篇文章只是分享一下自己在做整个系统所用到的东西,去保证整个系统的可用性,并没有说让大家都这么用,程序员都有自己的思维,把事情做好不就行了吗?
  3. es6 不是语法吗? ES6 是语法,但是用到实际项目中的又有多少了,不去开始就明确项目的语法版本,后续开发能否保证一致性?
  4. webpack 配置好了,基本不用管了,这都算技术栈了??? webpack 配置好了,谁配置的?怎么配置的?官方配置就能满足实际需求吗?不需要人去研究?任何技术都是能够拿来就契合业务的吗?
3年前 评论
wongvio 3年前
aruisi 3年前
自由与温暖是遥不可及的梦想

数据表 设计出来了后 可以发出来看看

现在想学习 如何设计表 三范式 反三范式

3年前 评论
Epona

写了 Exception 就要写 try catch, 然而我不想写try catch😂

3年前 评论
Mr-houzi 3年前
minororange (楼主) 3年前
snower 3年前

要搞清楚罗列和架构的区别,不是列一堆,看起来规整好看就是架构。

3年前 评论

大家有没有这种感觉,好多文章,开头罗列一堆的技术栈,但是其实里面比如JQ,sass这些本来就是非常容易懂的东西,后台的php、nginx、mysql这么写感觉就是为了炫耀费要罗列出来,shell这东西你能用到超过100行吗?

特别是laravel blade都写上了,还有es6不是语法吗?webpack配置好了,基本不用管了,这都算技术栈了???

但是新手一看就懵了,做个商城要那么多东西????根本不需要啊,php+div+css+mysql+js 也能做出很好的商城啊、

最后,我的意思是,我们要对新手友好,这些东西会的人一看就知道是在罗列字数炫耀,但是确阻止了萌新加入。

3年前 评论
可乐加冰 3年前
Inn 3年前
wongvio (作者) 3年前
aruisi 3年前
芝麻开门 3年前

我觉得楼主写的挺好的。 可能对于萌新来说,有点劝退,对于大牛来说,这东西没用 但是对于我这种入门不久的,半懂非懂的人很有帮助 我明白了构建商城需要准备那些技术,需要尝试的时候可能会按楼主列的关键词去了解了解。

起码对于我来说,这东西有用,感谢楼主; 如果能列出每个技术在项目中所占的比重就更好啦,这样可以挑重点去了解

3年前 评论
  • 写得挺好的,很全面。
  • 为什么要辩解呢?是工作不饱和,还是 LOL 不香吗?
3年前 评论

每天来论坛吸收一下大佬们分享的一些技术经验 :blush:

3年前 评论

群里看到的,过来说两句,虽然大家几年后看自己的QQ空间都会觉得老脸一红 ,但是没必要特意来评论指出

3年前 评论

楼主,库存是用单独的数据库吗?

3年前 评论
snower 3年前

厉害,架构细节都有

3年前 评论
Code_Er

@minororange 搂主可以请教一下你做过限时拍卖嘛

3年前 评论

@Code_Er 秒杀、限时购、团购等等都属于营销模块,这个根据公司具体业务去开发具体逻辑

3年前 评论
Code_Er

@minororange 会不会涉及到限时购那些

3年前 评论

@Code_Er 核心就是订单、产品,做外贸的除了小品类,其他类型网站对会员这块也不会太深入,然后就是营销模块,包括专题页、优惠券等。订单产品这块的技术难点就在库存这块,如何保证库存的一致性。然后其他逻辑就没有什么复杂的

3年前 评论
aruisi 3年前
Code_Er

搂主可以请教一下 基本业务有那些吗自营商城

3年前 评论

@congcong 控制器 catch

3年前 评论
congcong 3年前

在service层抛出异常怎么处理的?

3年前 评论
snower 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!