1、Java常见的线程池有哪些,它们的使用场景
- newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有的执行顺序按照任务的提交顺序执行(FIFO);适合顺序处理文件日志等;
- newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小;适合任务量固定且时间稳定的场景;
- newCacheThreadPool:创建一个可以缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小;可以用来处理大量短期的突发流量;
- newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务
- newWorkStealingPool:Java8新增的线程池,创建一个拥有多个任务队列(减少连接数)的线程池;适合处理递归任务或高并发场景;
2、RabbitMQ常见的工作模式
simple简单模式:一个生产者对应一个消费者
work工作模式:一对多,每个消费者得到的消息唯一
发布订阅模式:一对多,生产者将消息发给交换机,交换机再将消息转发给与之绑定的队列
Routing路由模式:一对多,可以根据指定的路由key将消息发送给不同的队列
Topic主题模式:一对多,再Routing路由模式的基础上,可以使用通配符定义路由key(*匹配单个字符,#匹配任意个字符)
3、JDBC使用流程
导入jdbc包
加载数据库驱动程序:Class.forName("com.mysql.cj.jdbc.Driver");
建立数据库连接:DriverManager.getConnection(url, username, password);
创建sql语句:connection.createStatement()或者connection.prepareStatement(sql)
执行sql语句:
statement.executeQuery(sql)或者setString(K,V);preparedStatement.executeUpdate()
处理结果:用resultSet获取查询结果
关闭资源:resultSet、statement、preparedStatement、connection的.close()
4、什么是CSRF,常见的类型有哪些
CSRF跨站请求伪造,是一种攻击,迫使用户在当前通过身份验证的Web应用程序上执行不需要的操作(改密码、发评论、支付等)
- POST型CSRF(表单提交型):制作一个恶意网站,包含一个自动提交的表单,诱使受害者在已登陆的状态访问该网站,浏览器就会以受害者名义提交表单
- GET型CSRF(URL参数型):构造一个包含恶意操作的URL,诱使受害者点击,从而浏览器发送GET请求执行恶意操作
- JSON请求型CSRF:恶意网站将受害者的浏览器导向到攻击者控制的JSON请求,导致受害者已登录的情况下,浏览器发送包含恶意数据的JSON请求,执行未授权操作
- 图片请求型CSRF(用图片的src发GET)、Flash型(用flash文件发请求)、XHR型
5、微服务设计的原则有哪些
- 单一职责原则
意思是每个微服务只需要实现自己的业务逻辑就可以了,比如订单管理模块,它只需要处理订单的业务逻辑就可以了,其它的不必考虑。
- 服务自治原则
意思是每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,我们完全可以把它当成一个项目来对待。不必依赖于其它模块。
- 轻量级通信原则
首先是通信的语言非常的轻量,第二,该通信方式需要是跨语言、跨平台的,之所以要跨平台、跨语言就是为了让每个微服务都有足够的独立性,可以不受技术的钳制。
- 接口明确原则
由于微服务之间可能存在着调用关系,为了尽量避免以后由于某个微服务的接口变化而导致其它微服务都做调整,在设计之初就要考虑到所有情况,让接口尽量做的更通用,更灵活,从而尽量避免其它模块也做调整。
6、Spring Cloud常见组件及组件的作用
Netflix的OSS开源套件:Zuul应用网关、Eureka注册中心、Ribbon负载均衡、Hystrix服务熔断、Feign服务调用;(随着套件闭源和停止维护逐渐弃用)
spring官方:Gateway实现网关、LoadBalancer实现负载均衡、OpenFeign服务调用、RestTemplate发送http请求、Oauth2实现身份认证和鉴权
Spring cloud alibaba:Dubbo做RPC通信、Nacos注册中心和配置中心、Sentinel服务限流和服务降级
7、SpringCloud中什么叫做服务注册、服务续约、服务下线、服务剔除
服务注册:服务器向注册中心提供自己的元数据(ip、端口、类型等)
服务续约(心跳机制):注册中心会每隔一段时间向服务器发送一次请求续约,当多次续约失败会删除服务器在注册表中信息
服务下线:服务器在程序关闭时向注册中心发送取消请求,该服务器的信息从注册表中删除
服务剔除:当多次续约失败(默认90秒)会删除服务器在注册表中信息
8、JWT包含几个部分,每个部分包含什么内容
头部(Header):包含声明类型(typ)和使用的签名算法(alg)
载荷(Payload):包含要传递的声明信息(包含用户非隐私数据)
签名(Signature):将头部和载荷进行签名,使用密钥来保证数据的完整性和真实性
9、Redis中常见的持久化方式及它们的区别
RDB持久化(默认开启):RDB文件存储缓存数据,因此恢复数据比AOF快;包含两种命令生成RDB文件:save(主线程生成RDB文件,阻塞主线程)、bgsave(子进程生成RDB文件)
- redis默认配置了三种条件自动执行bgsave命令:save 900 1(900秒之内对数据库进行了至少一次修改)、save 300 10(300秒之内对数据库进行了至少10次修改)、save 60 10000(60 秒之内对数据库进行了至少 10000 次修改)
AOF持久化:将redis的写操作记录到一个文件中,重启redis的时候先去读文件中的命令从而恢复缓存数据(通过修改redis.conf文件中appendonly为yes,并设置appendfilename持久化文件的名称);
- AOF有三种写回策略(appendfsync):always(每次写操作后都记录)、everysec(每次写操作后先将命令写入缓冲区,每隔一秒再将缓冲区中的内容写回硬盘)、no(每次写操作后先将命令写入缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘);高性能选no、高可靠选always、高性能但丢一点数据选everysec
- AOF重写机制:随着写操作越来越多,记录文件越来越大会带来性能问题,为了避免这个问题提供了AOF重写机制,当AOF文件大小超过设定的阈值启用重写机制,复制一个AOF文件然后去除无效操作,再覆盖旧的AOF文件
- AOF后台重写:AOF文件过大时重写操作耗费性能,所以重写AOF由后台子进程完成
10、请解释什么是响应时间、吞吐量、QPS、TPS和并发数
- 响应时间:系统或服务对请求的处理所需的时间
- 吞吐量:单位时间内系统处理的请求数量或事务数量(由QPS或TPS衡量)
- QPS:单位时间内系统接收到的查询或请求数量
- TPS:单位时间处理的事务或操作的数量
- 并发数:同时处于活动状态的请求或用户数量