解决方案:微服务[学成在线] day20:项目总结
优采云 发布时间: 2022-12-17 13:47解决方案:微服务[学成在线] day20:项目总结
?预先写好 为什么我要花时间写这篇笔记?
由于在研究项目的过程中发现了原讲义中的一些问题,所以根据“学城在线”微服务项目的PDF讲义编写了讲义,并花时间优化了讲义的格式,突出显示代码、关键标记等。
以及原讲义中描述的一些我看不懂的知识点,我会修改这些内容的表述或者提出一些问题,用我理解的一些思路重新解读这道题。
总结原创 PDF 讲义中的一些已知问题:
如有不足之处,请补缺。
?知识点概览项目代码
后端代码:
前端代码:
完整的数据库文件和nginx配置已经上传到后端代码项目 1.学城在线是个什么项目?
0x01 项目背景
在互联网+概念的催化下,如今的中国在线教育市场发展可谓如火如荼。按细分市场分为:学前教育、K12教育、高等教育、海外教育、职业教育、语言教育、兴趣教育及综合平台。其中,职业教育和语言教育市场优势突出。
学城在线借鉴了MOOC(*敏*感*词*开放在线课程)的设计思想,是一个提供IT职业课程在线学习的平台。学习服务,通过在线学习、在线练习、在线考试等学习内容,使用户最终掌握所学的IT技能,并能够熟练运用到工作中。
目前市场上的在线教育模式多种多样,包括:B2C、C2C、B2B2C等商业模式。学城在线采用B2B2C的商业模式,为企业或个人和学生提供在线教育平台,完成教学活动。市面上类似的平台有:网易云课堂、腾讯课堂等。 学城在线以IT职业课程在线教学为特色。
0x02 功能模块
学城在线是一个提供IT职业课程在线学习的在线教育平台。平台包括:门户网站、学习中心、教学管理中心、系统管理中心、社交系统等子系统。
项目的功能结构如下:
门户是整个平台的入口,其功能包括:
学习中心为用户提供在线学习服务,包括:
教学管理中心为教育机构或讲师个人提供教学管理功能,包括:
系统管理中心提供系统参数配置
0x03 技术架构
项目采用前后端分离的技术架构。前端采用vue.js搭建,服务端采用Spring Cloud Netflix微服务架构。系统分为用户层、CDN、负载均衡、前端UI、微服务层、数据层、接口层和DevOps等部分组成,下图是一个完整的技术架构图:
业务流程示例:
1、用户可通过PC、手机等客户端访问系统进行在线学习。2、系统采用CDN技术,定时从CDN访问一些图片、CSS样式文件、视频等资源。3. 所有请求都经过负载均衡器。4、对于PC、H5等客户端请求,先请求UI层,渲染用户界面。5、客户端UI向服务层请求获取具体的业务操作。6.服务层将数据持久化到数据库
下图是技术架构的简化图:
1.用户层。用户层描述了本系统支持的客户端用户。本项目目前为各种用户提供服务,包括H5、PC、Android和IOS。
2、CDN的全称是Content Delivery Network,即内容分发网络。本系统所有静态资源均采用CDN加速,提高访问速度。系统静态资源包括:html页面、js文件、css文件、image图片、pdf、ppt和doc教学文档、视频等。
3、负载均衡系统的CDN层、UI层、服务层、数据层均配备负载均衡服务,系统采用LVS+Nginx实现负载均衡。
4. UI层 UI层描述了系统向pc用户、app用户、h5用户提供的产品界面。本项目使用vue.js+elementUI在PC和H5上实现。
5、微服务层将系统服务分为三类:前端服务、后端服务、系统服务。前端服务:主要为学习用户提供学习服务。后台服务:主要为管理用户提供教学管理服务。系统服务:公共服务,为系统中的所有微服务提供公共服务功能
6、对外系统接口包括以下接口:
7. DevOps为本系统的开发、运维提供支撑体系,包括:
2、项目采用什么技术架构?0x01 微服务技术栈
所有微服务都构建在 Spring Boot、Spring Cloud Netflix 上
0x02 接口定义规范
项目架构设置了一个接口层。界面层使用swagger注解来描述界面的内容。接口定义规范如下:
问
回复
0x03 微服务注册中心
两台Eureka Server相互注册,形成高可用。
微服务向Eureka Server注册自己,远程调用时从微服务中发现目标服务地址。
微服务远程调用采用客户端负载均衡技术,使用Feign Client。
0x04 微服务网关
网关的作用是负载均衡、路由转发、请求过滤等。
项目中的网关与 Nginx 配合使用。
0x05 项目是否使用了Spring?这有什么用途?
项目基于Spring搭建
1.所有微服务均使用Spring Boot开发
3、数据层使用Spring Data JPA、Spring Data MongoDB、Spring Data redis。
4、业务层使用Spring控制本地事务,也使用了Spring Task任务调度框架,Spring AMQP组件等。
5.控制层使用SpringMVC,Sprnig Security Oauth2。
6、微服务管理使用Spring Cloud的Eureka注册中心,微服务之间的调用使用Ribbon和Feign Client完成。
7.使用Zuul网关完成微服务安全验证
0x06 项目中如何使用Spring Cloud?
这个问题一般在回答完项目的技术架构之后再问,可以根据使用Spring Cloud完成微服务开发的具体步骤来回答。
1、每个微服务都是使用Spring Boot开发的。每个微服务项目都包括web、service、dao三层,和开发一般项目没什么区别:
2、微服务开发完成后,必须向Eureka注册中心进行注册,才能被其他微服务发现和访问。
3、微服务与微服务之间使用feign进行调用,feign Client具有负载均衡的功能。只需要在接口上声明@FeignClient注解,Spring底层会生成一个动态代理对象,使用ribbon client完成调用。
4、前端访问微服务需要经过网关。网关使用Nginx和Zuul来实现。Nginx 是前端负载均衡器。经过Nginx之后,就到了Zuul。Zuul在项目中的作用是过滤用户请求,判断用户身份。对于一些对外暴露的微服务需要经过Zuul,可以直接通过Nginx负载均衡访问
0x07 Spring Data JPA和MyBatis为什么要同时使用?如何使用它?
这个问题检查数据访问接口的使用程度。
项目中使用了Spring Data JPA和MyBatis来访问MySQL,但是他们的分工不同:
Spring Data JPA是Spring提供的一组JPA接口。使用Spring Data JPA主要完成一些简单的增删改查功能。
对于复杂的查询功能,会使用MyBatis编写SQL语言来实现,因为使用Spring Data JPA做一些复杂的查询不如MyBatis方便,Spring Data JPA是面向对象的,而MyBatis是直接面向SQL语句的,而复杂的sql操作如果使用原生SQL实现,也方便后续优化。
0x08 什么雪崩?怎么解决?
容错保护是指微服务在执行过程中遇到错误并从错误中恢复的能力。微服务容错性差很容易导致雪崩效应,什么是雪崩效应
微服务的雪崩效应体现在服务之间的调用上。当其中一个服务无法提供服务时,其他服务也可能死亡。例如:单点登录服务调用用户信息服务查询用户信息,由于用户信息服务无法提供服务 单点登录服务一直在等待,导致用户登录和用户注销功能无法使用。一个服务导致的一系列多个服务无法提供服务,这就是微服务的雪崩效应。
Spring Cloud Hystrix基于Netflix开源框架Hystrix的集成,实现了断路器保护、线程隔离、信号隔离等容错功能。
什么是断路器保护?
开路保护类似于家用电路中的保险丝。当电路过载时,保险丝会自动切断,保护整个电路的安全。微服务开路保护的工作原理是,当微服务请求失败次数达到一定比例时,会切换到开路状态。请求微服务时,直接返回结果,不再请求微服务。是否可以正常请求服务,如果正常则切换到半开状态,最后切换到关闭状态。
具体操作方法可以使用Fallback,它会为每一个FeignClient方法调用Fallback,当发生开路时调用Fallback方法返回错误结果。
什么是线程隔离?
使用不同的线程池调用微服务,线程池之间互不影响。即使一个服务不可用,也不影响其他服务的调用。比如一个线程池用于商品服务调用,另一个线程池用于用户服务调用。线程池,即使用户服务不可用,也不会影响商品服务的调用。
0x09 用什么技术实现视图层?
这个问题比较模糊。并没有问到底是客户端的视图还是服务端的视图,所以这个问题不仅仅是关于视图技术,还有我们对前后端分离的理解。
1、view层存在于前端和server端。
2、前端视图采用vue.js+elementUI产品界面。
3、服务端都是暴露的rest接口,数据统一以json展示。
0x0A接口是怎么定义的?使用什么数据格式?
本题考查前后端分离开发中的接口定义技巧。
1.接口定义
使用SpringMVC编写Controller方法,对外暴露Http接口,在Controller方法上使用RequestMapping、PostMapping、GetMapping等注解定义Http接口。
2. 使用什么数据格式?
3、前端开发的具体流程是怎样的?
前后端分离的开发模式在互联网公司中最为常见,尤其是一些大型的互联网公司,但是一些传统的软件开发公司仍然采用传统的开发模式。这个问题是为了检验你是否真正体会过前端开发的好处。
1. 前后端开发人员讨论确定接口。
接口讨论通过后,形成接口文档。
本项目专门搭建一个api项目,其中定义接口,Spring Boot集成Swagger,生成Swagger接口,前后端开发者通过html查看接口文档内容。
2、前后端开发人员根据接口文档进行开发。
单元测试是在开发过程中进行的。
前端人员如何进行单元测试?
前端人员可以通过一些工具生成一些模拟数据,比如:EasyMock。
3、双方功能开发完成,进行前后端联调。
读:
前端使用什么技术栈?
前端项目多为单页应用(SPA),使用vue.js框架开发,搜索功能前端使用nuxt.js服务端渲染(SSR)框架开发。
技术栈包括:
姓名
阐明
节点.js
Node.js 是一个事件驱动的 I/O 服务器端 JavaScript 环境。基于谷歌的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
vue.js
用于构建用户界面的渐进式框架。Vue 的目标是使用尽可能简单的 API 实现反应式数据绑定和组合视图组件。
npm/cnpm
npm是随NodeJS一起安装的包管理工具,可以解决NodeJS代码部署中的很多问题
网页包
Webpack 是一个前端资源加载/打包工具。它会根据模块的依赖关系进行静态分析,然后根据指定的规则为这些模块生成相应的静态资源。
公理
Axios 是一个基于 Promise 的 HTTP 库,可以在浏览器和 node.js 中使用。
nuxt.js
Nuxt.js 是一个通过 Vue 进行服务器端渲染的简单框架,灵感来自 Next.js
元素用户界面
一套面向开发者、设计师和产品经理的基于Vue 2.0的桌面组件库
4.项目0x01cms页面管理目前完成了哪些功能
cms (Content Management System) 即内容管理系统。cms系统在本项目中的定位是对各个网站(子站点)页面的管理。本项目的cms系统并没有管理每个子网站的所有资源,比如图片、CSS、html页面等,主要管理因运营需要而频繁变化的页面,所以以满足快速开发的需要,并根据运营需要推出。
功能包括:
什么是网格文件系统?工作原理是什么?如何使用?
为什么?如何使用?
GridFS 是 MongoDB 提供的用于文件持久化存储的模块。它可以用作分布式文件系统。cms 子系统将页面文件和模板文件存储在 GridFS 中。由于本项目使用了MongoDB,可以使用GridFS进行快速集成开发。
它是这样工作的:
在GridFS中存储文件就是以块的形式存储文件。文件会按照256KB的大小分成多个块进行存储。GridFS使用两种集合(采集s)来存储文件,一种集合是chunks,用于存储文件的二进制数据;集合是文件,用于存储文件的元数据信息(文件名、块大小、上传时间等)。
从 GridFS 读取文件需要组装和合并文件的每个块。
使用方法是:
使用Spring data mongodb包下提供的GridFsTemplate访问GridFS。
gridFsTemplate.findone() 查询文件
gridFsTemplate.delete() 删除文件
gridFsTemplate.store()存储文件
复制
MQ在这个项目中是如何使用的?
1、平台收录多个站点,页面属于不同的站点。要求是要发布一个页面,该页面应该发布到它所属站点的服务器上。
2、各站点服务部署cmsClient程序,并绑定到交换机上。绑定时,将站点 ID 指定为 routingKey。指定站点id为routingKey,实现cms客户端只能接收所属站点的页面发布消息。
3、页面发布程序向MQ发布消息时,指定页面所属站点的Id作为routingKey,根据routingKey将消息发送给指定的cmsClient。
页面发布结果如何采集?
每次发布都会在数据库中记录发布日志,每个cms客户端完成页面发布并上报发布结果。
1.在站点管理中配置各个站点的服务器信息
2、每次发布页面都会记录发布日志(服务器ID、页面ID、页面名称、发布结果)
3. cms客户端在页面发布后将发布结果记录到数据库中。
4. 用户可以通过查询发布日志表中的信息了解每次发布的结果(哪些服务器页面发布成功,哪些发布失败)。
0x02 为什么课程管理要用多张表来存储课程信息?
1.课程信息比较复杂。为了方便教学机构对课程信息进行分步管理,也可以分权限管理课程信息,将课程信息管理功能分为多个表,如下
2、课程信息的分离也是为了系统的扩展。如果所有的课程信息都存储在一张表中,不利于系统的扩展。
0x03 媒体资产管理
每个教学机构都可以在媒体资源系统中管理自己的教学资源,包括:视频、教案等文件。
媒体资产管理的主要管理对象是课程录播视频,包括:媒体资产文件查询、视频上传、视频删除、视频处理等。
如何上传大文件?
前端使用WebUploader将文件分块,调用服务端分块上传接口上传分块文件。分块上传后,前端请求服务器合并分块。当上传过程中断重新上传时,服务器判断是否已经上传完chunk。上传的块不再重新上传。
如何进行视频处理?
如上图所示,Java程序调用ffmpeg和流媒体程序员提供的视频处理库(C程序),完成avi、mp4视频到m3u8格式视频的转换。
Java程序使用Jdk提供的Process Builder调用ffmpeg和C程序进行视频处理。
Process Builder可以在java程序运行时调用第三方程序,启动第三方程序进程。
当视频处理完成后,Java程序抓取第三方程序的输出日志,解析出视频处理完成标志,更新视频处理状态为完成。
什么是CDN内容分发?
视频处理完成后,会在中央媒体服务器中保存一份。另外,视频会通过CDN程序发布到边缘媒体服务器,用户请求的视频会通过CDN请求边缘媒体服务器中的视频,提高了视频播放速度。
具体使用了第三方公司的CDN服务。
本项目未实现CDN内容分发
0x04 搜索
项目中的课程搜索是使用 ElasticSearch 完成的。
这样做的方法是:
1、使用Logstash(logstash是ES下的一个开源软件,可以同时获取采集数据并转换多源数据)将MySQL中的课程信息读入ES创建索引,使用IK tokenizer参与.
2. 使用 Java High Level REST Client 完成搜索。
3、生产环境使用ES部署为集群。
0x05 图片服务器
本项目使用FastDFS分布式系统作为图片服务器。
FastDFS是一个用c语言编写的开源分布式文件系统,适用于小文件存储。
FastDFS 包括 Tracker server 和 Storage server。客户端请求Tracker服务器上传和下载文件,Tracker服务器调度完成文件上传和下载到Storage服务器。
使用FastDFS官方提供的Java API来实现。
影像服务使用Nginx作为代理服务器,完成对部署在Storage上的Nginx的负载均衡请求。
使用 FastDFS 有什么好处?
与其他分布式文件系统相比,FastDFS 适用于小文件存储。它不以块存储文件,也不需要合并文件,因此性能比GFS、HDFS等通用文件系统要高。
图片上传过程是怎样的?
时序图如下
执行过程如下:
1、管理员进入教学管理前端,点击上传图片
2.图片上传到文件系统服务,文件系统请求fastDFS上传文件
3、文件系统对文件信息进行入库,将文件信息存储在文件系统服务数据库中。
4、文件系统服务向前端返回文件上传结果,成功则返回文件的Url路径。
5、课程管理前端请求课程管理,将课程图片信息保存到课程数据库中。
6、课程管理服务将课程图片信息保存在课程数据库中。
FastDFS 是否支持断点续传?
FastDFS 为可恢复上传付费。Api中的append_file1方法用于实现断点续传。本项目没有使用FastDFS的续传功能。
0x06 在线视频点播
本项目采用HLS技术实现视频点播。
1.使用FFmpeg对视频进行编码生成m3u8文件和ts文件。
2. 使用 Nginx 作为媒体服务器。
3、客户端使用video.js播放视频。
5.项目的一些常见问题 0x01 如何实现认证授权?
本项目使用Spring security + Oauth2完成用户认证和用户授权。认证授权流程如下:
1、用户请求认证服务完成身份认证。
2.认证服务向用户颁发JTI(身份令牌)和JWT令牌。拥有identity token表示身份合法,使用Jwt token完成授权。
3、用户携带jwt token请求资源服务。
4. 网关验证用户身份令牌的有效性。如果无效,则表示用户没有登录。如果有效,则允许用户继续访问。
5、资源服务获取jwt token,根据jwt token完成授权,允许用户访问指定资源。
0x02 交易是如何控制的?分布式项目如何进行事务控制?
本题考查对交易的理解和应用。
1、使用Spring声明式的事务控制方式来控制微服务,在Service方法中添加@Transctional注解,实现事务控制。它控制着MySQL的本地事务。
2.项目中存在大量的分布式事务控件。比如订单支付、课程发布等地址都使用了分布式事务。本项目实现分布式事务控制,实现最终的数据一致性。方法是:
一个。将分布式事务拆分为多个本地事务。
b. 在提交交易之前,每个参与者都必须通过数据验证和资源预留。
C。消息队列用于通知多个事务参与者完成本地事务的提交。
d. 未能提交的本地事务将被重试。
0x03 如何调试接口中的错误?
1、界面的开发需要前端和服务端联调。仔细阅读测试人员报告的bug信息,判断该bug是服务端bug还是前端bug。通常,服务接口开发完成后,会使用postman工具进行测试,测试没有问题就会提交到Git或者SVN。
2.如果发现bug的错误点,可以根据bug信息进行修改。
3、修改完成后,需要重新测试前后端,按照测试人员提交的测试流程重新测试。如果测试通过,这个错误将被设置为已解决。
0x04 本项目是如何实现在线支付的?实施过程中遇到了哪些问题
1、系统收费课程需要用户在线支付,支付接口采用微信扫码支付。
2、获取需求后,确定使用微信支付,首先阅读微信的接口文档,这里重点阅读统一下单、支付结果通知、支付结果查询三个接口。
3、下载官方sdk,编写单元测试用例,测试各个接口。测试时我们没有使用微信的沙盒测试,直接使用官方接口。我们将金额更改为较小的金额以进行测试。
4.单元测试通过后,开发整个支付功能,最后通过集成测试。
一些问题
接口参数签名的问题是我没有仔细看接口文档,漏了一个必须的参数,一直报签名失败。然后我把需要的参数全部填上,终于解决了问题。
在线支付功能在本项目中没有实现,这里只是实现的一些思路,有待后续完善
0x05 系统异常如何处理?
系统采用统一的异常处理流程进行异常处理。
1.自定义异常类型。
2.自定义错误代码和错误信息。
3. 对于可预见的异常,程序员在代码中主动抛出自定义异常类型的异常,抛出异常时需要指定错误码。
4.对于不可预知的异常(运行时异常),SpringMVC统一捕获Exception类型的异常,由统一的异常捕获类解析处理,转换成与自定义异常类型一致的信息格式(错误码+错误信息) .
5. 可预见的异常和不可预见的运行时异常最终会以统一的信息格式(错误代码+错误信息)来表达,并最终将请求响应给客户端。
0x06 是否使用了消息队列?它是如何使用的?有哪些应用场景
该项目使用 RabbitMQ 消息队列。
RabbitMQ提供了多种工作模式,如下:
项目主要使用Routing模式。
Routing mode就是路由模式,使用方法是:
1、每个消费者*敏*感*词*自己的队列,设置routingkey。
2、producer将消息发送给switch,switch根据routingkey将消息转发到指定队列。
有哪些应用场景?
1.任务是异步处理的。
消息队列通知消息接收者对不需要同步处理且耗时较长的操作进行异步处理。改进了应用程序响应时间。
2.应用解耦
MQ相当于一个中介,生产者通过MQ与消费者进行交互,实现了应用的解耦。
0x07 开发过程中遇到了哪些问题?如何解决
本题考查开发者的问题描述和解决问题的能力,能够列出开发中的实际技术问题。
回答这个问题有两个方面:
一、问题描述
2.问题解决
例子:
处理订单时使用定时任务。当时使用Spring Task来完成。由于一个订单服务会部署多个,多个订单服务会同时处理任务,会导致任务重复处理。如何解决任务重复处理。
解决:
乐观锁就是用来解决这个问题的。在任务表中设置一个版本字段记录版本号,取出任务记录同时获取任务的版本号,执行前锁定任务。具体方法是执行update,根据当前版本号给版本号加1,如果更新成功,则表示加锁任务成功,可以执行任务。
6.项目功能整体测试 0x01 准备工作 1)启动基础设施
ElasticSearch和Logstash使用windows批处理(开发环境)启动,其他服务使用windows服务启动。启动效果如下
ES启动脚本
@echo off
setlocal enabledelayedexpansion
setlocal enableextensions
SET params='%*'
:loop
FOR /F "usebackq tokens=1* delims= " %%A IN (!params!) DO (
SET current=%%A
SET params='%%B'
SET silent=N
IF "!current!" == "-s" (
SET silent=Y
)
IF "!current!" == "--silent" (
SET silent=Y
<p>
)
IF "!silent!" == "Y" (
SET nopauseonerror=Y
) ELSE (
IF "x!newparams!" NEQ "x" (
SET newparams=!newparams! !current!
) ELSE (
SET newparams=!current!
)
)
IF "x!params!" NEQ "x" (
GOTO loop
)
)
CALL "%~dp0elasticsearch-env.bat" || exit /b 1
IF ERRORLEVEL 1 (
IF NOT DEFINED nopauseonerror (
PAUSE
)
EXIT /B %ERRORLEVEL%
)
set ES_JVM_OPTIONS=%ES_PATH_CONF%\jvm.options
@setlocal
for /F "usebackq delims=" %%a in (`CALL %JAVA% -cp "!ES_CLASSPATH!" "org.elasticsearch.tools.launchers.JvmOptionsParser" "!ES_JVM_OPTIONS!" ^|^| echo jvm_options_parser_failed`) do set JVM_OPTIONS=%%a
@endlocal & set "MAYBE_JVM_OPTIONS_PARSER_FAILED=%JVM_OPTIONS%" & set ES_JAVA_OPTS=%JVM_OPTIONS:${ES_TMPDIR}=!ES_TMPDIR!% %ES_JAVA_OPTS%
if "%MAYBE_JVM_OPTIONS_PARSER_FAILED%" == "jvm_options_parser_failed" (
exit /b 1
)
cd /d "%ES_HOME%"
%JAVA% %ES_JAVA_OPTS% -Delasticsearch -Des.path.home="%ES_HOME%" -Des.path.conf="%ES_PATH_CONF%" -Des.distribution.flavor="%ES_DISTRIBUTION_FLAVOR%" -Des.distribution.type="%ES_DISTRIBUTION_TYPE%" -cp "%ES_CLASSPATH%" "org.elasticsearch.bootstrap.Elasticsearch" !newparams!
endlocal
endlocal
exit /b %ERRORLEVEL%</p>
复制
Logstash 启动脚本
@title logstash i n teachplan_media_pub
logstash.bat -f ../config/mysql_course_media.conf --path.data=../data/teachplan_media/
复制
2)启动所有服务,查看是否在eureka中注册
应用
服务说明
XC-治理中心
Eureka服务注册中心,本项目启动了两个实例,一主一从
XC-治理-网关
Zuul 网关
XC-服务-基础-文件系统
文件系统服务,本项目主要提供图片服务上传下载功能
XC-服务学习
学习中心服务,提供中心相关API接口
XC-服务-管理-cms
站点cms,提供网站页面静态、制作、发布等相关API接口
XC-服务-管理-cms-客户
站点cms客户端,通过MQ接收页面发布的通知,
XC-服务-管理-课程
课程管理服务,提供课程管理相关API
XC-服务-管理-媒体
课程媒体资产管理服务,提供课程媒体文件相关API
XC-服务-管理-媒体-处理器
媒体资产处理服务通过MQ接收视频处理通知,然后调用第三方API对媒体资产文件进行转码和分块。
XC-服务-管理-订单
订单管理服务,提供订单处理相关API
XC-服务-搜索
搜索服务,提供搜索相关API
XC-服务中心
用户中心服务,提供用户相关API
XC-SERVICE-UCENTER-AUTH
统一的认证中心服务,提供认证授权相关操作的API
在IDEA中启动服务,启动效果如下
成功注册所有服务
所有服务在eureka注册成功
3)启动前端项目
启动效果如下
0x02 功能测试 1)页面静态测试
访问 cms 前端
指向hosts文件中的local,配置nginx虚拟主机
找到上一个页面,点击预览,效果如下
添加新页面,填写页面数据,填写数据模型url,用于结合模板渲染页面
添加成功
预览效果如下
编辑页面信息测试
删除测试
成功删除
测试过程中出现了一些问题。cms 接口没有权限。问题描述:由于前几章cms前端没有登录权限的相关配置,导致无法访问cms页面 正常获取数据解决办法:参考“4. day18的前端集成认证授权章节进行配置。课程预览没有权限 说明:由于cms在预览课程时使用window.open()访问预览页面,所以无法将认证信息传递到header。解决方案:在cms服务和课程服务ResourceServerConfig中保证/cms/preview/*,/cms/config/getmodel/* and /course/preview/model/*认证分别 2) 课程管理
访问学城主站
点击右上角登录,进入登录页面
登录成功,主站右上角显示用户信息
登录成功后,将用户的认证token信息存储到redis中
点击右上角“Teaching Provider”进入课程管理前端,点击我的课程,页面初始化前会访问/course/list接口获取用户所有课程信息,并渲染放到页面上,效果如下
单击“管理课程”以测试和更新课程信息
测试更换课程图片,删除原图再上传
营销信息修改
添加教案测试
预习课程
点击课程预览生成预览链接
访问预览链接,效果如下
从效果图可以看出,我们的课程数据和课程模板成功结合进行了静态渲染,得到了最终的课程详情页效果
课程发布
点击课程发布按钮
点击查看课程详情页面,会自动跳转到课程官方发布页面,跳转链接如下
页面效果如下
课程重新发布后,课程发布信息的时间戳会更新,logstash也会重新采集我们发布的课程数据,添加到ElasticSearch的索引库中
更新后的ES索引库数据如下
3) 媒体资产管理
上传一个视频文件进行测试,效果如下图
访问我的媒体资源,可以看到我们刚刚上传的视频文件的相关信息,如下图
4)课程信息搜索
访问搜索入口页面为了展示分页的效果,我们设置为每页显示两个结果
输入云关键字进行搜索,并实现关键字高亮,效果如下
课程图片随意上传,别当真哈哈
单击搜索结果可转到该课程的课程详细信息页面
5)在线点播
在课程的课程计划管理中,将我们刚刚上传的视频关联一个课程计划,操作示例如下
关联成功后,重新发布课程信息
课程信息重新发布后,课程的时间戳会更新。logstash检索到时间戳的变化后,会自动将更新后的课程信息添加到ElasticSearch的索引库中,如下图
自动更新教案信息
进入课程的课程详情页面,点击立即学习
进入在线学习页面,点击目录中的课程计划,会自动切换到课程计划节点对应的媒体资源内容
玩测试,推进度条
7.项目需要改进
已经分散到每一章的最后总结中,这里整理总结一下
欢迎朋友补充
8.项目学习周期
平均每天花在学习、练习、总结笔记等方面的时间大概3小时左右,完全把项目学完大概需要2个月左右,而且项目还有一些需要自己补充和完善的地方。
解决方案:优采云万能文章采集器
优采云Universal文章采集器 是一种允许批量 采集 下载指定 关键词文章 的工具,如果您想要文章关键词的有兴趣可以批量下载,可以使用这个完全免费的优采云万能文章采集器破解版。优采云通用文章采集器基本介绍
优采云Software出品的一款通用文章采集软件,输入关键字即可采集各种网页和新闻,还可以采集指定文章 用于列表页面(列页面)。
优采云通用文章采集器功能介绍
1、依托优采云软件独有的通用文字识别智能算法,可实现对任意网页文字的自动提取,准确率达95%以上。
2、输入关键词即可采集进入百度新闻和网页、搜狗新闻和网页、360新闻和网页、谷歌新闻和网页、必应新闻和网页、雅虎;批处理关键词全自动采集。
3、可以针对采集指定网站列列表下的所有文章,智能匹配,无需编写复杂的规则。
4、文章翻译功能,可以将采集好的文章翻译成英文再翻译回中文,实现翻译伪原创,支持谷歌和有道翻译。
5.史上最简单最智能的文章采集器,支持全功能试用,试一试就能看到效果!
优采云通用文章采集器如何使用
1 下载完成后不要运行压缩包中的软件直接使用,先解压;
2 软件同时支持32位和64位运行环境;
3 如果软件无法正常打开,请右键以管理员模式运行。
优采云通用文章采集器注意事项
微信引擎有严格的限制,请将采集线程数设置为1,否则很容易生成验证码。
优采云万能文章采集器常见问题解答
采集黑名单设置错误 [采集Settings] 进入黑名单时,如果末尾有空行,会导致关键词采集函数显示搜索数量而不是关于实际 采集 过程的问题。
优采云通用文章采集器更新日志
1、新增文字过滤功能,可以屏蔽大部分不属于文字的内容;merge strict and standard text recognition,加强文字识别能力(现在识别的文字没有父层的div标签,都是走的内码);增强提取一些故意伪装的 网站 标题的能力;其他更新。
2、采集文章URL,加强对相对路径的处理,如../和../../等,本版本加强处理后,相对路径将是完全转换成绝对路径,这就和将鼠标移到浏览器中看到的链接一样。
3. 修复采集因谷歌更改失败的问题。
4、修复在关键词采集文章栏中选择确切的标签时没有弹出输入的问题(之前版本导致);根据URL采集文章栏添加 Remove outer code 可选选项(之前默认启用);调试模式更改为 文章 来源;嫌疑人描述已更新;其他。
5.修复微信采集失败问题。
6.增强分页采集识别能力。
7.增加谷歌地址前缀指定,可以设置自己可以使用的谷歌域名。
8、采集设置的正则替换支持使用分离多个匹配替换表达式。
9.增强文字识别能力,识别准确率有所提升;增加对特殊编码响应的识别。
10、新增属性“original”标识二次加载图片的转换。
11、外部文件更新谷歌翻译使用的域名;修正谷歌tk参数更改翻译失败的问题。
12、修复部分百度网页由于系统原因无法跳转到网址采集的问题;添加自动去除网址#后缀部分,会导致网页读取错误;采集文章URL增加左右插入选项;修复了之前版本导致的文本提取过滤的一些问题;其他更新。
13、增强部分使用跳转的网页识别。
14.增加标题字数限制,最大100字,避免字数过长带来的一些问题;其他更新。