互联酒旅项目总结

目录

1、项目流程

1.产品原始需求。

2.数据库的设计

3.接口设计

4.编码阶段

5.代码功能调试,代码review

6.前后端联调,项目上线试运行

2.项目的技术框架

3.写在最后


最近去跟着一个团队做一个项目,体验了一个项目的整个开发流程,作为一个刚开始学习java的小白,我想这是一次很宝贵的经验,所以在博客上记录一下,分享给大家。

1、项目流程

1.产品原始需求。

收集整理产品需求,梳理产品的整个流程,熟悉产品。这就是为之后的一切做准备。这一步要清楚产品的一个运作流程,可以思考一下需要什么样的数据库和接口。

2.数据库的设计

接下里的这一步尤为重要,因为数据库是整个项目最重要的核心之一,贯穿了整个项目。在这一步主要就是设计出符合产品需求的数据库,然后画出er图。设计数据库首先得按照规范来设计,不能自己想怎么设计就怎么设计,数据库字段,表明,要用下划线,不能用驼峰名称,字段含义要言简意赅。数据库中表示是和否的字段不要用varchar类型;数据库的字段尽量不要为空;需要有默认值,不然索引会失效;表中的字段名不要加上表的名称前缀;字段名不要用缩写;设计数据库表一般不用外键;等等很多规范,让我也认识到了很多的规范,以前都是不清楚这些的。 还有一个最重要的就是数据库的索引,要在合适的数据表的字段中添加索引,不能每个子段都加索引,因为加了索引会增加数据库的运维成本,所以要合理的控制。在选择字段的类型的时候,要充分的考虑字段适合什么类型,字段的长度多少,尽量设计的合理,字段长度够用就行,不能太长;还有一个就是,在设计表的时候,经常被用到,并且不频繁更改的数据可以做数据冗余,可以方便查询,提高查询性能。

在这期间,还了解了数据库分库分表的一个衡量指标,从两个维度衡量,一个是数据量,一个是并发量,单表行数超过 500 万行或者单表容量超过 2GB,推荐进行分库分表;当并发量超过数据库的最大的并大量的时候也要进行分库分表,以减少数据库的压力。

设计数据库还了解到了一款数据库建模软件:chiner,这款软件简洁,功能强大,用来设计数据库非常的棒

3.接口设计

接下来就是设计接口了,设计接口的时候也学习到了一款新的软件工具,apipost,使用方法类似于postman,但是比postman更简便,最重要的是可以支持团队共享项目协同开发。

接口设计中,要考虑的东西就很多,很考验你对产品的一个熟悉度。这一步需要你全方位的清楚产品的运作流程,这样你才知道产品需要什么接口,返回什么数据。由于现在的项目大多数都是前后端同时开发,所以这一步需要前后端的技术人员一起协同讨论定义接口,这一步至关重要,影响到整个项目的开发进度。

设计接口api的时候 ,返回的数据要有统一的格式,比如我们这次统一用code  message data;每个微服务系统都会有单独的code值;参数名是要用驼峰结构,参数类型要设计合适;当请求的方法当参数过多的时候,因为get请求传递参数有字节限制,可以用post请求代替;url不能用下划线,单词不能用大写,单词隔开一般都是加-;日期格式要注明,数据库存的价格是整数,给前端数据的时候要转成小数;搜索的参数比较多,可以用post请求;表示时间的字段如果精确到分和秒,字段需要用DateTime,如果只精确到天的话就只需要Date就可以。接口设计不强制要求使用restful风格的设计,用普通的get/post请求也是可以的。

4.编码阶段

接下里就是核心阶段了,项目的编码阶段,这个多次是前后端同时进行的,这里我就只负责后端的一个接口的编码开发。操作数据我们使用了较为方便强大的mybatis-plus。在此之前,我对于mybatis-plus也仅是稍稍会用,并没有作深入的了解,这一项目就让我知道了很多。比如我们查询字段拼接条件的时候可以用mybatis-plus的lamda表达式来代替数据表的字段名,这样以后如果更改字段名就不需要改动这一部分的源码了。例如:

 List<RoomImage> roomImageList = this.list(Wrappers.<RoomImage>lambdaQuery()
                .select(RoomImage::getId, RoomImage::getSource, RoomImage::getSort)
                .eq(RoomImage::getRoomStyleId, id)
                .eq(RoomImage::getHotelId, hotelId));
        return roomImageList;

关于业务逻辑的判断,全部要放在Service层,不能放在controller层;对字段,参数的验证我们可以使用一个验证框架 Hibernate Validator验证框架,可以方便很多,避免去写很多重复的判断逻辑,框架的使用可以查看官方文档

关于代码的格式,有一个最普遍的要求,那就是可读性,代码要避免嵌套复杂的if语句,if条件判断复杂的不要放在if括号里,要单独拿出来;有return的就不要用if else了,我们可以这样:

if(flag){
    return a;
}
    return b;

关于异常的捕捉问题,不要在代码中try catch捕捉,这样会使得代码的简洁度降低,并且不容易阅读,我们可以在Service层将异常抛出。创建一个GlobalExceptionHandler来接受service层中手动抛出的异常,并返回相应的数据,还可以定义的抛出异常的类,里面定义一些需要用到的抛异常的方法,在Service层需要抛出异常的时候直接调用方法,这样整个项目的异常都不需要在try catch了,就很方便。

数据库查询的时候尽量不要用联合查询,因为联合查询很难保证会走索引。如果实在要用的话要去分析sql的执行路径,保证你的联合sql语句可以走索引。关于集合,对象的非空判断这里可以推荐一个工具hutool,里面有很多的工具方法,可以简化代码的开发。对于我们编程人员来说,可以使用工具简化我们的开发,我们就应该多去使用工具。

关于类的命名,DAO,DTO,VO等结尾的要全部大写;常量要建一个常量类来统一管理;方法需要有注释,说明方法的作用,入参和出参;

在这这段我尝试使用的jdk1.8后新增加的stream,用stream去操作集合课简化代码,上百行的代码在使用了stream后可以简化到十几行,这让我了解到stream的强大。关于循环遍历,我们也应该用forEach的方法,简洁方便。

在代码的分层上,我们要严格遵循MVC的理念,方便程序的解耦与后期的扩展,每一个数据表都应该有一个Service来操作,而其他的Service都应该调用service层,而不是去调用dao层,这样也增加的程序的可移植性和可扩展性。

编码阶段大家都是用的git来保证协同开发,这里也学习了解到了一些问题,比如代码冲突,代码的覆盖;解决代码覆盖的问题就是在提交前都去更新你的代码为最新的版本,代码冲突则需要去查看冲突的地方然后解决。关于git不熟悉的命令一定不能乱用,否则会出现一些不可预料的事情,比如误删git分支等问题。

5.代码功能调试,代码review

其实在第四步的一些问题都是在代码review中发现并且解决的,这一步主要就是代码进行逻辑的优化,代码简洁化,增加可读性;然后就是保证代码可以返回正常的结果给前端。

6.前后端联调,项目上线试运行

项目开发到这一步就快接近尾声。当然这一步也是至关重要的;之前还少说的一个重要的点,那就是沟通, 和前端人员的沟通,很多问题都需要沟通,尤其在前后端共同开发的时候更不可少。在编码的阶段的时候如果有什么接口或者数据上的改变或者新增都应该和前端人员沟通好,否则到后面前后端数据不一致那就大事不好了。所以我们这一步前后端联调也是为了保证项目的前后端整体可以对接的上。

2.项目的技术框架

本次项目主要使用的是微服务框架,nacos注册中心搭配spring-cloud-gateway网关,和一系列spring-cloud组件。下面就详细介绍一下框架的流程。

1.当用户在客户端发起请求,经过DNS(Domain Name System域名服务器)解析,其中包括WAF(Web Application Firewall)、CDN(Content Distribution Network内容分发网络)、防火墙,
然后通过Nginx集群反向代理到Spring5.0之后添加的Webflux网关,在这一过程中是第一次限流。

2.接这进入SpringCloud Gateway网关,然后进行动态路由指定Predicate(断言)和Filter(过滤器)寻址与Sentinel+Shard进行认证授权和令牌限流,中间还可以整合Redis;另一方面Nacos提供监控报警和日志记录的功能,Nacos集群在整个架构中都能提供服务注册发现与动态配置和配置管理功能,还可以整合SpringBoot Admin进行服务监控。
3.在经过Gateway网关后,使用Ribbon进行负载均衡、Sentinel熔断降级保证服务稳定性和可用性,再通过SpringSecurity框架与OAuth2认证中心整合JWT进行公钥私钥的颁发授权与相应验签认证。
4.SpringBoot应用在业务集群中使用OpenFeign进行相互调用,其中使用Redis集群做分布式数据缓存,Mysql主从复制进行数据的持久化,RabbitMQ进行系统解耦削峰填谷异步调用,ES全文搜索引擎整合Kibana、Logstash进行近乎实时搜索、分析和可视化的全文检索,使用阿里云OSS云存储服务进行对象存储、企业数据管理,使用xxl-job进行分布式任务调度。

5.业务集群还与分布式相挂钩,有着分布式主键,分布式锁,分布式事务,实现CAP(分别是Consistency一致性、Availability可用性、Partitiontolerance 分区容错性)理论(这三个要素最多只能同时实现两点,不可能三者兼顾),和BASE(Basically Available基本可用、Soft State软状态、Eventual Consistency最终一致性)理论(即使无法做到强一致性,CAP的核心就是强一致性,但应用可以采用适合的方式达到最终一致性)。
6.日志收集通过Beats、ELK、和Kafka整和完成。Beats用于日志数据采集使用,Logstash收集日志,发送给Kafka进行解耦、异步处理和流量削峰,然后通过Elasticsearch集群存储日志数据,索引日志数据,再通过Kibana视图形式展现日志信息,使得日志可以在客户端进行检索以及进行一些其他的相关操作。
7.使用以Skywalking为核心的运维监控中心提供链路追踪和监控报警机制,与运维报警系统Prometheus结合Grafana,最终和Alertmanager通过短信、微信或者邮件的形式给模块负责人发送警告通知。
8.开发过程中将代码上传到GitHub上。开发结束使用docker部署,使用K8s AP对资源进行编排,管理应用的生命周期,同时也提高发布与更新版本的效率,然后通过Jenkins Pipeline进行整个构建、测试、交付等持续集成,接下里就有运维人员持续对这些全程进行维护。

3.写在最后

本次项目历经一个多月,在这一个多月中,我学习和了解到了很多东西,尤其是第一次接触到了一个完整的项目框架,可以根据框架上所用的组件进行学习,则为我接下来的的学习指明了方向,不再迷茫。最后要感谢一个多月带着我们学习,耐心教导我们的师哥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值