项目总结
项目名称:云课堂在线教育平台
主要功能介绍:
项目前后端分离开发,后端采用SpringCloud微服务架构,持久层用的是MyBatis-Plus,微服务分库设计,使用Swagger生成接口文档接入了阿里云视频点播、阿里云OSS。系统分为前台用户系统和后台管理系统两部分。
前台用户系统包括:首页、课程、名师、问答、文章。
后台管理系统包括:讲师管理、课程分类管理、课程管理、统计分析、Banner管理、订单管理、权限管理等功能。
Spring Cloud Gateway的作用及实现:
之所以使用Gateway是因为在微服务架构下,不同的微服务会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
- 客户端会多次请求不同的微服务,增加了客户端的复杂性。
- 存在跨域请求,在一定场景下处理相对复杂。
- 认证复杂,每个服务都需要独立认证。
- 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
- 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性。Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。
Spring cloud Gateway执行流程
Spring cloud Gateway发出请求。然后再由Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway web handler。Handler再通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。
作用
- 通过配置文件解决跨域问题CorsWebFilter
- 全局Filter,统一处理会员登录与外部不允许访问的服务
- 自定义异常处理,服务网关调用服务时可能会有一些异常或服务不可用,它返回错误信息不友好,需要我们覆盖处理
Nacos配置中心
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
如果微服务架构中没有使用统一配置中心时,所存在的问题:
- 配置文件分散在各个项目里,不方便维护
- 配置内容安全与权限
- 更新配置后,项目需要重启
nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。
- 在Nacos创建统一配置文件
- 在service中引入依赖
- 创建bootstrap.properties配置文件
- 开启动态刷新配置,否则配置文件修改,工程无法感知
gateway单独建模块,在nacos注册中心注册,其他模块也在nacos中注册,从而gateway可访问其他模块,并通过一定的规则对其他模块进行一定的管理。
在微服务架构中总需要各个服务相互调用,各个服务又是以接口方式暴露,所以需要Http远程调用,于是我们就用到了Feign。
Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。
在启动类上使用注解@EnableFeignClients
启用feign
客户端
创建Feign客户端
value()和name()一样,是被调用的服务的名称(微服务名),url()直接填写调用的地址(同http的url地址),注意一点,如果存在url的话,会直接调到url上。
在其他service中直接依赖注入feign的接口名便可以使用,或者可以把feign看成一个服务调用就好。
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
@EnableDiscoveryClient//nacos注册
@EnableFeignClients//调用
@FeignClient
项目中遇到的问题和解决方案
1.前端-路由切换问题
(1)多次路由跳转到同一个vue页面, 页面中的create方法只执行一次
(2)解决方案:使用vue监听
2.前端问题-ES6模块运行问题
(1)Nodejs不能直接运行ES6模块化
(2))解决方案:需要使用Babel把ES6模块化代码转换ES5代码执行。
3.mp生成19位id值
(1)mp生成id值是19位,JavaSrpipt处理数字类型值时候,只会处理到16位
(2))解决方案:@TableId(value = “id”, type =IdType.ID_WORKER_STR), 使用该注解将id转换为字符串类型。
4.跨域问题
(1) 访问协议,ip地址, 端口号,这三个有任何不一样产生跨域
(2)解决方案:
- 在Controller添加@CrossOrigin(本项目刚开始使用nginx管理各个模块的访问,出现跨域问题,使用的是@CrossOrigin)
- 通过网关解决(项目后期改成GateWay解决)
5.413问题(请求体过大)
(1)当使用阿里云视频点播时,由于使用的nginx反向代理服务器,出现了413问题。
(2)解决方案:修改了nginx的最大访问存储空间大小
6.Maven加载问题
(1)maven 加载项目时,默认不会加载src-java文件夹里xml类型文件
(2)解决方案:
- 1.直接复制xml文件到target目录中
- 2.pom.xml中添加build插件
后期改成GateWay解决)