项目总结

项目名称:云课堂在线教育平台

主要功能介绍:

项目前后端分离开发,后端采用SpringCloud微服务架构,持久层用的是MyBatis-Plus,微服务分库设计,使用Swagger生成接口文档接入了阿里云视频点播、阿里云OSS。系统分为前台用户系统和后台管理系统两部分。

前台用户系统包括:首页、课程、名师、问答、文章。

后台管理系统包括:讲师管理、课程分类管理、课程管理、统计分析、Banner管理、订单管理、权限管理等功能。

Spring Cloud Gateway的作用及实现:

之所以使用Gateway是因为在微服务架构下,不同的微服务会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:

  1. 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  2. 存在跨域请求,在一定场景下处理相对复杂。
  3. 认证复杂,每个服务都需要独立认证。
  4. 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
  5. 某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。

以上这些问题可以借助 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再通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。

作用

  1. 通过配置文件解决跨域问题CorsWebFilter
  2. 全局Filter,统一处理会员登录与外部不允许访问的服务
  3. 自定义异常处理,服务网关调用服务时可能会有一些异常或服务不可用,它返回错误信息不友好,需要我们覆盖处理

Nacos配置中心

在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。

如果微服务架构中没有使用统一配置中心时,所存在的问题:

  1. 配置文件分散在各个项目里,不方便维护
  2. 配置内容安全与权限
  3. 更新配置后,项目需要重启

nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。

  1. 在Nacos创建统一配置文件
  2. service中引入依赖
  3. 创建bootstrap.properties配置文件
  4. 开启动态刷新配置,否则配置文件修改,工程无法感知

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解决)

标题:项目总结
作者:joker
地址:https://upcjoker.top/articles/2022/09/17/1663394050670.html

    评论
    0 评论
avatar

取消