答题的要点 1. 概念 2. 原理 3. 优点
Spring
一、说说你对spring的理解
首先spring是一个开源框架,为了解决企业应用程序开发复杂性而创建的,它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。
其次spring架构是一个分层架构,由7大模块组成
1.spring IOC
2.spring AOP
3.spring 上下文
4.springDao
5.springMVC
6.springWeb
7.springORM
然后spring自己也有几大框架
spring MVC、spring Boot丶spring cloud丶spring data丶spring security
二丶说一下springIOC
IOC控制反转也叫依赖注入,我理解的是它就是一个生产和管理bean的一个容器,你自己不需要通过new去生成对象而是通过spring bean的工厂来生成所需要的对象。
原理
将对象交给容器管理,你只需要在spring配置文件中配置对应的bean以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
三丶说一下springIOC的几种注入方式
1.通过注解注入
2.调用set方法注入
3.通过构造方法注入
四丶说一下springAOP
简单来说,就是将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少重复代码降低了代码的耦合度。并有利于未来对代码的可操作性和可维护性。
原理
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码
五丶说一下springMVC
M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)
V-View 视图(做界面的展示 jsp,html……)
C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)
六丶spring常用接口
1.ApplicationListener:当需要监听自定义事件时,可以新建一个实现ApplicationListener接口的类,并将该类配置到Spring容器中。
2.FactoryBean:用于创建特定的对象,对象的类型由getObject方法的返回值决定。
3.ApplicationContextAware:当一个类需要获取ApplicationContext实例时,可以让该类实现ApplicationContextAware接口。
4.ApplicationEvent:当需要创建自定义事件时,可以新建一个继承自ApplicationEvent抽象类的类。
七丶spring cloud有哪些组件
https://blog.csdn.net/yejingtao703/article/details/78331442/
spring cloud常见面试题
https://blog.csdn.net/moakun/article/details/82817757
JVM
集合
一丶HashMap底层原理
https://www.cnblogs.com/java-jun-world2099/p/9258605.html
二丶List面试题
https://www.cnblogs.com/chanshuyi/p/4998776.html
MQ
一丶为什么使用MQ
面试官问这个问题的期望之一的回答是,你们公司有什么业务场景,这个业务场景有什么技术挑战,如果不用MQ可能会很麻烦,但是再用了之后带来了很多好处。
消息队列的常见使用场景有很多但是核心的有三个:解耦、异步、削峰
二丶消息队列的优点和缺点?
优点:特殊场景下解耦、异步、削峰。
缺点:
系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的没什么问题,你偏加个MQ进来,万一MQ挂了怎么办,整套系统崩溃了,就完蛋了
系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?
一致性问题:系统A处理完了直接返回成功了,人家都认为你这个请求成功了;但问题是,要是BCD三个系统哪里BD系统成功了,结果C系统写库失败了,咋整?数据就不一致了。
三丶如何保证消息不被重复消费(如何保证消息消费时的幂等性)?
在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;
在消息消费时,要求消息体中必须要有一个bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免同一条消息被重复消费。
四丶如何处理消息丢失的问题 (如何保证消息的可靠传输)?
这个丢数据,mq一般分为两种,要么是mq自己弄丢了,要么是我们消费的时候弄丢了。
用rabbit举例
(1)消息持久化
(2)ACK确认机制
(3)消息补偿机制
(4)设置集群镜像模式
五丶消息如何分发?
若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。
六丶消息队列有哪些配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"> <!-- 定义RabbitMQ的连接工厂 --> <rabbit:connection-factory id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"> <constructor-arg value="10.130.202.12"><!--服务器ip地址--> <property name="username" value="tele-onlineYa"> <property name="password" value="tele-onlineYa"> <property name="port" value="5678"> <property name="channelCacheSize" value="50"> <!--通道缓存大小-->
<property name="virtualHost" value="tele-onlineYa"> </bean> <!--通过指定admin信息,当前producer中的exchange和queue会在rabbitmq服务器上自动生成。 -->
<rabbit:admin connection-factory="connectionFactory" /> <!-- 队列queue,自动声明 -->
<rabbit:queue name="ZL.SALETRACE" exclusive="false" auto-declare="false" durable="true" /> <!--自定义消息接受者-->
<bean id="messageReceiver" class="com.zlf.cn.api.RabbitMqConsumerListener"> <!-- queue监听器,观察监听模式。当有消息到达本应用时会通知监听在对应队列queue上的监听对象 -->
<rabbit:listener-container connection-factory="connectionFactory"> <rabbit:listener queues="ZL.SALETRACE" ref="messageReceiver" />
</rabbit:listener-container>
</beans>
dubbo
一丶简单说一下dubbo
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
二丶dubbo调用关系说明
(1)服务提供者在启动时,向注册中心注册自己提供的服务。
(2)服务消费者在启动时,向注册中心订阅自己所需的服务。
(3)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
(5)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
三丶你配置过dubbo哪些东西
# 应用名 dubbo.application.name = dubbodemo-consumer # 注册中心地址 dubbo.registry.address = zookeeper://localhost:2181
# 调用协议地址 dubbo.protocol.name = dubbo dubbo.protocol.port = 28080
# 设置服务端和消费端连接超时时间
spring.dubbo.consumer.timeout=30000
spring.dubbo.provider.timeout=30000
服务端要声明暴露的服务接口
消费端要配置调用哪些服务
MySQL
一丶MYSQL有哪些索引?
https://blog.csdn.net/liutong123987/article/details/79384395