请简单介绍一下你们的项目?

黑马头条是一款资讯类信息平台,项目采用当下火热的微服务+大数据技术架构实现,对海量信息进行搜集,通过系统计算分类,获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻。

你们项目的技术架构是怎样的?

整体架构采用前后端分离解决方案
前端基于nodejs使用vue.js相关技术栈
后端基于Springboot+SpringCloud微服务架
技术结构图
包括前端(Weex、Vue、Echarts、WS)、网关(GateWay)、DevOps(单元测试、代码规范)
服务层中包括中间件(Kafka)、索引、微服务、大数据存储等重难点技术
image (1).png

你们Springboot及SpringCloud使用的版本?

SpringBoot 2.3.X
SpringCloud Hoxton.SR8

你是如何理解前后端分离开发的?

项目基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,通常是多人协作开发

  • 对于后端java工程师:把精力放在设计模式,spring+springmvc,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构,弹性计算架构,微服务架构,java性能优化,以及相关的项目管理等等。
  • 对于前端工程师:把精力放在html5,css3,vuejs,webpack,nodejs,Google V8引擎,javascript多线程,模块化,面向切面编程,设计模式,浏览器兼容性,性能优化等等。

    前后端分离开发流程

    image (1).png
  1. 需求分析

梳理用户的需求,分析业务流程

  1. 接口定义

根据需求分析定义接口,定义出接口文档

  1. 服务端和前端并行开发

服务端:依据接口文档进行服务端接口开发
前端:根据用户需求开发操作界面,并根据接口文档制作mock数据,进行测试

  1. 前后端集成接口联调

最终前端调用服务端接口完成业务

  1. 项目开发上线测试

    你们后端接口是如何测试的?

    集成knife4j,使用其核心新功能:
  • 在线调试:提供在线接口联调的强大功能,自动解析当前接口参数,同时包含表单验证,调用参数可返回接口响应内容、headers、Curl请求命令实例、响应时间、响应状态码等信息,帮助开发者在线调试,而不必通过其他测试工具测试接口是否正确,简介、强大。

    SpringMVC接收参数的注解有哪些?

    @RequestParam:如果前端传的参数是 From表单格式或者参数也在路径上但是加了一个问号: 比如:? name=xxx&age=xxx 这个时候用这个注解
    @PathVariable:如果前端传的参数是在路径上比如:/list/{id} 这个时候就用这个注解
    @RequestBody:前端如果传的是json对象 参数就用这个注解来接

    你们的接口文档是如何定义的?

    前台后台程序员项目前期会讨论确认接口信息
    接口定义格式
    1. 接口的描述
    2.接口的访问路径: GET /user/list
    3.请求参数:
    4. 响应内容: Result { code msg data }
    接口文档自动生成
    1.使用knife4j,是为Java MVC框架集成Swagger生成Api文档的增强解决方案
    2.主要包括两大核心功能:文档说明 和 在线调试

    • 文档说明:根据Swagger的规范说明,详细列出接口文档的说明,包括接口地址、类型、请求示例、请求参数、响应示例、响应参数、响应码等信息,使用swagger-bootstrap-ui能根据该文档说明,对该接口的使用情况一目了然。

      你们项目的数据库设计情况? 你是否有独立设计过数据库?

      黑马头条项目采用的分库分表设计,因为业务比较复杂,后期的访问量巨大,为了分摊数据库的压力,整个项目用的不只是一个数据库。其中核心库有6个,每一个数据库解决的是一个业务点,非常接近与实际项目设计。
      6个核心数据库,70多张表
      按照业务垂直分库
      基于原型,使用PowerDesginer工具进行数据库建模,设计完毕后可以直接生成建表语句

      能否说出SpringBoot的自动装配原理?

      项目中是否自定义过starter起步依赖,如何定义?

  1. 在heima-leadnews-basic 模块下,右键创建子工程 heima-knife4j-spring-boot-starter, 并引入依赖
  2. 在heima-leadnews-basic —> heima-knife4j-spring-boot-starter下 创建Swagger配置文件
  3. 在heima-leadnews-basic —> heima-knife4j-spring-boot-starter 资源目录resources文件夹下添加META-INF/spring.factories 文件
  4. heima-leadnews-services 下的pom中,加入该 knife4j通用配置依赖 ,所有的微服务即可使用api文档生成功能

    项目中异常是怎么处理的?

    我们使用的是spring里面的两个注解:
    一个是@RestControllerAdvice(Controller的增强注解)
    一个是@ExceptionHandler(Exception.class) // exception 所有子类 (具体捕获异常的注解)
    在全局异常处理类中,可用处理多个异常,我们暂时处理的是两个异常:
    一个异常是未知异常,还有一个是自定义异常

    项目中注册中心的作用?

  5. 服务注册

  6. 服务发现
  7. 状态监控

    项目中api网关的作用?

    网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性,典型的架构图如图所示:
    image.png
    优点如下:
    ●安全 ,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护。
    ●易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
    ●易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
    ●减少了客户端与各个微服务之间的交互次数
    ●易于统一授权。
    总结:微服务网关就是一个系统,通过暴露该微服务网关系统,方便我们进行相关的鉴权,安全控制,日志统一处理,易于监控的相关功能。