易于开发和维护:一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少 。开发和维护单个微服务相对简单 。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态 。
单个微服务启动较快:单个微服务代码量较少,所以启动会比较快 。
局部修改容易部署:单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题 。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可 。
技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈 。例如某些服务可使用关系型数据库 MySQL;某些微服务有图形计算的需求,可以使用 Neo4j;甚至可根据需要,部分微服务使用 Java 开发,部分微服务使用 Node.js 开发 。
微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的 。使用微服务架构面临的挑战 。
运维要求较高:更多的服务意味着更多的运维投入 。在单体架构中,只需要保证一个应用的正常运行 。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战 。
分布式固有的复杂性:使用微服务构建的是分布式系统 。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战 。
接口调整成本高:微服务之间通过接口进行通信 。如果修改某一个微服务的 API,可能所有使用了该接口的微服务都需要做调整 。
重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复 。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了 。
五、衡量架构的合理性
架构为业务服务,没有最优的架构,只有最合适的架构,架构始终以高效,稳定,安全为目标来衡量其合理性 。
合理的架构设计:
1、业务需求角度
1、能解决当下业务需求和问题
2、高效完成业务需求: 能以优雅且可复用的方式解决当下所有业务问题
3、前瞻性设计: 能在未来一段时间都能以第 2 种方式满足业务,从而不会每次当业务进行演变时,导致架构翻天覆地的变化 。
2、非业务需求角度
(一)、稳定性 。指标:
1、高可用:要尽可能的提高软件的可用性,我想每个操作人都不愿意看到自己的工作无法正常进行 。黑盒白盒测试、单元测试、自动化测试、故障注入测试、提高测试覆盖率等方式来一步一步推进 。
(二)、高效指标:
1、文档化:不管是整体还是部分的整个生命周期内都必须做好文档化,变动的来源包括但不限于 BUG,需求 。
2、可扩展:软件的设计秉承着低耦合的理念去做,注意在合理的地方抽象 。方便功能更改、新增和运用技术的迭代,并且支持在适时对架构做出重构 。
3、高复用:为了避免重复劳动,为了降低成本,我们希望能够重用之前的代码、之前的设计 。这点对于架构环境的依赖是最大的 。
(三)、安全指标
安全:组织的运作过程中产生的数据都是具有商业价值的,保证数据的安全也是刻不容缓的一部分 。以免出现 XX 门之类丑闻 。加密、https 等为普遍手段 。
六、常见架构误区
● 开高走落不到实处
● 遗漏关键性约束与非功能需求
● 为虚无的未来埋单而过度设计
● 过早做出关键性决策
● 客户说啥就是啥成为传话筒
● 埋头干活儿缺乏前瞻性
● 架构设计还要考虑系统可测性
● 架构设计不要企图一步到位
误区 1——架构专门由架构师来做,业务开发人员无需关注
架构的再好,最终还是需要代码来落地,并且组织越大这个落地的难度越大 。不单单是系统架构,每个解决方案每个项目也由自己的架构,如分层、设计模式等 。如果每一块砖瓦不够坚固,那么整个系统还是会由崩塌的风险 。所谓“千里之堤,溃于蚁穴” 。
误区 2——架构师确定了架构蓝图之后任务就结束了
架构不是“空中楼阁”,最终还是要落地的,但是架构师完全不去深入到第一线怎么知道“地”在哪?怎么才能落的稳稳当当 。
误区 3——不做出完美的架构设计不开工
推荐阅读
- Go 语言自带设计模式
- 如何做好表结构设计?
- 十个提高你网页设计能力的 CSS 技巧
- 求职|上海36岁设计师被HR喊叔,求职遭拒因为年龄不合适
- |三版人民币炼钢五元,设计精美,市场认知度高,收藏价值大
- 工装是什么意思(办公室装修)
- pe是什么材质(pe面料是什么材质)
- 包装设计是什么(包装设计的特点)
- 什么是产品设计(低碳环保的产品设计)
- 设计师接单平台排行__68design接单靠谱么?
