艾****科技有限公司
1.介绍一下自己(来自哪个学校,什么专业,现在在哪,意向城市是哪,做过什么项目。你老家在哪)
2.你的项目是什么实习项目还是学校作业应用到实际领域中了吗?
3.使用到过哪些微服务组件
注册中心/配置中心 Nacos
负载均衡 Ribbon
服务调用 Feign
服务保护 sentinel
服务网关 Gateway
4.你使用的微服务参与到哪些模块
5.介绍一下nacos的作用
我理解的是主要三块大功能,分别是服务注册 、服务发现、服务状态监控
我们当时项目采用的eureka作为注册中心,这个也是spring cloud体系中的一
个核心组件
- 服务注册:服务提供者需要把自己的信息注册到eureka,由eureka来保存这
些信息,比如服务名称、ip、端口等等
- 服务发现:消费者向eureka拉取服务列表信息,如果服务提供者有集群,则
消费者会利用负载均衡算法,选择一个发起调用
- 服务监控:服务提供者会每隔30秒向eureka发送心跳,报告健康状态,如果
eureka服务90秒没接收到心跳,从eureka中剔除
我看你之前也用过nacos、你能说下nacos与eureka的区别?
我们当时xx项目就是采用的nacos作为注册中心,选择nacos还要一个重要原
因就是它支持配置中心,不过nacos作为注册中心,也比eureka要方便好用
一些,主要相同不同点在于几点:
共同点
Nacos与eureka都支持服务注册和服务拉取,都支持服务提供者心跳方式做
健康检测
Nacos与Eureka的区别
①Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时
实例采用主动检测模式
②临时实例心跳不正常会被剔除,非临时实例则不会被剔除
③Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
④Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
Eureka采用AP方式
6.说说Spring、SpringBoot、SpringCloud的常用标签并介绍一下这些标签的作用
Spring:
第一类是:声明bean,有@Component、@Service、@Repository、@Controller
第二类是:依赖注入相关的,有@Autowired、@Qualifier、@Resourse
第三类是:设置作用域 @Scope
第四类是:spring配置相关的,比如@Configuration,@ComponentScan 和@Bean
第五类是:跟aop相关做增强的注解 @Aspect,@Before,@After,@Around,@Pointcut
SpringBoot:
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 :@SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
@ComponentScan:Spring组件扫描
SpringMVC
有@RequestMapping:用于映射请求路径;
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象;
@RequestParam:指定请求参数的名称;
@PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数;
@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。
@RequestHeader:获取指定的请求头数据,
还有像@PostMapping、@GetMapping这些。
7.说一下IOC、AOP吧
aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产
生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做
为公共日志保存,事务处理等
8.怎么使用到了AOP,怎么实现的。
我们当时在后台管理系统中,就是使用aop来记录了系统的操作日志主要思路是这样的,使用aop中的环绕通知+切点表达式,这个表达式就是要找到要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,比如类信息、方法信息、注解、请求方式等,获取到这些参数以后,保存到数据库
10.启动线程的几种方式
在java中一共有四种常见的创建方式,分别是:
- 继承Thread类、
- 实现runnable接口、
- 实现Callable接口、
- 线程池创建线程。
通常情况下,我们项目中都会采用线程池的方式创建线程。
11.线程池了解多少
嗯!是这样
在jdk中默认提供了4中方式创建线程池
- 第一个是:newCachedThreadPool创建一个可缓存线程池,如果线程池长度
超过处理需要,可灵活回 收空闲线程,若无可回收,则新建线程。
- 第二个是:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发
数,超出的线程会在队列 中等待。
- 第三个是:newScheduledThreadPool 创建一个定长线程池,支持定时及周
期性任务执行。
- 第四个是:newSingleThreadExecutor 创建一个单线程化的线程池,它只会
用唯一的工作线程来执行任 务,保证所有任务按照指定顺序(FIFO, LIFO, 优
先级)执行。
12.Mysql用过吗?说说有哪些索引类型
- PRIMARY KEY(主键索引)
- 每个表只能有一个主键索引,它保证了数据的唯一性,并且通常用于标识表中的每一行。
- UNIQUE(唯一索引)
- 用于确保某列或某几列的组合值的唯一性,可以有多个列,但每个组合的值必须唯一。
- INDEX(普通索引)
- 这是最基本的索引类型,没有唯一性的要求,用于提高查询效率。
- FULLTEXT(全文索引)
- 用于对文本数据进行全文搜索,通常用于大型文本字段,如文章内容。
- COMPOSITE(复合索引/组合索引)
- 一个索引包含两个或多个列,适用于多个列经常一起进行查询操作的情况。
13.你怎么去定位sql的效率低,通常会怎么来优化sql
定位
如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划
explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检
查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效
的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否
存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了
回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
优化
嗯,这个在项目还是挺常见的,当然如果直说sql优化的话,我们会
从这几方面考虑,比如建表的时候、使用索引、sql语句的编写、主从复制,读写分离,还有一个是
如果量比较大的话,可以考虑分库分表
14.写sql语句的时候需要注意哪些
15.怎么判断命中索引
- 使用
EXPLAIN
关键字 在MySQL中,可以通过EXPLAIN
关键字来查看一个查询的执行计划。执行计划中的key
列会显示查询中实际使用的索引名称。如果key
列的值为NULL
,则表示查询没有使用索引;如果显示具体的索引名称,则表示查询使用了该索引。- 查看
sys.dm_db_index_usage_stats
动态管理视图 在SQL Server中,可以通过sys.dm_db_index_usage_stats
动态管理视图来查看索引的使用情况。这个视图提供了索引的使用统计信息,包括user_seeks
、user_scans
、user_lookups
和user_updates
等列,通过这些统计信息可以判断索引是否被使用。- 分析查询计划 在SQL Server中,可以通过查询计划来确定是否使用了索引。如果查询计划中显示使用了索引,那么说明索引已经被成功使用,查询性能较高。如果查询计划中没有使用索引,那么可能需要考虑优化查询或者添加适当的索引来提高查询性能。
- 使用
SHOW INDEX
命令 在MySQL中,可以使用SHOW INDEX
命令来查看表的索引信息,包括索引的名称、列、类型等,但这个命令不显示索引的使用情况。- 慢查询日志 开启慢查询日志可以帮助识别那些执行时间较长的查询,通过分析这些查询的日志,可以判断索引是否被有效使用,以及是否需要优化索引。
16.定位慢查询
嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒
以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报
表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,
这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题
如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查
询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也
可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项
目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我
们就可以在日志文件找到执行比较慢的SQL了。
17.哪些操作可能会引起sql的效率
- 全表扫描
- 当查询没有使用索引或者索引不适用时,数据库可能会执行全表扫描,这会大大降低查询效率。
- 复杂的JOIN操作
- 涉及多个表的复杂连接操作,尤其是在没有适当索引的情况下,可能会导致查询效率低下。
- 子查询
- 某些情况下,子查询可能会导致查询效率降低,尤其是在子查询中进行多次全表扫描时。
- OR条件
- 使用多个OR条件的查询可能会使索引失效,导致查询性能下降。
- 类型转换
- 在WHERE子句或JOIN条件中进行类型转换可能会导致索引失效。
- 函数和表达式
- 在索引列上使用函数或计算表达式可能会阻止数据库使用索引。
- 大数据量的表
- 对于包含大量数据的表,即使是简单的查询也可能需要较长时间来执行。
18.介绍xxl-job,你在项目中的使用流程
XXL-JOB是一个轻量级的分布式任务调度平台,具有以下特点:
- 平台化:提供可视化界面,易于任务管理和监控。
- 易部署:快速安装和配置,可以迅速投入使用。
- 开发迅速:支持快速开发和部署新的任务。
- 学习简单:文档齐全,上手快。
- 轻量级:资源占用少,适合各种规模的项目。
- 易扩展:支持集群部署,可以根据需求水平扩展。
在项目中使用XXL-JOB的简要流程包括:
- 搭建调度中心:下载XXL-JOB源码,执行SQL脚本创建数据库表,配置数据库连接和调度中心信息,然后启动调度中心。
- 配置执行器:在业务项目中引入XXL-JOB依赖,配置执行器信息(如AppName、IP、端口等),并创建执行器配置类。
- 编写任务Handler:在业务项目中编写具体的任务逻辑,继承XXL-JOB提供的接口或使用注解标注任务。
- 创建和管理任务:在XXL-JOB的调度中心界面创建任务,设置任务的调度时间和执行参数。
- 启动任务:在调度中心启动任务,执行器接收任务并执行相应的业务逻辑。
19.说一下redis有哪些数据类型,你在什么时候用到了redis
- String:简单的键值对,用于缓存和计数器。
- List:有序列表,适用于消息队列。
- Set:无序集合,自动去重,用于存储唯一项。
- Sorted Set:有序集合,支持范围查询,适合排行榜。
- Hash:键值对集合,用于存储对象。
20.你是通过什么路径学习的Java