互联酒旅项目总结
开发流程部分:
项目流程部分:
流程梳理:
- 用户在客户端发起请求,进行DNS解析,其中包括WAF,CDN,防火墙
2.再通过nginx集群(作用:反向代理与虚拟主机)反向代理到Webflux网关中,通过网关微服务进行指定的Predicate(断言)和Filter(过滤器)来匹配对应的controller层的请求地址,其中Sentinel+Shard进行认证授权,中间还可以整合Redis来实现令牌限流(请求限制)。
3.另一方面还可以同时与Nacos合作为它提供监控报警和日志,集成服务注册发现功能,Nacos在整个项目架构中起到注册中心以及配置中心的作用,整合SpringBoot Admin进行服务监控。
4.同时Gateway可以通过Ribbon进行负载均衡、Sentine熔断降级和业务集群建立桥梁,先是通过SpringSencurity框架于OAuth2认证中心整合JWT进行公钥私钥的颁发、授权、与响应验证功能
5.SpringBoot在业务集群中通过openFeign来进行业务集群间业务的调用,在业务中,使用到一些工具:Mysql—>主从复制进行数据的持久化操作,RabbitMQ---->实现消息队列,用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用,ElasticSearch----->进行全文检索,阿里云OSS云存储服务----->进行对象存储、企业数据管理等
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最终和Alertmenager通过短信、微信或者邮件的形式给模块负责人发送警告通知。
9.最后由开发人员将代码上传到github,通过docker容器进行部署,在通过k8s进行资源的编排等,使用Jenkins Pipeline进行代码构建、代码测试、部署等,最后由运维人员进行运维
工程架构部分:
关于本次项目学到的一些东西
1、设计数据库部分:
开始时间:22-03-25
结束时间:22-04-13
此次开发时按照阿里开发手册(黄山版),学到了很多东西
数据库必备的4大字段:id、deleted、update_time、create_time
- id:主键,BIGINT类型,对应java中的Long
- deleted:删除,TINYINT,所有的删除都必须是逻辑删除,除非业务需求是物理删除
- update_time:更新时间,要求有默认值,CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- create_time:创建时间,要求又默认值,CURRENT_TIMESTAMP
数据库中的字段,都应该需要设置默认值,主外键字段除外
一对多或者多对多表的设计,使用中间表来进行连接。
字段名需要见名知意,多个字母要用下划线_隔开
推荐使用的工具:CHINER元数建模,个人根据挺好用的,很是方便
2、接口部分:
开始时间:22-04-13
结束时间:22-04-20
接口方面要有人与前端方面人员进行沟通,确定所需的接口
注意事项
-
请求的方式一般使用GET/POST
-
请求路径接口文档为准,与代码对应controller层一致
-
GET 请求的参数在 Query 里面填写,POST 在 Body 里写。不要混用
-
参数名采用驼峰命名
-
数据库中存在的字段的参数,命名要保持一致,参数描述简单
-
如果参数中用多个 id 参数,必须区分命名,且要与数据库一致
-
响应数据示例的格式必须依据实际的格式
-
响应数据的类型和描述和请求参数的要求一致
个人负责的接口是:获取前端参数查询单个房型所有信息
3.开发编码部分:
此次使用mybatis-plus进行开发,不用自己去写sql语句,下面说一下这次学到的东西吧
(1)service层
- mybatis-plus,service不要引入dao层的东西,因为已经在IService接口已经引入,只需通过this即可调用mybatis-plus提供的方法
- 开发时尽量采用lambda表达式进行表达,使代码更加简便
- 操作数据库时不要出现数据库字段,应使用数据库映射出的实体类字段
(2)controller层
- 我的参数是通过定义一个实体类来进行接收,判断传的参数是必填项,应在实体类上方加@NotNull,如果没有传必填参数就提示
- 参数查数据库查不到的时候报错不能在controller层解决,所有的报错解决应在service层完成,controller层只负责接受参数跟返回响应。
- 接收日期类型时,应看接口前端传的是什么格式的日期,然后在实体类进行格式化,例如我前端传的是2022-05-03,在对应字段的实体类上方需加上@JsonFormat(pattern = “yyyy-MM-dd”,timezone = “GMT+8”)注解
4、其他收获
掌握了git的使用以及如何进行团队的开发,了解了一个项目从0到1的大致的开发流程,以前学的项目都是有前端的页面,如何我们通过浏览前端的页面判断他需要什么功能,而进行编写代码。而这次是没有前端页面,而是提出了一个项目,然后谈论这个项目需要什么模块,进行数据库设计,各种开会讨论,最终订出来一套暂定的数据库,接着再进行接口设计,通过接口文档来进行开发,实现了前后端分离开发。这次项目让我学到了很多东西,包括技术方面,与人沟通方面,团队协作方面,这是一次很不错的体验,希望把这个当作自己的一个新起点,不忘初心,继续奋斗,不再只会CRUD了。