New 构建你的护城河   登录后该广告会消失
有些知识点不太好归类,就放到这里
IT面试
599 ·
0 ·
2023-02-08 16:48:40
最新编辑原因:

Zuul与Gateway区别

  1. zuul则是netflix公司的项目集成在spring-cloud中使用而已, Gateway是spring-cloud的 一个子项目;

  2. zuul不提供异步支持流控等均由hystrix支持, gateway提供了异步支持,提供了抽象负载均衡,提供了抽象流控; 理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定

  3. 两者底层实现都是servlet,但是gateway多嵌套了一层webflux框架

Zuul流程

  1. 请求给zuulservlet处理(HttpServlet子类) zuulservlet中有一个zuulRunner对象,该对象中初始化了RequestContext(存储请求的数据),RequestContext被所有的zuulfilter共享;

  2. zuulRunner中有 FilterProcessor(zuulfilter的管理器),其从filterloader 中获取zuulfilter;

  3. 有了这些filter之后, zuulservelet执行的Pre-> route-> post 类型的过滤器,如果在执行这些过滤器有错误的时候则会执行error类型的过滤器,执行完后把结果返回给客户端.

其实就是把请求拿到自己的处理器处理,不走默认的,这样可以新增很多功能

Gateway流程

  1. 请求到达DispatcherHandler, DispatchHandler在IOC容器初始化时会在容器中实例化HandlerMapping接口

  2. 用HandlerMapping根据请求URL匹配到对应的Route,然后有对应的filter做对应的请求转发最终response返回去

zk与eureka区别

  1. zookeeper保证CP(一致性)

  2. eureka保证AP(可用性)

  3. zk在选举期间注册服务瘫痪,期间不可用

  4. eureka各个节点平等关系,只要有一台就可保证服务可用,而查询到的数据可能不是最新的,可以很好应对网络故障导致部分节点失联情况

  5. zk有leader和follower角色,eureka各个节点平等

  6. zk采用半数存活原则(避免脑裂),eureka采用自我保护机制来解决分区问题

eureka & zk

eureka本质是个工程,zk只是一个进程。
zk基于CP,不保证高可用,如果zk正在选主,或者zk集群中半数以上机器不可用,那么将无法获得数据。
Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版(发布新的版本)和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合做注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。

eureka自我保护机制

  1. eureka不移除长时间没收到心跳而应该过期的服务

  2. 仍然接受新服务注册和查询请求,但是不会同步到其它节点(高可用)

  3. 当网络稳定后,当前实例新注册信息会同步到其它节点(最终一致性)

 

Hystrix原理

通过维护一个自己的线程池,当线程池达到阈值的时候,就启动服务降级,返回fallback默认值

为什么需要hystrix熔断

防止雪崩,及时释放资源,防止系统发生更多的额级联故障,需要对故障和延迟进行隔离,防止单个依赖关系的失败影响整个应用程序;

微服务优缺点

  • 每个服务高内聚,松耦合,面向接口编程

  • 服务间通信成本,数据一致性,多服务运维难度增加,http传输效率不如rpc

StringBuilder与StringBuffer

StringBuilder 更快; StringBuffer是线程安全的

interrupt/isInterrupted/interrupt区别

  • interrupt() 调用该方法的线程的状态为将被置为"中断"状态(set操作)

  • isinterrupted() 是作用于调用该方法的线程对象所对应的线程的中断信号是true还是false(get操作)。例如我们可以在A线程中去调用B线程对象的isInterrupted方法,查看的是A

  • interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),并且会重置当前线程的中断状态(getandset)

sleep()与wait()区别

sleep()属于线程类,wait()属于object类;sleep()不释放锁

CountDownLatch和CyclicBarrier区别

  • CountDownLatch用于主线程等待其他子线程任务都执行完毕后再执行,CyclicBarrier用于一组线程相互等待大家都达到某个状态后,再同时执行;

  • CountDownLatch是不可重用的,CyclicBarrier可重用

终止线程方法

  • 使用退出标志,说线程正常退出

  • 通过判断this.interrupted() throw new InterruptedException()来停止 使用String常量池作为锁对象会导致两个线程持有相同的锁,另一个线程不执行,改用其他如new Object()

TCP三次握手

建立起一个TCP连接需要经过“三次握手”:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

TCP和HTTP的区别

HTTP协议是建立在TCP协议之上的一种应用。
TCP是传输层;http是应用层


本作品系原创,采用《署名-非商业性使用-禁止演绎4.0 国际》许可协议.转载请说明出处
本文链接:https://www.upupor.com/u/MRWmbB3 复制

无内容

推荐阅读