zoukankan      html  css  js  c++  java
  • 面试知识(一)

    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连接时,可以指定使用的传输层协议(tcpudp),端口,地址。

    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则是一个典型的应用层协议

     
     
  • 相关阅读:
    day 66 ORM django 简介
    day 65 HTTP协议 Web框架的原理 服务器程序和应用程序
    jQuery的事件绑定和解绑 事件委托 轮播实现 jQuery的ajax jQuery补充
    background 超链接导航栏案例 定位
    继承性和层叠性 权重 盒模型 padding(内边距) border(边框) margin 标准文档流 块级元素和行内元素
    属性选择器 伪类选择器 伪元素选择器 浮动
    css的导入方式 基础选择器 高级选择器
    03-body标签中相关标签
    Java使用内存映射实现大文件的上传
    正则表达式
  • 原文地址:https://www.cnblogs.com/GotoJava/p/13680985.html
Copyright © 2011-2022 走看看