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

     
     
  • 相关阅读:
    flash put_movie loadmovie 区别
    1.低权限的程序向高权限的程序发消息 2.慎用setcurrentdirectory
    宽字符转窄字符CW2AEX<>(szAreaInfo,CP_UTF8)
    查看内存的方法。vs-调试-窗口-内存
    xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突(当指针访问异常时,应考虑是不是对象未创建)。
    获取文件版本(IE)
    /MD, /MT, /LD (Use Run-Time Library)
    我是一块主板 《转载》
    我是一块声卡 《转载》
    我是一块硬盘 《转载》
  • 原文地址:https://www.cnblogs.com/GotoJava/p/13680985.html
Copyright © 2011-2022 走看看