--摘要
2019年8月,我司承接了某市医疗集团,智慧药房项目,该项目主要为集团下属36家社区卫生服务中心提供药品统一目录管理、药品集中采购、库存管理、处方合理用药审核、药品配发、自动化发药设备驱动提供软件支撑。在该项目中我担任了软件架构设计师一职,主要负责该项目的软件架构设计工作。本文以智慧药房项目为例,主要论述了微服务架构在项目中的具体应用,该项目主经由药品供应管理、处方审核、药品配发、设备协同及药房管理等模块组成,子模块之的业务相对单一,因为采用了微服务架构设计,将这些模块进行了微服务设计开发及部署,使他们在后期迭代过程中,开发及发布不会影响到其它的模块,通过使用微服务架构设计,提高了软件设计质量和开发效率,最终项目成功上线,并获得了用户一致好评。
--项目背景
根据深化医药卫生体制改革规范药求,推进药品集中采购,增加药品的供应保障能力,严格监督管理,保障药品的用药安全,所有医疗机构开出的处方,必须通过处方审核后,方可进入划价计费环节,未经审核的处方,不得进行计费和配发。2019年8月,我司承接了某医疗集团智慧药房项目,该项目为医疗集团下属36家社区卫生服务中心提供软件支持,主要分为药品供应模块、药房管理模块、处方用药审核模块、药品配发模块、设备协同模块。药品供应模块负责药品库存预警,供社区卫生服务中心药房对药品进行集中采购,并将药品发送到省采招平台;药房管理模块主要进行一些基础信息的维护,及关注药品的库存管理,药品批号跟踪;处方用药审核模块,负责对医生开出的药品进行合理用药审核,将不合理的处方审核结果返回给医生,提醒医生修改处方;药口中配发模块,负责将处方中的药品进行调配,打印用法用量标签,确认发药后扣减相应的库存;设备协同模块主要是驱动药房中的一些自动化发药设备,将要药品信息发给设备上位机,根据设备药品的效期进行排序,通过上位机程序调用下位机,驱动设备出药。在该项目中我担任软件架构设计师职务,主要负责软件的架构设计及中间件等技术的选型工作。
--就当回答面试题
传统的单体软件架构在构建部署和扩展方面有很大的局限性,耦合度比较高,更新升级,都需要整体进行,随着软件规模的增大,业务模块越来越多,分布式越来越复杂,合得软件的构建变得越来越复杂,对开发人员的要求也越来越高,微服务是一种架构风格,根据业务务领域驱动分析,以垂直划分的方式将一个复杂的应用拆分成多个独立自治的服务,服务与服务之间通过松耦合的形式进行交互,每个微服务都是单一的职责,以SOA的核心思想,以服务的形式对外提供服务,配合DevOps的一些组件,CI/CD持续集成每日构建,升级、扩容不中断业务
--简单介绍一下凑字数,后面分了三块介绍,主要是前后台分离,怎么部署的;代码层面是怎么垂直划分实现的
智慧药房项目中,将药品SPD采购入库模块、处方审核模块、 药品配发模块、设备驱动模块等模块进行了微服务的划分,同时研发小组划分成了4个小组,每个小组负责模块软件的生命周期开发工作,从开发、集成、测试,再到微服务的发布升级。服务与服务之间通过 restful 接口进行控制集成。
前端表现层:由于智慧药房项目,有设备硬件,所以前端表现层,采用了B/S+C/S的混合架构风格,在药品采购入库模块中,采用了B/S的形式,将前端Web,通过Nginx 进行集群部署,当用户通过浏览器访问Web系统时,通过Nginx 轮训加权算法,进行Web服务的访问分配。通过Ajax方式调用 平台服务层的 Restful API接口。设备协同模块,为了方便给下位机发送命令驱动设备,因此设备上位机采用的C/S架构,通过HttpClient 方式调用平台服务的 Restful 接口。
平台服务层:采用比较成熟的SpringCloud框架进行搭建,为表现示提供接口服务。将SPD采购入库模块、处方审核模块、药品配发模块、设备驱动模块等模块接口启动上线后通过Nacos注册中心进行注册,负责服务的注册、发现。通过Gateway网关将所有的服务地址暴露在外,对外进行接口统一管理,并且在网关层,做了统一的安全认证,,当后端有多个服务时,通过服务命名管理,由Ribbon负责负载均衡的实现,当请求过多时,通过 Ribbon路由到指定的服务端,通过Skywalking进行接口链路的监控,确保接口服务对外的可用性。服务应用通过编写 Dockerfile,通过Docker Compose将应用部署在Docker 上,提高了应用发布的效率,降低DevOps的复杂度
业务服务:按采购入库模块、处方审核模块、药品配发模块、设备驱动模块等业务分了多个微服务。各服务之间的调用通过Openfeign进行 RPC的动态调用。接口以Restful 的形式进行交互,处方审核接口服务调用频率远高于其它服务。并且及时性要求比较高,因为为审方服务提供了五个实例节点做集群服务,结合负载均衡解决服务端的请求压力,审方合理用药规则有18万个药品目录,数据量较大,在做处方审核时对数据查询的要求比较高,因此引入了Mongodb组件,MongoDB适用于大数据的存储和分析。同时在设备协同模块中,引用了Kafka MQ消息中心件,将设备和业务系统进行解耦,配发模块将需要出药的处方数据,发给Kafka,设备收到Kafka消息后,提取消息中的药品数据,进行效期和库存的排序,驱动下位机出药。
--结尾
由于医院使用的是集团内部局域网,与外网隔离,给排查问题及维护增加了困难,一次发药设备上的上位机不心小被药房老师删除后,不会重新安装操作,上报我司后,我们联系医院信息科老师,在信息科的老师协助下,对软件重新进行了安装,此次事件,导致了设备停止工作了几个小时,影响了药房发药效率。后来我司安排了1名售后维护该项目,这一年内也新增了一些发药设备,由于选用了合适的微服务架构,使得设备的接入及服务的扩展变得非常容易,在售后同事的协助下,系统至今运行稳定。该项目的成功,让我意识到了使用了微服务架构的作用和价值,坚定了我对微服务架构应用的信心,合理选择合适的微服务架构,能够大大的提高了软件设计的复用方法,加快开发的进程,在项目中起到事半功倍的作用。经过这次项目,我也看到了自己身上的不足之处,在未来还会不断地更新知识,完善本系统的设计,使系统能够适应国家医改的变化需要,这是作为软件从业的我为之努力的动力和方向。
2021 系统架构设计师备考分享
系统架构设计师论文--通用模板
系统架构设计师论文--微服务
系统架构设计师论文---架构风格
系统架构设计师论文--设计模式
系统架构设计师论文--企业集成
系统架构设计师论文--可靠性设计