java开发面试:常见业务场景之单点登录SSO(JWT)、权限认证、上传数据的安全性的控制、项目中遇到的问题、日志采集(ELK)、快速定位系统的瓶颈

单点登录(SSO)

单点登录,Single Sign On(简称SSO),只需要登录一次,就可以访问所有信任的应用系统。

如果是单个tomcat服务,session可以共享,如果是多个tomcat,那么服务session不共享。

为此我们需要提出针对单点登录的解决方案。

单点登录解决方案

  • JWT(常见)
  • Oauth2
  • CAS

以最简单的订单和登录服务为例,JWT实现的单点登录时序图如下:

  1. 用户访问其他系统,会在网关判断token是否有效
  2. 如果token无效则会返回401(认证失败)前端跳转到登录页面
  3. 用户发送登录请求,返回浏览器一个token,浏览器把token保存到cookie
  4. 再去访问其他服务的时候,都需要携带token,由网关统一验证后路由到目标服务

权限认证

最常见的就是RBAC模型来指导实现权限。

RBAC(Role-Based Access Control)基于角色的访问控制

由3个基础部分组成:用户、角色、权限,有时还可能加其他业务表(譬如菜单表、订单表)

常见结构如下:

  • 5张表(用户表、角色表、权限表、用户角色中间表、角色权限中间表)
  • 7张表(用户表、角色表、权限表、菜单表、用户角色中间表、角色权限中间表、权限菜单中间表)
    即,基础表+业务表+每张表前后组成的中间表

一般使用的框架是:

Apache shiro 、Spring security(推荐)

上传数据的安全性的控制

使用非对称加密(或对称加密),给前端一个公钥让他把数据加密后传到后台,后台负责解密后处理数据

对称加密

文件加密和解密使用相同的密钥,即加密密钥也可以用作解密密钥。

优点:加密速度快,效率高

缺点:相对不太安全(不要保存敏感信息)

非对称加密

两个密钥:公开密钥(publickey)和私有密钥,公有密钥加密,私有密钥解密

优点:与对称加密相比,安全性更高

缺点:加密和解密速度慢,建议少量数据加密

你负责项目的时候遇到了哪些比较棘手的问题?怎么解决的

从以下几个方面选一个回答即可。(不是很建议用第四个回答)

日志采集

ELK:即Elasticsearch、Logstash和Kibana三个软件的首字母

常规采集:按天保存到一个日志文件

ELK

Logstash是一个数据收集引擎,可以动态收集数据,对数据进行过滤、分析并存储到指定的位置。

Elasticsearch是全文搜索分析引擎,可以对数据存储、搜索、分析。

Kibana是一个数据分析和可视化平台,配合Elasticsearch对数据进行搜索,分析,图表化展示

常见Linux处理日志的命令

  1. 实时监控日志的变化

    • 实时监控某一个日志文件的变化:tail -f xx.log;实时监控日志最后100行日志: tail --n 100 -f xx.log
  2. 按照行号查询

    • 查询日志尾部最后100行日志:tail -- n 100 xx.log
    • 查询日志头部开始100行日志:head --n 100 xx.log
    • 查询某一个日志行号区间:cat -n xx.log | tail -n +100 | head -n 100 (查询100行至200行的日志)
  3. 按照关键字找日志的信息

    • 查询日志文件中包含debug的日志行号:cat -n xx.log | grep "debug"
  4. 按照日期查询

    • sed -n '/2023-05-18 14:22:31.070/,/ 2023-05-18 14:27:14.158/p'xx.log
  5. 日志太多,处理方式

    • 分页查询日志信息:cat -n xx.log |grep "debug" | more
    • 筛选过滤以后,输出到一个文件:cat -n xx.log | grep "debug" >debug.txt

怎么快速定位系统的瓶颈

一般使用以下三个方法。

  1. 压测(性能测试),项目上线之前测评系统的压力
  2. 监控工具、链路追踪工具,项目上线之后监控
  3. 线上诊断工具Arthas(阿尔萨斯),项目上线之后监控、排查

压测

指标:响应时间、 QPS、并发数、吞吐量、 CPU利用率、内存使用率、磁盘IO、错误率

压测工具:LoadRunner、Apache Jmeter ...

监控、链路追踪工具

监控工具:Prometheus+Grafana

链路追踪工具:skywalking、Zipkin

阿尔萨斯

其中第六点生成的火焰图如下:

长度越长,说明占用的cpu时间越多。高度越高,说明递归的层数越多。

相关推荐
代码匠心1 分钟前
从零开始学Flink:数据源
java·大数据·后端·flink
掘金一周2 分钟前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架 | 掘金一周 9.18
前端·人工智能·后端
间彧7 分钟前
Spring Boot项目中如何自定义线程池
java
间彧27 分钟前
Java线程池详解与实战指南
java
moisture33 分钟前
CUDA常规知识点
后端·面试
用户2986985301435 分钟前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端
zcychong39 分钟前
ArrayMap、SparseArray和HashMap有什么区别?该如何选择?
android·面试
Reboot41 分钟前
使用cloc统计代码行数
后端
neoooo41 分钟前
当域名遇上家里的电脑:一条隧道通向世界
后端
zjjuejin42 分钟前
Maven依赖管理艺术
后端·maven