项目总结

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
传统型负载均衡 CLB,每月750个小时 15LCU
简介: VUE的MVVM模式:Model:负责数据存储–scriptView:负责页面展示–template标签View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示–script

前端VUE

VUE的MVVM模式:

Model:负责数据存储–script

View:负责页面展示–template标签

View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示–script


@表示当前工程的src目录下

template:编写view部分

script:vm部分,定义变量与方法

style:编写页面样式

:model是v-bind:model的缩写,常用在form标签中

v-model指令在表单 、 及 元素上创建双向数据绑定

v-on:click指令后跟触发事件,可以简写为@click

输入框怎么加的红色星号?在方法体里添加pageFormRules方法

mounted:当DOM元素渲染完成后调用该方法

mounted() {} == mounted:function(){}


接口开发步骤

1、需求分析

2、接口定义

3、服务端和前端并行开发

4、前后端集成测试


技术栈:

学成在线服务端基于Spring Boot构建,采用Spring Cloud微服务框架;

持久层:MySQL、MongoDB、Redis、ElasticSearch;

数据访问层:使用Spring Data JPA、Mybatis、Spring Data Mongodb等;

业务层:Spring IOC、Aop事务控制、Spring Task任务调度、Feign、Ribbon、Spring AMQP、Spring Data Redis等。

控制层:Spring MVC、FastJSON、RestTemplate、Spring Security Oauth2+JWT等;

微服务治理:Eureka、Zuul、Hystrix、Spring Cloud Config等;


1、内容管理系统cms中使用到了Spring Data Mongodb查询自定义分页数据

课程管理:

在线教育平台的课程信息相当于电商平台的商品。课程管理是后台管理功能中最重要的模块

课程管理服务端工程采用Spring Boot技术构建,技术层技术使用Spring data Jpa、Mybatis、druid

环境搭建:

1、创建数据库

课程分类、基本信息、营销信息、图片、计划

导入课程管理前端工程xc-ui-pc-teach

课程计划:

课程计划包括两级,第一级是课程的大章节、第二级是大章节下属的小章节,每个小章节通常是一段视频,学生点 击小章节在线学习

课程计划是一个树型结构,方便扩展课程计划的级别

本功能使用element-ui 的tree组件来完成

课程计划是树型结构,SQL语句主要采用表的自连接方式进行查询

Mapper文件中:针对输入参数为简单类型#{}中可以是任意类型,判断参数是否为空要用 _parameter


Nginx配置虚拟主机:通过server_name名字去访问location下指定路径下的index文件

Swagger接口生成工作原理:

1、系统启动,扫描到api工程中的Swagger2Configuration类

2、在此类中指定了包路径com.xuecheng,找到在此包下及子包下标记有@Api注解的ControllerApi接口

3、根据改接口中的Swagger注解生成接口文档


webpack打包工具

npm包管理工具

热部署webpack-dev-server服务器


前后端跨域问题:

由于前后端分离,前端和后端启动项目所访问的域名或端口号不同时会出现此问题,使用http代理中间件proxyTable来解决,就是在请求前加/api/模块名自动去匹配对应的服务


vue中的两个钩子函数:

created:DOM元素还没有渲染生成时调用

mounted:DOM元素渲染完成后调用该方法


前后端请求响应流程:(理解即可)

1、在浏览器输入前端url

2、前端框架vue.js根据url解析路由,根据路由找到page_list.vue页面

3、首先执行page_list.vue中的钩子方法

4、在钩子方法中调用query方法。

5、在query方法中调用cms.js中的page_list方法

6、cms.js中的page_list方法通过axios请求服务端接口

7、采用proxyTable解决跨域问题,node.js将请求转发到服务端(http://localhost:31001/cms/page/list)

8、服务端处理,将查询结果响应给前端

9、成功响应调用then方法,在then方法中处理响应结果,将查询结果赋值给数据模型中的total和list变量。

10、vue.js通过双向数据绑定将list数据渲染输出


RabbitMQ

1、Spring Boot默认集成RabbitMQ

2、社区活跃,文档完善

3、使用简单,功能强大,高并发能力强

组成部分:生产者、通道、服务进程(交换机+队列)、消费者

消息发布进程:

1、生产者与服务进程建立TCP连接

2、生产者与服务进程建立通道

3、生产者通过通道将消息发送到服务进程,由交换机将消息转发给队列

消息接收过程:

1、消费者与服务进程建立TCP连接

2、消费者与服务进程建立通道

3、消费者监听指定的队列

4、当有消息到达队列时服务进程默认将消息推送给消费者

工作模式:

6种工作模式:

工作队列、两个消费端共同消费同一个队列中的消息

发布订阅、每个消费者监听自己的队列

路由、每个消费者监听自己的队列,并且设置routingkey,由交换机根据routingkey来转发消息到指定的队列

主题、每个消费者监听自己的队列,并且设置带通配符的routingkey,由交换机根据routingkey来转发消息到指定的队列

头部、header模式与routing不同的地方在于,header模式取消routingkey,使用header中的key/value(键值对)匹配队列

RPC、即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用

应用场景:异步处理:在注册的时候,用户信息的存储和用户手机号验证码异步同时执行,提高处理效率

页面发布流程:

1、前端请求cms执行页面发布

2、cms执行静态化程序生成html文件

3、cms将html文件存储到GridFS中

4、cms向MQ发送页面发布消息

5、MQ将页面发布消息通知给Cms Client

6、Cms Client从GridFS中下载html文件

7、Cms Client将html保存到阿里云OSS中


PageHelper分页:单表查询直接用Spring Data JPA,多表关联查询使用Mybatis有利于后期优化处理


Spring Cloud中提供服务注册中心来管理微服务信息,比如管理这些服务IP和端口,如果不用注册中心就只能在各个模块的配置文件中配置固定的IP地址跟端口号

Eureka服务与客户端的关系:Eureka客户端注册和发现服务治理中信

为了实现高可用,至少部署两台以上Eureka服务器,来相互注册


Feign远程调用:


小程序商品页面在cms工程里进行配置


@EnableEurekaServer//启动Eureka注册中心服务器,在govern-center中配置

@EnableDiscoveryClient//启动Eureka客户端,在cms工程中配置

@LoadBalanced//开启客户端负载均衡


工作流程:

1、cms服务将自己注册到注册中心。

2、课程管理服务从注册中心获取cms服务的地址。

3、课程管理服务远程调用cms服务


负载均衡是微服务架构中必须使用的技术,通过负载均衡来实现系统的高可用、集群扩容等功能


Ribbon是一个基于HTTP、 TCP的客户端负载均衡器,nginx是服务端负载均衡,两者最大区别是Ribbon要从Eureka服务器获取服务列表来进行维护,利用负载均衡的轮训算法去调用微服务

添加@LoadBalanced注解后,restTemplate会走LoadBalancerInterceptor拦截器,此拦截器中会通过 RibbonLoadBalancerClient查询服务地址,可以在此类打断点观察每次调用的服务地址

和端口,两个cms服务会轮流被调用

有统计显示打开一个页面超过4秒用户就走掉了

对于不会频繁改变的信息可以采用页面静态化的技术,提前让页面生成html静态页面存储在nginx服务器,用户直 接访问nginx即可,对于一些动态信息可以访问服务端获取json数据在页面渲染


一、认证登录

1、申请令牌

从eureka中获取认证服务的地址,设置header和body,利用restTemplate.exchange远程调用获取令牌信息:jti、refresh_token和access_token

2、令牌信息存储到redis中

将token(jti):短令牌作为key,令牌信息作为value值存储到redis中并校验是否过期

3、短令牌存到Cookie

获取到短令牌jti并存储到cookie中,uid对应短令牌


二、退出

1、清楚cookie信息

从cookie中取出用户身份令牌uid

将cookie中maxAge设置为0

2、清除redis信息

从redis中删除uid,token=user_token:uid,redis将token作为key,access_token作为value


三、用户认证

用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问


四、用户授权

判断用户是否拥有访问资源的权限


单点登录


第三方认证:

首先通过微信的认证系统(微信认证)进行认证,微信认证通过后本系统便可获取该微信用户的基本信息,从而在本系统将该微信用户的头像、昵称等信息显示出来,

该用户便不用在本系统注册即可直接学习


微信认证流程:

1、用户点击微信登录

2、页面由后端生成微信二维码

3、用户扫描二维码授权登录

4、微信后台接收到授权码然后认证

5、后台接收到微信回调函数返回的用户信息

6、验证该用户如果第一次登陆存储该用户信息,如果不是第一次登陆请求认证服务器给予权限

7、后台处理用户信息将信息展示到页面


xc-service-ucenter-auth:认证服务工程

6个以“oauth_”开头的表都是spring Security 自带的表

主要使用oauth_client_details表

申请令牌获得6个字段,主要使用token和jti,jti存放到redis中作为key

微服务之间的认证用密码模式,微信三方登录用授权码模式

资源服务授权配置:接口请求时添加令牌进行请求,报表工程接入认证添加oauth2依赖、资源服务配置类,在该配置类中configure方法中进行配置即可进行放行,所有请求均可放行使用/**

JWT令牌就是为了解决不用每次请求认证服务完成授权,请求的时候就携带JWT令牌


xc-service-ucenter:用户中心工程

查询用户信息接口

getUserext:该方法是由认证服务xc-service-ucenter-auth中的loadUserByUsername方法调用获取用户权限的


跨工程调用Feign:定义客户端UserClient接口,添加FeignClient注解,在service中通过@Autowired引入之后,调用该接口中的方法

密码加密使用BCryptPasswordEncoder

JWT查询接口userjwt:

取出cookie中的用户身份令牌

拿身份令牌从redis中查询jwt令牌


Zuul网关会对请求进行过滤、校验、路由等处理。有了服务网关可以提高微服务的安全性和网关校验请求的合法性,当请求不合法时将被拦截,拒绝访问

客户发送请求,首先通过Nginx进行请求分发到各个微服务,在请求资源时先通过ZuulFilter过滤器进行拦截

代理作用:

客户请求网关/api/report,路由转发到/report

主要是在工程配置文件中添加了路由配置

客户请求server_name(域名)/api,代理转发到location,然后转发到upstream,最后请求到gateway工程

客户请求域名/api,通过ngnix代理转发到gateway工程,然后通过该工程的ZuulFilter进行过滤认证,最后通过Zuul进行路由转发去掉/api去请求对应的资源


过滤器ZuulFilter作用

1、查询Cookie中令牌是否存在

2、查询Http header中jwt是否存在

3、查询redis中token是否过期


xc-govern-gateway:网关工程

添加添加@EnableZuulProxy注解启动网关

下面三个方法在LoginFilter类中的run方法进行调用

getTokenFromCookie:从Cookie中获取token

getJwtFromHeader:从请求头中获取jwt

getExpire:从Redis查询token令牌是否过期,使用stringRedisTemplate


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
机器学习/深度学习 Linux 计算机视觉
项目介绍
【7月更文挑战第30天】项目介绍。
41 1
|
开发框架 .NET API
如何在现有项目中使用`Masa MiniApi`?
如何在现有项目中使用`Masa MiniApi`?
82 0
如何在现有项目中使用`Masa MiniApi`?
|
IDE Java Linux
tbfetcher项目小结
tbfetcher项目小结
99 0
|
搜索推荐 开发者
关于AskBlog项目存在的问题
关于AskBlog项目存在的问题
72 0
|
Ubuntu 编译器 开发工具
ShiftMediaProject项目介绍
ShiftMediaProject项目介绍
193 0
A2021-A2022年度项目总结(二)
A2021-A2022年度项目总结(二)
93 0
|
JavaScript 前端开发
项目生成
项目生成
161 0
|
JavaScript 前端开发
前端实践小项目
哈喽 ~ 大家好鸭!这篇我们来看看前端实践小项目第一篇 “五星好评与暂停取值”(底部有源代码)
243 0
前端实践小项目