本文为读书笔记,对书中内容进行重点归纳,并将书中的模块化结合微服务、Java9 Jigsaw谈谈理解。架构
以Java软件系统为例,重点讲解了应用架构中的物理设计问题,即如何将软件系统拆分为模块化系统。因此内容组织包括为何须要模块化,围绕如何实现模块化讲述了模块化模式,最后在模块化基础上使用OSGi技术实现动态模块化。框架
先谈谈应用架构的逻辑设计和物理设计。
逻辑设计是关于语言结构的,指类、方法之间的关系,组织结构。物理设计是关于软件中的物理实体,即部署单元和他们之间的关系,是关于如何将系统拆分为模块系统的。运维
模块定义:
软件模块是独立可部署的、可管理的、进程内可重用的、无状态的软件单元。可管理即模块能够安装、卸载和更新。
在Java中,模块就是jar包。
与分布式服务不一样的是,这里的模块是进程内重用,须要与想用其功能的进程一块儿部署,而服务是一次部署被多个client使用。分布式
基本模式模块化
依赖模式微服务
可用性模式测试
扩展性模式编码
通用模式.net
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...