东北微小企业的服务架构体系,你们属于哪种?

1,875 阅读12分钟

本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究!

一、背景

为什么想要写这样的一篇文章?主要是基于我个人的从业经验而言。我本人在哈尔滨这座软件行业并不发达的的城市,企业的软件架构并没有一个快速且完整的过程,并且没有主动接触新鲜技术的想法,或者说没有一个明确的思路。即使想要有这方面的尝试,也只是企业内部的某个程序员的个人行为,没有形成体系化,也很难被领导重视。当然,也有些公司会积极的尝试新技术,但也仅限于基本过时的“微服务”这样的概念,然而这样的尝试,也许将会带来大量的重复工作,还有人工成本、资源成本的浪费。

觉得我说的没有道理?下面咱们一起来分析下。

二、微小企业的项目架构

关于微小企业的项目架构,主要分为三个方向:

  • 单体架构
  • 微服务架构
  • 云平台化

没错,这就是哈尔滨的软件公司的两种架构模式,当然也有一些公司,因为技术leader来自一些技术领先的公司,会积极的推进公司软件的自动化,容器化等。

2.1 单体架构

单体架构,是每个后端程序员相当熟悉的词汇吧。现在常见的单体架构,以java为例,依托于springboot实现快速的代码开发,部署,对比于早前的tomcat环境,可以说已经进步了很多。

即使是单体架构,我也会将它们分为两类:

  • 不思进取的单体架构
  • 自我定位清晰的单体架构

2.1.1 不思进取的单体架构

企业认为发展业务才是王道,技术只是辅助手段,能用即可。

对于这一类公司还是有不少的,手握N多年前的SSM(spring + springmvc + mybatis),还在使用的津津有味。当然了,对于一些小型公司的项目而言,这类技术没有任何问题,但是对于程序员的提升可以说是零吧。最终会导致以下的问题:

  • 留不住技术人员

    持续使用这一类的技术,将会很难留住公司的绝大部分程序员,毕竟靠技术吃饭,不可能一招鲜吃遍天的。每一个程序员都想尝试新的技术,提升自身能力,这样日后才能创造更大的价值。技术都会随着时间被淘汰,更何况是使用技术的人呢?

  • 很难引入优秀的技术人员。

    程序员的眼中,还是有很深的鄙视链的,不管你信不信,它就在那里。拿我个人来说,让我回去使用SSM进行开发,我甚至都不会去面试。2019年,我经历过一个京东回来的同事,他对于我们当前使用的技术存在着深深的鄙视,无论领导多看好他,答应给出远高于哈尔滨公司水平的薪水,都不能将他留下,原因就是“你们用的技术,在几年前就被我们淘汰了,这不是钱的问题

综上所述,只要企业是靠技术去吃饭,那么对于新技术的接纳和提升是必然的,利大于弊。

2.1.2 自我定位清晰的单体架构

什么是自我清晰呢?

对于公司的技术水平,和产品的业务定位,有清晰的认知。不会通过复杂的方式去处理简单的项目,比如为了使用微服务,将原本简单、清晰的项目强制拆分为多个服务。

使用最简单的方式去完成项目的研发。其实服务的拆分是一种系统优化的方式,当你的单体项目能够胜任当前的工作时,为什么要去做无谓的优化呢?

优化一定是在存在问题的时候,才进行优化,想的越多就会产生越多的风险。

对于某些单体项目,部分微小公司采用的方案就是通过开源项目进行扩展开发,比如常见的“若依”等管理系统,基本能够满足简单项目的需要了。快速,便捷的完成项目,才能将成本降到最低,效率却是最高的。我认为这才是快速产品迭代的基础,盲目的微服务化只会适得其反。

2.2 微服务架构

目前微小型企业的“微服务架构”种类,最常见的还是以java开发为基础的两个派系:

  • SpringCloud
  • Dubbo

以上两种服务框架配合Nacos进行使用。

当然新兴的GO语言,也是目前后端的一个方向,但是对于微小企业来说,成本过高。

就我目前的体会来看,在微小企业的微服务架构也存在两种情况:

  • 病态化的微服务
  • 目标明确的微服务

2.2.1 病态化的微服务

何为病态化的微服务?

换句话说,就是为了微服务而去微服务。我经历过的一家企业就是如此,毫不夸张的说,那是我经历过的服务数量最多的一个项目,却存在一个名不经传的小公司里面。

起初引入微服务是为了给领导彰显公司的技术能力,表示咱们的技术也是紧跟前沿的,慢慢的就变味儿了。随着领导的想法越来越多,项目的新功能越来越多,每多一个功能,就增加一个服务,到最后整个服务数量已经达到了20多个。

你以为这就完了吗?第二年技术领导又开始引入了“DDD”的概念,在每个微服务上继续引入“DDD”的架构,将每个服务拆分成以下的方式:

  • 基础模块intr层
  • 页面ui层
  • 应用app层
  • 领域domain层,内部抽象聚合根

不说项目的复杂度成指数级增长,那也差不多了。然而领导始终没有考虑到以下的问题:

  • 很多服务的根本都是相同的业务模块,真的有必要放在不同的服务当中吗?

  • DDD原本就是通过四层架构去梳理业务代码,而目前每个微服务当中的业务模块只有一个,“DDD”存在的意义又在哪?

  • 对于诸多的服务,是否考虑过硬件成本的问题。

  • 是否理解微服务当中所谓的“三高”是什么?

    • 高性能:服务的调用,真的比单体性能高吗?
    • 高可用:这么多的服务,保证高可用的复杂度是否能够承受?
    • 高并发:高并发对于咱们的产品而言,真的是存在的吗?
  • 运维成本是否考虑过?人工还是自动化?

  • 内网环境下,部署微服务的网络环境问题是否能够顺利解决?

  • 系统升级的时长问题?比如公共组件的升级,所有服务通过人工部署的方式需要多久?

  • 性能监控与链路追踪问题?微服务的排错是比较复杂的,必须要有一套监控体系支撑。

综上所述,包含但不限于这些内容,我觉得可以将这个系统彻头彻尾的称为一个病态化的微服务架构。

2.2.2 目标明确的微服务

目标明确的微服务架构其实很简单,也很纯粹。业务代码有必要、且只做相关的业务处理,并且会作为必要使用的服务,就可以抽取为一个单独的服务。

比如我们经常能够见到会被抽离的服务:

  • 用户中心:不属于任何模块,服务于各个业务之间。

    在不同的系统当中,都会拥有自己的用户体系,除了用户的基本信息等等,可能根据不同的业务还会拆分成:

    • 用户积分
    • 用户标签
    • 用户画像

    以上的体系,都归属于用户,在实际数据量,并发量不大的情况下,我们仍然可以将它们放在一个服务当中,通过“DDD”的领域进行划分,相互之间以事件的方式进行暴露和调用。这才是具有明确目标的使用方式。

    如果不使用DDD的情况下,我们仍然可以使用模块化“moudle”的方式进行划分,通过子模块的方式对各种业务进行隔离,这也是常见于各种开源组件的实现方案。

  • 登录门户、认证:基于用户中心的前提,将公司产品的登录门户,统一认证进行抽离。

    抽离出来后可以服务于公司的各个系统,通过统一的登录门户进行登录和认证,以回调的方式接入业务系统。除此之外,其内部还可以聚合一些具体的权限验证:

    • 用户角色

    • 用户菜单

    • 角色权限

      • 菜单权限
      • 按钮权限
      • 接口权限

综上所述,我认为这两个例子就是较为明确的微服务拆分方案,总结来说:

  • 具有明确的业务概念,自成一系
  • 围绕自身的业务概念,衍生相关的业务逻辑
  • 聚合且不臃肿

满足上面的要求,起码会成为一个健康的微服务架构

2.3 云平台化

微小企业做云平台化非常少见,但是只要开始实践,慢慢的将会体会到其中的乐趣。

2.3.1 云平台化方案

常见的云平台化也分为两种:

  • 购买云平台产品
  • 搭建自有云平台

两种方式的成本其实都不小,但是区别在于:

  • 购买云平台产品是需要持续续费的,但是有专门的客服帮你解决问题,随着时间推移,成本将会持续消耗。
  • 搭建自有云平台,前期主要花费在硬件成本,以及人工搭建成本上,一旦成功,将会是一本万利的。

我个人推荐微小企业采用搭建自有云平台的方式,主要出于两点考虑:

  • 成本较低
  • 资源可随业务场景扩展
  • 成功后,拥有很高的自由度
  • 对于有安全要求的企业,可以将公司的知识产权掌握在自己的手中
  • 云平台的搭建,对于软件开发的流程化将有质的飞越。

云平台建设的过程是让人头痛的,包含但绝对不限于以下:

  • 硬件网络环境
  • 容器环境
  • 基础设施搭建

上述的每一个环节都不简单,其中的细节问题更是数不胜数,还有各种预想不到的问题在等着我们。

2.3.3 云平台化的好处

当企业拥有自己的云平台,所带来的好处会非常多,包含且绝不限于:

  • 吸引人才
  • 利于推广企业
  • 资源统一管理
  • 产品生命周期规范化
  • 研发效率提升
  • 运维成本降低
  • 提升服务的稳定性,容错性
  • 自动化的运维、灰度
  • 利于实现便捷且强大的服务监控
  • 云原生带来的强大的扩展能力

三、架构方案的场景

通过前面大篇幅的叙述,本文详细介绍了目前存在于微小企业的各种“服务架构”场景。其中我比较推崇的是:

  • 自我定位清晰的单体架构
  • 目标明确的微服务架构
  • 企业自有云平台化

上述的三种方案恰恰是当前服务架构演进的一部分,从单体、到微服务、到云原生。

但是对于微小型企业而言,这三种方式是需要技术人员去着重考虑的,基于不同的业务场景、不同的体量去考虑不同的架构方式。

  • 单体架构

    基于第三方开源系统,或公司沉淀的单体架构,快速的实现业务逻辑,且并发量较小。非常适合短期,快速开发的项目。随时单独部署,对于其他系统和业务场景没有依赖。

  • 微服务架构

    业务有清晰的边界,能够明确的抽取单独的服务,且该服务具有一定的业务代码量。同时针对某个服务,存在大量并发,抽取后利于系统的稳定性。更加适用于拥有中台的系统环境,围绕该中台组建自己的微服务网格。

    在缺少自动化运维的加持下,过多的服务将会增加一定的运维成本。

  • 云平台

    公司的业务具有一定的体量,且大部分系统是公司的自有项目,依托于自有云平台,能够将各个项目动态、快速的部署。实现项目的统一管理,运维。 依托于云平台,项目将不再局限于“单体架构”或“微服务架构”,无论何种方式,都可以在云平台以最适合的方式进行展示。

    对于做外包项目的公司,云平台的含义相对较小,体现在产品孵化的环节会多一些。

四、总结

前面讲解了在微小企业当中存在的几种架构形式,从原始的单体架构,到变形的微服务,再到云平台化的场景,每种架构都有其存在的意义,如何更好的发挥它们的作用,是作为开发人员需要决定的。决定的正确与否,将会影响企业,项目的诸多环节,所以,在考虑项目实现方案的时候,要慎重选择。对于技术的演进,也需要作为企业推动的方向。

后面的文章,将会具体探索微小企业架构演进的方案,通过项目案例去实现一个从零到一的过程。


不知道各位同僚正使用的架构,属于哪一种?**病态化