第号 2019-06-26
本文为读书笔记,对书中内容进行重点概括,并将书中的模块化结合微服务、Java9 Jigsaw谈谈理解。
以Java软件系统为例,重点讲解了应用架构中的物理设计问题,即如何将软件系统拆分为模块化系统。所以内容组织包括为什么需要模块化,围绕如何实现模块化讲述了模块化模式,最后在模块化基础上使用OSGi技术实现动态模块化。
先谈谈应用架构的逻辑设计和物理设计。
逻辑设计是关于语言结构的,指类、方法之间的关系,组织结构。物理设计是关于软件中的物理实体,即部署单元和他们之间的关系,是关于如何将系统拆分为模块系统的。
模块定义:
软件模块是独立可部署的、可管理的、进程内可重用的、无状态的软件单元。可管理即模块可以安装、卸载和更新。
在Java中,模块就是jar包。
与分布式服务不同的是,这里的模块是进程内重用,需要与想用其功能的进程一起部署,而服务是一次部署被多个client使用。
基本模式
依赖模式
可用性模式
扩展性模式
通用模式
OSGi是Java平台中的动态模块系统,定义了一个模块化单元,称之为bundle,是一个jar文件。bundle会在同一个JVM中进行部署和交互,在进程内跨bundle交互,并且可动态部署bundle。
OSGi只是提供一个运行时环境,使得在Java平台中实现模块化成为可能。
自上而下的架构
架构的目标是减少变化的成本和影响
软件倾向于随着时间变得腐化,随着时间流逝,变化会悄然发生并以难以预料的方式考验着设计
技术债用来描述为了满足进度或用户期望而做出的设计让步,与财务债一样,也需要支付利息,在将来的开发中要付出额外的努力。我们可以选择继续支付利息或用更好的设计重构来偿还本金,尽管偿还本金需要成本,但是会降低将来要支付的利息。
复杂性阻止我们以优雅的方式使软件系统适应需求的变化。
最大化重用会使得可用复杂化。即软件模块的可重用性越高,则其易用性越差。
通过上文的描述,我们已经了解了模块化思想,那与如今的微服务是什么关系呢?
微服务也是可独立部署于容器的,每个微服务仅关注于完成一件任务并很好地完成该任务,每个任务代表着一个小的业务能力。各个微服务之间通过轻量级协议(RESTful API接口, 轻量级消息机制)交互通信。与模块化强调的进程内重用不同,微服务属于分布式服务,通过RPC协议在进程间重用。
相似点:
两者都是可独立部署的,重视逻辑的可复用性,强调一个大的软件系统需要拆分为各个部分,保持高内聚低耦合,实现更好的软件架构。
个人理解:
微服务架构更胜一筹于模块化架构思想。提出模块化架构的本书(中文版)发版于2013年,微服务的概念源于2014年,两者目的相似,现如今已有大量企业对已有系统进行改造或实施微服务架构,开发人员对微服务的认知逐渐深入,大的市场环境已经采用了微服务架构。又微服务已经是一个较小且完整的业务部署单元,不会将其拆分为多个模块化单元在同一进程中部署,就算拆分也是将其拆分为更细粒度的微服务。
虽然实施微服务需要具备完善的基础设施,如容器化、服务注册发现、配置管理、监控等DevOps开发运维一体化设施,但随着应用云化的日益普及,相关设施不断完善,如SpringCloud,其实施的门槛已经较低了。
且动态模块化技术如OSGi尚未普及,所以,个人认为微服务架构比模块化架构更优。
Java 9Java 平台模块化项目(Jigsaw )参考 https://mp.weixin.qq.com/s/Sr...
微服务相关:
https://www.ibm.com/developer...
https://martinfowler.com/micr...