架构 / 设计模式 / 微服务&docker

更多
2021年11月16日 11点21分 作者:叶飞 修改

学习基础:

  • 至少掌握一门面向对象的语法
  • 理解什么是企业应用


架构

Architecture,做架构的人就是大名鼎鼎的架构师!但和CEO一样,本身其实没有意义……

我们这里所讲的架构,指的就是Web企业应用的架构。本质上来说,它仍然是对代码的组织管理,但更加的宏观和全面。架构可以是事先预定的,也可以是在代码实践中逐步形成的,或者兼而有之。

涉及的内容

作为一个架构师,应该考虑的:
  • 硬件层面:比如需要多少台服务器、什么样的服务器、这些服务器如何部署(几台Web,几台数据库,几台文件处理……),如何进行备份分发……
  • 软件层面:首先是技术选型,比如分成几个大的模块,每个模块各用什么技术;模块内部又再分层,前端用什么(vue还是angular),后端用什么(Java还是C#),数据库用什么(SQLServer还是mysql)……

PS:注意和项目经理的区别。

出发点

照理说,技术选型,考虑的应该是:

  • 性能
  • 安全
  • 可维护性

再次强调:三者不可兼得!

但实际上,大多数架构师,不过是出于个人偏好,^_^,因为凡是主流的技术,没一个是不安全、性能差、难以维护的!

工具箱

架构师的一个最主要工作就是对项目进行拆分:

  • 分层:水平划分
  • 模块化:垂直划分
  • 微服务:“胡乱”划分


设计模式

Design pattern,热度逐年下降……

它起源于一本(应该算是经典的)书:《设计模式:可复用面向对象软件的基础》

看名字就知道,区别于架构设计,模式更微观,适用的领域更窄:几乎就只能面向对象。

由四个作者合著,被称之为GoF(Gang Of Four),书中总结出软件设计开发中常用的23中模式。

什么是模式?就是“套路”。比如:

  • 单例(Singleton)模式:要想一个对象全局只有唯一的一个,就这样写(私有化构造函数,利用静态字段,只暴露一个方法……)就OK了
  • 工厂(Factory)模式:对象不能直接new,而是通过Factory类/对象生成
  • 代理(Proxy)模式:父类变量装子类代理对象(ORM中lazy load)
  • 构造器(Builder)模式:……

为什么(不)需要?

Good Question!

从某种意义上说,设计模式和算法很类似,高端大气上档次,就是实际开发中用不到。

飞哥为什么不讲:

  1. 每一种设计模式,其实都有一种适用场景,都是要解决某种特定的问题。(设计模式是药,有病才吃,没病不要乱吃)
  2. 但这种场景/问题,代码实践不够,很难很难体会。(没有十万行代码量,不要谈设计模式)
  3. 所以就算新人学了设计模式,往往也是滥用设计模式,徒增加代码复杂度
  4. Web开发中,尤其是业务逻辑层面,需要设计模式的场景并不多

还想讲点什么?变化:很多设计模式,其实有一个假设/前提,业务逻辑以后要变


微服务

这个概念这几年非常的火……

首先理解服务

比如项目中使用了两种语言:一些模块用Java开发,一些模块用C#开发;现在我们想在这些模块中实现互相调用,即Java模块调用C#模块,可不可行?

在内存间通信是不可能的啦,但有一种办法:使用网络通信。比如Java模块暴露一个url,只要我们访问这个url,Java模块就能予以响应:这样的Java模块是不是就像服务器一样?它对外提供的,就是一种服务

最早这种服务的使用只是为了解决不能/难以互相访问的模块之间的通信问题,但后来有人觉得好像所有模块都都这样部署也不错……?于是,SOAService-Oriented Architecture),面向服务架构,就被提出来了。

微服务就是微型服务,即:把大量的功能模块都主动的做成一个一个微型的服务。

利弊分析

好处:高度自治,野蛮生长。

想象一个项目小组,负责某个模块某个功能

  • 以前:必须使用既定的语言(比如Java),规定的技术(比如Hibernate),哪怕实现一个非常简单的功能,也要逐层逐层的调用……
  • 现在:彻底放飞自我,想用什么语言/技术就用什么语言/技术,你管我?!层不层的完全不存在,反正我给你提供一个服务就是了

但这样真的好吗?架构的本质就是纪律规范和约束,否则我干嘛要架构呢,大家一起嗨随便嗨不就OK了?

另外,微服务带来的另一个问题就是大量额外的桩和mock模块。比如我开发一个模块(UI都没有),这个模块怎么被触发启动(需要桩或者测试用例)?我还要调用其他的模块,但其他模块完全可能还未实现或者有问题,怎么办(需要mock)?对其他架构而已,单元测试是一种增益(可有可无),对微服务而言,单元测试是一种标配!

PS:微服务的问题其实类似于前后端分离,但更为严重……以我十年老码农的经验来看,还是可以让子弹再飞一会儿。

docker

限制SOA及微服务的一个重要因素就是部署。

以前你的模块写好了,我代码(通过git/svn)拉下来就能跑,现在要用的模块,首先得部署起来!而部署,其实是很麻烦的,总是能在不经意间遇到各种稀奇古怪的问题……

所以docker应运而生:

Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。

docker就是一个类似于虚拟机、但更轻量级的软件,它可以把一台电脑的开发/部署环境很轻松的拷贝到另一台电脑,解决的问题就是:“在我的电脑上就能跑呀!”有了docker,我们都在docker环境里面跑。

PS:Java方向的同学学Linux的时候,可以直接用docker。


架构 设计模式
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
上一篇: 关于选择
下一篇: 已经是最后一篇了……
评论 / 0

后台开发


其他:WebForm和WebApi

其他ASP.NET框架,如WebForm、WebApi……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

分层架构和综合实战

J&C

Java和C#共有的语法

全部
关键字



帮助

反馈