Zuul与Gateway区别
zuul则是netflix公司的项目集成在spring-cloud中使用而已, Gateway是spring-cloud的 一个子项目;
zuul不提供异步支持流控等均由hystrix支持, gateway提供了异步支持,提供了抽象负载均衡,提供了抽象流控; 理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定
两者底层实现都是servlet,但是gateway多嵌套了一层webflux框架
Zuul流程
请求给zuulservlet处理(HttpServlet子类) zuulservlet中有一个zuulRunner对象,该对象中初始化了RequestContext(存储请求的数据),RequestContext被所有的zuulfilter共享;
zuulRunner中有 FilterProcessor(zuulfilter的管理器),其从filterloader 中获取zuulfilter;
有了这些filter之后, zuulservelet执行的Pre-> route-> post 类型的过滤器,如果在执行这些过滤器有错误的时候则会执行error类型的过滤器,执行完后把结果返回给客户端.
其实就是把请求拿到自己的处理器处理,不走默认的,这样可以新增很多功能
Gateway流程
请求到达DispatcherHandler, DispatchHandler在IOC容器初始化时会在容器中实例化HandlerMapping接口
用HandlerMapping根据请求URL匹配到对应的Route,然后有对应的filter做对应的请求转发最终response返回去
zk与eureka区别
zookeeper保证CP(一致性)
eureka保证AP(可用性)
zk在选举期间注册服务瘫痪,期间不可用
eureka各个节点平等关系,只要有一台就可保证服务可用,而查询到的数据可能不是最新的,可以很好应对网络故障导致部分节点失联情况
zk有leader和follower角色,eureka各个节点平等
zk采用半数存活原则(避免脑裂),eureka采用自我保护机制来解决分区问题
eureka & zk
eureka本质是个工程,zk只是一个进程。
zk基于CP,不保证高可用,如果zk正在选主,或者zk集群中半数以上机器不可用,那么将无法获得数据。
Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版(发布新的版本)和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合做注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。
eureka自我保护机制
eureka不移除长时间没收到心跳而应该过期的服务
仍然接受新服务注册和查询请求,但是不会同步到其它节点(高可用)
当网络稳定后,当前实例新注册信息会同步到其它节点(最终一致性)
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是应用层