基于微服务架构和前后端分离设计理念的PMP众医平台
Posted SKS121
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于微服务架构和前后端分离设计理念的PMP众医平台相关的知识,希望对你有一定的参考价值。
该项目是自己学习SpringCloud等微服务框架后开发的一个在线预约挂号系统,涵盖SpringBoot、SpringCloud、Redis、RabbitMQ 、MongoDB、Docker 、阿里云OSS等热门技术栈,能够帮助从单机开发到分布式微服务开发进阶的小伙伴快速掌握相关开发技能,项目已开源,喜欢的小伙伴可以自行下载学习,有任何问题都可以随时评论交流。
Github开源地址:https://github.com/CONTINUE12/PMP
其他开源进阶项目:
基于AWT、Swing及MYSQL开发的学校教务系统_SKS121的博客-CSDN博客
基于Javaweb的超市订单管理系统SMBMS_SKS121的博客-CSDN博客
基于Spring+SpringMVC+Mybatis的图书管理系统_SKS121的博客-CSDN博客
基于SpringBoot2.0+Mybatis的学生成绩管理系统_SKS121的博客-CSDN博客
下面是对项目的整体框架进行概括
项目架构图
业务流程图
一.功能分析
(一)平台后台管理系统
1、医院设置管理
(1)医院设置列表、添加、锁定、删除
(2)医院列表、详情、排班、下线
2、数据管理
(1)数据字典树形显示、导入、导出
3、用户管理
(1)用户列表、查看、锁定
(2)认证用户审批
4、订单管理
(1)订单列表、详情
5、统计管理
(1)预约统计
(二)用户前台系统
1、首页数据显示
(1)医院列表
2、医院详情显示
(1)医院科室显示
3、用户登录功能
(1)手机号登录(短信验证码发送)
(2)微信扫描登录
4、用户实名认证
5、就诊人管理
(1)列表、添加、详情、删除
6、预约挂号功能
(1)排班和挂号详情信息
(2)确认挂号信息
(3)生成预约挂号订单
(4)挂号订单支付(微信)
(5)取消预约订单
7、就医提醒功能
(三)医院接口系统
1.医院列表信息
2.医院科室信息
3.科室排班信息
4.医生信息
二.开发环境
Windows 10,IntelliJ IDEA 2020.2,mysql8.0,maven3.6.1,tomcat9
三.技术栈
(一)后端技术栈
1、SpringBoot
2、SpringCloud (1)Nacos注册中心 (2)Feign (3)GateWay
3、Redis (1)使用Redis作为缓存 (2)验证码有效时间、支付二维码有效时间
4、MongoDB (1)使用MongoDB存储医院相关数据
5、EasyExcel (1)操作excel表格,进行读和写操作
6、MyBatisPlus
7、RabbitMQ (1)订单相关操作时,用mq发送短信消息给短信消费者
8、Docker (1)下载镜像 docker pull (2)创建容器 docker run
9、阿里云OSS
10、容联云短信服务
11、微信登录/支付
12、定时任务
(二)前端技术栈
1、vue
2、Element-ui:管理系统
3、nuxt:用户系统
4、npm
5、ECharts图表
四.项目结构设计
(一)后端
1.hospital-manage:医院接口模拟端(已开发,直接使用)
2.common:公共模块父节点
common-util:工具类模块,所有模块都可以依赖于它
rabbit-util:rabbitmq业务封装
service-util:service服务的工具包,包含service服务的公共配置类,所有service模块依赖于它
3.server-gateway:服务网关
4.model:实体类模块
5.service:api接口服务父节点
service-hosp:医院api接口服务
service-cmn:公共api接口服务
service-user:用户api接口服务
service-order:订单api接口服务
service-oss:文件api接口服务
service-sms:短信 api接口服务
service-task:定时任务服务
service-statistics:统计api接口服务
6.service-client:feign服务调用父节点
service-cmn-client:公共api接口
service-hosp-client:医院api接口
service-order-client:订单api接口
(二)前端
1.后台管理系统
(1)api:用于和后端交互获取数据
(2)assets:静态资源
(3)router:路由跳转
(4)views:显示页面
2.用户系统
(1)api:用于和后端交互获取数据
(2)assets:静态资源
(3)layouts:默认页面
(4)pages:自定义显示页面
五.数据库设计:
1.医院接口信息数据库yygh_cmn
(1)数据信息表dict
2.平台管理医院信息数据库yygh_hosp
(1)医院信息表hospital_set
3.医院管理数据库yygh_manage
(1)医院信息表hospital_set
(2)订单表order_info
(3)医生排班表schedule
4.用户订单数据库yygh_order
(1)订单信息表order_info
(2)订单支付信息表payment_info
(3)退款信息表refund_info
5.用户信息数据库yygh_user
(1)用户信息表user_info
(2)就诊人信息表patient
五.维护日志
(1)后台管理系统中增加用户订单管理功能
六.技术要点总结
1.反向代理服务器nginx
(1)使用原因:由于后端有很多服务模块,每个模块都有对应的访问路径,为了提供统一的api接口,使用nginx作为反向代理服务器
(2)详情:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
注:可用Spring Cloud Gateway网关代替
2.API网关
(1)使用原因:不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
- 客户端会多次请求不同的微服务,增加了客户端的复杂性。
- 存在跨域请求,在一定场景下处理相对复杂。
- 认证复杂,每个服务都需要独立认证。
- 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
- 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
(2)工具:Spring Cloud Gateway。是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性。
3.跨域问题
(1)原因:浏览器对于javascript的同源策略的限制。是浏览器对于ajax请求的一种安全限制。
(2)类型:域名不同;域名相同但端口不同等
(3)解决方案:一是直接在Controller类上添加@CrossOrigin注解
二是使用Spring Cloud Gateway网关创建全局配置类CorsConfig,通过配置类解决跨域问题
@Configuration
public class CorsConfig
@Bean
public CorsWebFilter corsFilter()
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
4.注册中心与服务调用
(1)使用原因:微服务项目中,不同的功能分布在不同的模块中,为了实现模块之间的相互调用,需要将服务注册到远程注册中心,再进行调用
(2)Spring Cloud相关基础服务组件:
- 服务注册——Netflix Eureka (Nacos)
- 服务调用——Netflix Feign
- 熔断器——Netflix Hystrix
- 服务网关——Spring Cloud GateWay
- 分布式配置——Spring Cloud Config (Nacos)
- 消息总线 —— Spring Cloud Bus (Nacos)
总结:Nacos = Eureka + Config + Bus
5.数据字典
(1)定义:管理系统常用的分类数据或者一些固定数据,例如:省市区三级联动数据、民族数据、行业数据、学历数据等。
(2)工具:阿里巴巴开源的EasyExcel。基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
6.服务端渲染技术
(1)定义:Server Side Render(SSR)是在服务端完成页面的内容,而不是在客户端通过AJAX获取数据。
(2)优势:更好的 SEO(推广),由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面。
(3)工具:NUXT。Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,可用来创建服务端渲染 (SSR) 应用,也可充当静态站点引擎生成静态站点应用,具有优雅的代码结构分层和热加载等特性。
7.手机验证码登录
(1)JWT工具。是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。最重要的作用就是对 token信息的防伪作用。
(2)阿里云短信业务。创建签名和模板。程序中通过使用签名和模板的keyId进行验证码发送。
(3)登录全局事件:注册一个全局登录事件,当需要登录层是,发送一个登录事件,头部组件监听登录事件,然后触发登录按钮的点击事件即可打开登录层进行登录,
(4)用户认证与API网关整合:
1)首先,在网关处拦截需要登录的url,从header头信息中获取用户token,若token合法,直接返回用户id和200状态码,放行;若不合法,返回208状态码。
2)其次,在前端页面中发送请求并接受状态码,若状态码为200,表示已经登录,放行;若状态码为208,表示需要登录,触发登录事件进行登录。
3)最后,调用阿里云短信服务接口给用户发送验证码,并将验证码放入redis缓存。接收用户输入的验证码并和redis缓存的验证码进行对比,若一致则登录成功,否则失败。
8.微信登录
(1)OAuth2协议。
(2)微信工具准备。
1)注册:微信开放平台:https://open.weixin.qq.com
2)邮箱激活
3)完善开发者资料
4)开发者资质认证:准备营业执照,1-2个工作日审批、300元
5)创建网站应用:提交审核,7个工作日审批
6)内网穿透:ngrok的使用
(3)授权流程:获取access_token时序图
第一步:请求code(生成授权URL)
第二步:通过code获取access_token(开发回调URL)
9.阿里云对象存储OSS服务
(1)使用原因:用户认证需要上传证件图片、首页轮播也需要上传图片,因此需要做文件服务来存储文件。
(2)实现:通过阿里云账户的keyid和OSS创建的Bucket的id连接远程OSS存储库,进行存储和访问。
10.预约下单成功后处理逻辑(使用消息队列)
(1)工具:RabbitMQ,是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。
(2)作用:
1)消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。
2)如果网络连接不可用,消息被暂存于队列当中;当网络畅通的时候再将消息转发给相应的应用程序或者服务。
3)如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。
(3)典型应用场景:
1)异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
2)流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
3)日志处理。
4)应用解耦。
(4)实现过程:
1)下单成功后给用户发送预约成功的短信通知。先创建MQ的监听器,当有短信任务被放入消息队列时,择机完成任务。
2)下单成功后更新剩余预约号的数量。先创建MQ的监听器,当有更新任务被放入消息队列时,择机完成任务。
11.就医提醒(定时任务)
(1)业务逻辑:通过定时任务,每天8点执行提醒服务,提醒当天就医的用户就诊。
(2)Cron表达式:是一个具有时间含义的字符串,字符串以5个空格隔开,分为6个域,格式为X X X X X X。分别表示秒、分、时、日、月等。
(3) @Scheduled注解:用于定时任务方法上,例如: @Scheduled(cron = "0 0 8 * * ?")表示每天早上八点执行。
12.其他
(1)Redis:作缓存,用于验证码有效时间、支付二维码有效时间、医院数据等
(2)MongoDB:存储医院相关数据
(3)RabbitMQ:进行订单相关操作,发送mq消息
(4)Docker:下载镜像(MongoDB,RabbitMQ),创建容器
以上是关于基于微服务架构和前后端分离设计理念的PMP众医平台的主要内容,如果未能解决你的问题,请参考以下文章
基于Spring Cloud Alibaba 前后端分离架构分布式微服务高并发架构 数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案
Java基于Hadoop及微服务架构的前后端分离购物系统(源码)
J2EE企业分布式微服务云快速开发架构 Spring Cloud+Spring Boot2+Mybatis+Oauth2+ElementUI 前后端分离