前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计博客系统的架构思考(上)——动态的无限可能性

设计博客系统的架构思考(上)——动态的无限可能性

作者头像
Phodal
发布2018-01-29 10:26:27
8430
发布2018-01-29 10:26:27
举报
文章被收录于专栏:phodalphodal

虽然,我也想不起来为什么最近会陷入这样的大坑,但是我觉得我还是应该记录一下这些想法。从一个简单的MVC架构的博客系统,到我所使用的Django MTV的APP结构,再到微服务与Reactive,似乎一直在说明一件事:解耦

1MVC

在我初识架构是什么的时候,我看到了MVC模式架构。这种模式是基于分层的结构,要理解起逻辑也很简单。这个模式如下图所示:

由我们的Front controller来处理由客户端(浏览器)发过来的请求,实际上这里的Front controller是DispatcherServlet。DispatcherServlet负责将请求派发到特定的handler,接着交由对应的Controller来处理这个请求。依据请求的内容,Controller将创建相应model。随后这个model将传到前端框架中渲染,最后再返回给浏览器。

但是这样的架构充满了太多的问题,如view与controller的紧密耦合、controller粒度难以把控的问题等等。

2Django MTV

我使用Django差不多有四年了,主要是用在我的博客上。与MVC模式一对比,我发现Django在分层上还是很有鲜明特性的:

在Django中没有Controller的概念,Controller做的事都交由URL Dispatcher,而这是一个高级的URL Dispatcher。它使用正则表达式匹配URL,然后调用合适的Python函数。然后这个函数就交由相应的View层来处理,而这个View层则是处理业务逻辑的地方。处理完后,model将传到Template层来处理。

对比如下图如示:

传统的MVC架构

Django 架构

Model

Model(Data Access Logic)

View

Template(Presentation Logic)

View

View(Business Logic)

Controller

Django itself

从上面的对比中,我们可以发现Django把View分层了。以Django对于MVC的解释来说,视图用来描述要展现给用户的数据。 而在ROR等其他的MVC框架中,控制器负责决定向用户展现哪些数据,而视图决定如何展现数据。

联想起我最近在学的Scala中的Play框架,我发现了其中诸多的相似之处:

虽然在Play中,也有Controller的概念。但是对于URL的处理先交给了Routes来处理,随后再交给Controller中的函数来处理。

3异步与MVC

不过与一般MVC架构的最大不同之处,怕是在于Django的APP架构。Django中有一个名为APP的概念,它是实现某种功能的Web应用程序,。如果我们要设计一个博客系统的话,那么在这个项目中,Blogpost是一个APP、评论是一个APP、用户管理是一个APP等等。每个APP之中,都会有自己的Model、View和Controller。其架构如下图所示:

当我们需要创建一个新的功能的时候,我们只需要创建一个新的APP即可——为这个APP配置新的URL、创建新的Model以及新的View。如果功能上没有与原来的代码重复的话,那么这就是一个独立的APP,并且我们可以将这个APP的代码Copy/Paste到一个新的项目中,并且不需要做修改。

与一般的MVC架构相比,我们会发现我们细化了这些业务逻辑原来的三层结构,会随着APP的数量发生变化。如果我们有三个APP的话,那么我们相当于有3*三层,但是他不是等于九层。这样做可以从代码上直接减少逻辑的思考,让我们可以更加集中注意力于业务实现,同时也利于我们后期维护。

虽是如此,后来我意识到了这样的架构并没有在意识有太多的先进之处。而这实际上是一个美好但是不现实的东西,因为我们还是使用同一个数据库。

4微服务与Reactive

在微服务架构中,它提倡将单一应用程序划分成一组小的服务,这些服务之间互相协调、互相配合。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通。每个服务都应该有自己独立的数据库来存储数据。

Django从某种意义上有点接近微服务的概念,只是实际上并没有。因为它没有实现Play框架的异步请求机制。抱句话来说,应用很容易就会在调用JDBC、Streaming API、HTTP请求等一系列的请求中发生阻塞。

这些服务都是独立的,对于服务的请求也是独立的。使用微服务来构建的应用,不会因为一个服务的瘫痪让整个系统瘫痪。最后,这一个个的微服务将合并成这个系统。

对于复杂的系统来说,这样做确实很不错。但是对于一个简单地系统来说,这样做是不是玩过火了?如果我们要设计一个博客系统的话,那么我们是不是可以考虑将Write/Read分离就可以了?

嗯,就是静态网站,期待下篇咯 ——《CQRS与静态网站》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 phodal 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档