面试知识(一)

1.Rabbitmq 消息丢失怎么解决

0
Spring mvc运行过程
0

2.Springboot自动配置原理

springboot主程序的@SpringBootApplication注解其实是个组合注解,他包含了一个@EnableAutoConfiguration注解,这个注解就是开启自动配置的注解(包含两个注解@AutoConfigurationPackage(用于自动扫描包,将主启动类所在包及下面所有子包里面的所有组件扫描到Spring容器),@Import),这个注解的作用是利用EnableAutoConfigurationImportSelector给容器中导入一些组件,将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中
 

3.Mysql 索引,索引为什么这么快?text类型字段适合做索引吗?

b+树
 
一条sql很慢,说下分析过程
explain计划解析
slow_query_log 慢查询开启状态
slow_query_log_file 慢查询日志存放位置
long_query_time 查询超过多少秒才记录

4.Hibernate 一级二级缓存

一级缓存是session级别的,同个session两次查询同样的sql,第二次会从缓存直接读
二级缓存是session factory级别的,可以跨多个session,即不同的session都可以访问缓存数据

5.mybatis

一级二级缓存
一级缓存作用域为session,session flush或者close后缓存被清空
二级缓存是namespace级别,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态)
 
MyBatis实现一对一有几种方式?具体怎么操作的?(resultMap里面配置association节点)
联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。
 
MyBatis实现一对多有几种方式,怎么操作的?(resultMap里面的collection节点)
        有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。
 
Mybatis怎么分页? pagehelper是逻辑分页还是物理分页
MyBatis提供了RowBounds类,用于实现分页查询,属于逻辑分页,一次查询所有记录
pagehelper:pagehelper属于物理分页
怎么使用 pagehelper.startPage(1,5);第一页,5条记录

6.动态代理

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。
JDK动态接口代理
1. JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。
CGLib动态代理
2. :CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLib封装了asm,可以再运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLib创建动态代理。
 

ThreadLocal:关键字

     作用: 线程局部变量副本,各自的线程持有变量的初始值,各自不影响各自使用。
     原理:内部维护了一个map,map的key是当前线程,value是设置的变量副本值。
     应用场景:比如 工具类时间解析 simpleDateFormat.parse(),多个线程使用会有安全问题。用ThreadLocal就可以避免。
     缺点:会有内存泄漏问题。使用完一定手动调用remove(),移除当前线程的entity。

7.说下Zk选举模式

(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的leader
处理投票规则 针对每一个投票,服务器都需要将别人的投票和自己的投票进行比较,规则如下
    · 优先检查ZXID。ZXID比较大的服务器优先作为Leader。
    · 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
  对于ZK1而言,它的投票是(1, 0),接收ZK2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时ZK2的myid最大,于是ZK2胜。ZK1更新自己的投票为(2, 0),并将投票重新发送给ZK2。
如果leader挂掉,则会重新选举。重新选举的规则也是一样的。
 

8.单线程 Redis 为什么这么快

1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2.采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
3.使用多路I/O复用模型,非阻塞IO;
下边我们针对多路 I/O 复用模型进行简单的探讨:
(1)多路 I/O 复用模型
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量

9.redis 哨兵

1.在Redis安装目录下有一个sentinel.conf文件
2.修改sentinel.conf文件内容
sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
3.启动redis服务和redis哨兵
# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf
 
Redis五种数据类型,redis实现队列
string,list,hash,set,zset(有序集合)
可以使用list类型实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop

 ================================================================================================

springcloud理解

 
eureka 服务端,启动类添加@EnableEurekaServer,pom依赖spring-cloud-starter-eureka-server,YML:eureka.client.service-url.defaultZone:
eureka 提供者(客户端),主要启动类添加@EnableEurekaClient,pom依赖spring-cloud-starter-eureka、spring-cloud-starter-config,YML:eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
eureka:自我保护,某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存,保证ap,zookeeper保证ap,可以通过eureka.server.enable-self-preservation = false 禁用自我保护
eureka集群:比如启了3个Eureka服务端做集群,则每个服务的defaultZone:配上其它两个的地址就行了,如果有微服务要注册到这个集群,则defaultZone配置三个eureka服务端地址。
ribbon
pom:spring-cloud-starter-ribbon
注解@LoadBalanced
@LoadBalanced
public RestTemplate getRestTemplate(){};
spring: application: name: 应用名字 这个应用名字启多个服务时要保持一致,这样可以直接通过服务名来调用,并且负载均衡
com.netflix.loadbalancer.RandomRule #配置规则 随机
com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
com.netflix.loadbalancer.RetryRule #配置规则 重试
com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略
还可以自定义负载均衡算法
feign
pom:spring-cloud-starter-feign
注解:@FeignClient(value = "MICROSERVICECLOUD-DEPT")
主启动类添加@EnableFeignClients(basePackages= {"com.atguigu.springcloud"})
Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),
该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),
通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。
hystrix 服务熔断
pom spring-cloud-starter-hystrix
@HystrixCommand(fallbackMethod = "processHystrix_Get")
一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
主启动类添加@EnableCircuitBreaker//对hystrixR熔断机制的支持
服务降级
服务降级处理是在客户端实现完成的,与服务端没有关系
实现了FallbackFactory接口的类DeptClientServiceFallbackFactory,在注解@FeignClient中添加fallbackFactory属性值
服务监控 hystrixDashboard
主启动类+注解@EnableHystrixDashboard
健康度从绿色<黄色<橙色<红色
Hystrix Turbine
zuul网关
pom:spring-cloud-starter-zuul
主启动类@EnableZuulProxy
可以隐藏真实服务名、设置公共前缀、做拦截(权限校验)、做限流
在Spring Cloud Gateway中,有Filter过滤器,因此可以在“pre”类型的Filter中自行实现上述三种过滤器。但是限流作为网关最基本的功能,Spring Cloud Gateway官方就提供了RequestRateLimiterGatewayFilterFactory这个类,适用Redis和lua脚本实现了令牌桶的方式。
springcloud config 全局配置中心
作用好处:实现配置文件的统一管理,动态刷新
使用springcloud bus、配合git仓库的webhook、消息总线实现配置文件动态刷新
sleuth、zipkin服务追踪
一条链路里面只会看到一条transid,比如订单服务调用商品服务,这次的调用在订单服务和商品服务的transid是相同的
所有sleuth信息发送到zipkin,可以在zipkin的管理界面直观的看到每个调用链的一个时间消耗,快速定位那个服务出了问题
springcloud stream
在mq上层进一步的封装,可以实现在代码层面对MQ的无感知,甚至切换中间件,比如kafka切换成rabbitmq,简化了开发人员对消息中间件使用的复杂度,让开发人员更专注于业务
Oauth2
微服务间token鉴权
Spring 事务传播机制,你一般怎么写事务
0
0
Spring 怎么配置切面
@aspect
动态代理,有没有实现过?要继承什么类实现什么方法?
jdk代理:实现InvocationHandler类,实现invoke方法
cglib代理
 
 
 
 
redis 哨兵
1.在Redis安装目录下有一个sentinel.conf文件
2.修改sentinel.conf文件内容
sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.11.128代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.11.128 6379 2
3.启动redis服务和redis哨兵
# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf
 ==========================================================================================================================

TCP、Socket、WebSocket、HTTP区别

传输层:TCP协议,用于建立连接,通过连接的3次握手建立连接,断开的4次挥手。是可靠的连接。

UDP:发送一个数据包,不管发送成功与否。

socket:为 TCP/IP协议族的高级封装API,建Socket连接时,可以指定使用的传输层协议(tcp\udp),端口,地址。

IP是网络层,负责把包从发送端送到接收端,但是,不保证服务(丢、多、改、按序)

WebSocket和Http的异同点

同:

  1. 建立在TCP之上,通过TCP协议来传输数据。
  2. 都是可靠性传输协议。
  3. 都是应用层协议。

异:

  1. WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接
  2. HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

WebSocket和Socket

Socket本身并不是一个协议,它工作在OSI模型会话层,是一个套接字,TCP/IP网络的API,是为了方便大家直接使用更底层协议而存在的一个抽象层。Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。而WebSocket则是一个典型的应用层协议

 

 

 

 

 
 
posted @ 2020-09-16 19:44  K____K  阅读(144)  评论(0编辑  收藏  举报