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

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

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

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

你们Springboot及SpringCloud使用的版本?

SpringBoot 2.3.9
SpringCloud Hoxton.SR8

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

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

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

    前后端分离开发流程

  1. 需求分析

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

  1. 接口定义

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

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

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

  1. 前后端集成接口联调

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

  1. 项目开发上线测试
  2. 出现问题谁的问题谁去改

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

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

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

    @RequestBody 当前端在请求体中传入的是json对象时
    @RequestParam 当前端在请求中传入的是key=value参数时
    @PathVaribale 当前端在请求中传入参数在路径上时 /user/101

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

    前台后台程序员项目前期会讨论确认接口信息
    接口定义格式
    接口的描述
    接口的访问路径: GET /user/list
    请求参数:
    请求参数类型
    响应参数类型 application/json
    响应内容: Result { code msg data }

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

    黑马头条项目采用的分库分表设计,因为业务比较复杂,后期的访问量巨大,为了分摊数据库的压力,整个项目用的不只是一个数据库。其中核心库有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文档生成功能

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

    @ControllerAdvice
    controller增强注解
    @ExceptionHandler(Exception.class)
    全局异常处理器
    @ExceptionHandler(CustomException.class)
    自定义异常处理器

  5. 定义一个通用的统一异常处理类
    2. @ControllerAdvice
    3. 定义处理方法 @ExceptionHandler(捕获异常的类型.class)
    4. 在这个类中可以定义多个@ExceptionHandler处理不同的异常

    项目中注册中心的作用?配置中心的作用?

    注册中心的作用:

  6. 服务注册

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

配置中心的作用:
共享配置
多个微服务需要相同的配置,可以单独创建一个配置文件微服务
如: data-id: share-feign.yml

其他服务想用这个共享配置:

  1. spring:
  2. cloud:
  3. nacos:
  4. config: # 配置中心地址配置
  5. shared-configs: # 共享配置
  6. - data-id: share-feign.yml
  7. group: DEFAULT_GROUP
  8. refresh: false

项目中api网关的作用?

网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做,这样既提高业务灵活性又不缺安全性,典型的架构图如图所示:
image.png
优点如下:

  • 安全 ,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护。
  • 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
  • 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
  • 减少了客户端与各个微服务之间的交互次数
  • 易于统一授权。

总结:微服务网关就是一个系统,通过暴露该微服务网关系统,方便我们进行相关的鉴权,安全控制,日志统一处理,易于监控的相关功能。