尚医通总结
尚医通总结
感受:
前前后后花了30天终于把这个项目的整体功能跑通了,幸好之前有个备案的域名(就是这个博客),借助它实现了阿里云的短信服务和OSS对象存储。
总体来说进度挺慢的,大部分时间都用在了修BUG上,特别是版本问题,视频教程的时间是2020年12月,我是2022年10月开始写的中间隔了一年多,很多技术的用法和一年多以前不同了,比如说微信的退款接口发生改变了等。
作为我的第一个微服务项目,我的确从里面学到了不少东西,比如第三方接口的接入一定要能看得懂官方文档。
GitHub地址:
尚医通项目系统后台:yztldxdza/yygh_parent (github.com)
尚医通项目用户前台:yztldxdza/yygh-site (github.com)
尚医通医院后台:yztldxdza/vue-admin (github.com)
如何阅读微服务项目?
- 了解项目业务
- 把项目运行起来
- 走完一套完整的业务流程,了解整个系统做了什么事
- 了解有哪些服务、以及每个服务的作用(做了什么事情)
- 了解服务之间是如何互相通讯的
- 根据需求阅读对应服务的源码细节
知识点:
- 基于Spring Cloud+Nacos实现项目的微服务化,划分项目为公共、用户、订单等服务,提高项目的可扩展性和容错性。
- 使用Spring Data注解实现自动Redis缓存,并通过自定义Redis Key Generator来根据类和方法自动生成
- key,降低开发成本、避免key冲突。
- 使用Spring Cloud Gateway实现微服务请求转发,并在网关层全局解决跨域、用户鉴权、黑白名单、内网
- 服务保护等问题,降低开发成本、提高安全性。
- 提供Restful API供外部系统接入并上报数据,并通过API签名认证保障了接口的安全性。
- 使用JWT实现单点登录,并支特手机验证码、OAut2微信扫码登录,提高用户真实性和登录安全性
- 对接微信支付AP!实现预约付款,并通过全局唯一ⅰd以及支付/退款记录表的设计保证了支付操作的幂等性
- 使用MongoDB代替MySQL存储读多写少的半结构化数据(如医院信息),实测查询性提高x%。(自己用Meter测试一下)
- 基于Docker快速搭建项目依赖服务(如RabbitMQ),,并通过Docker log命令查看日志,降低本地开发运维成本。
- 为应对流量高峰,使用RabbitMQ将下单减库存等耗时操作异步化,提升下单接口单机QPS(x至X)
- 使用Spring Scheduler实现定时预约提醒功能,并使用RabbitMQ实现定时服务和通知服务的解耦,提高服务可维护性。
使用到的注解
Spring
- @Configuration:指示一个类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些bean生成BeanDefinition和服务请求,常用于config配置类
- @ControllerAdvice:@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。最常见的使用场景就是全局异常处理
- @RestController:等同于@Controller + @ResponseBody。首先表明了这个类是一个控制器类表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。
- 格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。
- 如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注@ResponseBody,简化了开发过程。
Redis
@Cacheable
根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上@RequestBody对应前端请求中没有{}占位符的情况
@PathVariable对应前端请求中有{}占位符的情况,进行值匹配@Cacheable
根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
用于数据字典的导入