目录
你好!
时间线
3.20:熟悉产品产品流程管理
3.25:环境搭建、项目熟悉(阿里规范手册)
4.02:基础服务、功能分配、数据库设计、接口设计
4.13:第一阶段需求开发、第一阶段技术需求
4.22:第二阶段需求开发、第二阶段技术需求
4.26:代码review、代码优化
4.30:项目联调、项目整体验收
5.03:项目结束总结
项目背景
依托微信小程序和App 客户端提供线上预定酒店和旅游产品的互联网产品。
解决用户痛点1:提高了用户搜索酒店和预定酒店的效率
解决用户痛点2:售后功能保障了用户的合法权益
解决用户痛点3:基于数据分析提供给用户多需求场景的组合产品
项目开发流程图
项目架构图
具体流程
1.用户在客户端发起请求,进行DNS(Domain Name System域名服务器)解析,其中包括WAF(Web Application Firewall)、CDN(Content Distribution Network内容分发网络)、防火墙
2.再通过Nginx集群反向代理到Spring5.0之后添加的Webflux网关,通过SpringCloud Gateway进行动态路由指定Predicate(断言)和Filter(过滤器)寻址与Sentinel+Shard进行认证授权和令牌限流,中间还可以整合Redis;
3.另一方面还可以同时与Nacos合作为它提供监控报警和日志,集成服务注册发现功能,Nacos集群在整个架构中都能提供服务注册发现与动态配置和配置管理功能,整合SpringBoot Admin进行服务监控
4.同时Gateway可以通过Ribbon进行负载均衡、Sentinel熔断降级和业务集群建立桥梁,形成联系,先是通SpringSecurity框架与OAuth2认证中心整合JWT进行公钥私钥的颁发授权与相应验签认证功能。
5.SpringBoot应用在业务集群中通过OpenFeign进行相互调用,中间还整合Redis、Mysql、MQ、ES、OSS、JOB等工具,其中Redis集群可以用来做分布式数据缓存,Mysql主从复制进行数据的持久化,RabbitMQ进行系统解耦削峰填谷异步调用,ES全文搜索引擎整合Kibana、Logstash进行近乎实时搜索、分析和可视化的全文检索,使用阿里云OSS云存储服务进行对象存储、企业数据管理,使用xxl-job进行分布式任务调度。
6.业务集群还与分布式相挂钩,有着分布式主键,分布式锁,分布式事务,其中有两个理论,一个是CAP(分别是Consistency一致性、Availability可用性、Partitiontolerance 分区容错性)理论(这三个要素最多只能同时实现两点,不可能三者兼顾),一个是BASE(Basically Available基本可用、Soft State软状态、Eventual Consistency最终一致性)理论(即使无法做到强一致性,CAP的核心就是强一致性,但应用可以采用适合的方式达到最终一致性)
7.日志收集通过Beats、ELK、和Kafka整和完成,具体过程是这样的:Beats用于日志数据采集使用,Logstash收集日志,发送给Kafka进行解耦、异步处理和流量削峰,然后通过Elasticsearch集群存储日志数据,索引日志数据,再通过Kibana视图形式展现日志信息,更加人性化地在客户端进行检索以及相关操作。
8.以Skywalking为核心的运维监控中心可用提供链路追踪和监控报警机制,与运维报警系统Prometheus结合Grafana最终和Alertmanager通过短信、微信或者邮件的形式给模块负责人发送警告通知。
9.最后Developer将代码文件上传到GitHub上通过docker容器部署,使用K8s AP对资源进行编排,管理应用的全生命周期,同时也提高发布与更新版本的效率,然后通过Jenkins Pipeline进行整个构建、测试、交付等持续集成,运维人员继续对这些进行维护。
项目具体的工程结构
项目命名逻辑结构
具体项目时间线
产品流程梳理
数据库设计
遵循最新版阿里开发手册,分析字段的可读性和合理性,展示酒店房型模块与用户模块有关数据库设计图。
设计工具是 “ CHINER元数建模 ” ,第一次接触数据库设计,学到很多东西。
接口设计
接口设计的实现借助了工具APIPOST,对中国人的习惯确实更加友好。具体的api设计文档的链接如下:
hotel-room整合 (apipost.cn)
部分接口设计内容如下图:
接口设计注意事项
1.请求的方式一般使用GET/POST
2.请求路径接口文档为准,与代码对应controller层一致
3.GET 请求的参数在 Query 里面填写,POST 在 Body 里写。不要混用
4.不要使用 RESTFul 的路径传参
5.参数名采用驼峰命名
6.数据库中存在的字段的参数,命名要保持一致,参数描述简单
7.如果参数中用多个 id 参数,必须区分命名,且要与数据库一致
8.响应数据示例的格式必须依据实际的格式
9.响应数据的类型和描述和请求参数的要求一致
需求开发
查询单个房型信息
其他注意事项
由于第一阶段与第二阶段的代码实现主要区别是代码的优化,在基于mybatisplus开发上,更多的利用了本身分装的方法,使代码更加简洁。基础的房间号的增删改查就不再赘述。
需要注意的是:
1.全文不要写两表或多表联查,尽量单独的用独立的service封装,联查时调用多个service即可,然后用java的流来拼起来,因为单表走索引好保证,很难保证联合查询走索引,所以不见得联查会有多快系统拆分的话联合索引很难判断
2.返回值使用 CommomResult 分页 CommomResult, 返回码 使用 resultCode
3.配置 redisTemlate 解决 redis 乱码问题
4.log、mpaop 切面 :log 包提供 各个 controller 的切面处理,主要是记录请求信息。mpaop 提供 在portal 和 admin添加切入点,主要记录一些集合使用的时候出现异常的记录
5.调用Asserts.fail 会抛出 ApiException异常,被 GlobalExceptionHandler 全局异常处理器(处理GlobalExceptionHandler 里面对应的异常),@NotNull 注解也会抛出异常被 ControllerAdvice 捕获
6.redisServiceImpl 对 redisTemlate 的方法进一步封装。提供redis 的各项基本操作。
7.service 里面调用方法要加 this 来调用,直接继承IService。
8.DAO,VO注意大写
总结
本次项目开发经历中,我系统的了解到了开发一个项目的流程,学习了很多常用工具类的使用方法,并且知道了诸如CHINER,redis,ApiPost等软件的操作方法,在项目组中和其他同事一起讨论,设计业务逻辑,帮助他人处理bug,强化了交流能力,明确了数据库设计规范和代码规范,极大的提高了开发效率。感谢大家的陪伴和指导!