2-鹅厂面经

内网穿透原理

内网穿透又称NAT穿透,让NAT之后的节点主动访问一个用有公网IP地址的服务器,并且由中间服务器搭桥,打通经过该服务器从其他主机到NAT之后的隧道;具体的来说服务商会给我们的软件分配一个域名,这个域名不需要备案之类的,因为可能是服务商的二级或者三级域名,当别人访问我们的程序的时候,由于我们的域名是服务商域名的子域名,请求会先到达服务商,服务商通过与我们服务器绑定的传输通道传递给我们的电脑,这就实现了别人可以访问我们的机器

单机情况下Redis分布式锁的实现

通过setIfAbsent占位锁,注意点如下:

  • 需要合理的设置过期时间,以防程序宕机时候的死锁问题
  • 比较和删除锁的操作需要是一个原子操作,使用LUA脚本
  • 为了防止删锁的时候删除别人的锁,设置每一把锁都不同,并且判断锁和删除锁也并非原子操作,需要使用LUA脚本,如果不使用LUA脚本可以使用redis自身事务来解决,如果事务失败,事务队列会为空

Redisson原理

在Redisson中,使用key来作为是否上锁的标志,当通过getLock(String key)方法获得相应的锁之后,这个key即作为一个锁存储到Redis集群中,在接下来如果有其他的线程尝试获取名为key的锁时,便会向集群中进行查询,如果能够查到这个锁并发现相应的value的值不为0,则表示已经有其他线程申请了这个锁同时还没有释放,则当前线程进入阻塞,否则由当前线程获取这个锁并将value值加一,如果是可重入锁的话,则当前线程每获得一个自身线程的锁,就将value的值加一,而每释放一个锁则将value值减一,直到减至0,完全释放这个锁。因为底层是基于分布式的Redis集群,所以Redisson实现了分布式的锁机制

Redis如何完成延迟队列操作

  • 将整个Redis作为消息池,以KV形式存储消息
  • 使用ZSET做优先队列,按照Score维持优先级
  • 使用List结构,以先进先出的方式进行消费
  • ZSET和LIST存储消息地址(对应消息池的每个KEY)
  • 自定义路由对象,存储ZSET和LIST名称,以点对点的方式将消息从ZSET路由到正确的LIST
  • 根据TTL规则实现消息延迟

RPC框架和REST的区别?各自优缺点?

Restful风格通信:简单,直接,开发方便,利用现成的http协议进行传输

RPC框架的好处在于,长连接,没有必要每次通信都向http一样区3次握手挥手,减少了网络开销,RPC框架使用注册中心,有丰富的监控管理,发布,下线接口,动态扩展,对调用方来说是无感知,统一化的操作,并且带有负载均衡功能

MD5?

对于数据的传输安全性:重要数据进行加密操作,md5不可逆,aes可逆,需要注意的是md5不是加密算法而是哈希算法,对于密码这样的字段,我们在数据库存储的时候,应该存储md5加密哈希过的值,这样即使有人得到了整个数据库,也拿不到原来的密码信息,在校验密码的时候,我们使用当时存放在数据库的盐值和md5值,使用用户传入的密码和数据库的盐进行md5运算,对比md5值是否正确

前后端分离后api交互如何保证数据安全?

使用https进行通信

请求签名,防止参数被篡改

身份确认机制,每次请求都要检验是否合法

使用ssl pinning防止抓包操作

对所有的请求和相应都进行加密解密操作:

  • 启动类上增加@EnableEncrypt注解
  • 加密配置,spring.encrypt.key=加密key要求16位
  • Controller注解使用@Encrypt注解
  • 解密操作上需要加上@Decrypt注解

布隆过滤器使用在哪一层?

原生redis不带有布隆过滤器,redis4.0之后支持插件,可以使用布隆过滤器

在Redis前加上布隆过滤器,预先把数据库中的数据加入到布隆过滤器中

RabbitMQ在接入点能有多少个连接?

rabbitmq的文件句柄数设置是1024,连接最多数为829,其具体计算方式为(文件句柄数-100)*0.9-2

如何判断一台机器能有多少个连接数

客户端建立的tcp连接数量受限于可打开的文件数量,linux默认是1024,每个ip可以建立的TCP连接理论受限于ip_local_port_range的参数,也受限于65535(最大端口)

服务端在四次挥手的时候一直没有收到ack

问题大全

服务器因为没有收到ack的回复会重试一段时间,直到服务端重试超时后主动断开,或者等待新的客户端接入后,收到服务端重试的「FIN」消息后,回复「RST」消息,在收到「RST」消息后,复位服务端的状态

Nacos实时配置更新原理

Nacos 客户端会循环请求服务端变更的数据,因此Nacos 客户端能够实时感知到服务端配置发生了变化,请求的超时时间设置为30s,当配置发生变化时,请求的响应会立即返回,否则会一直等到 29.5s+ 之后再返回响应

如果发生了变化,该请求在一个很短的时间就返回了,这是因为服务端在改变了配置信息之后,会直接找到具体客户端请求中的response,然后直接将结果写到response中

硬连接和软连接的区别

  • 定义不同:硬链接是具有相同Inode的文件名,而软连接是链接源文件的文件,实质是快捷键。
  • 限制不同:硬链接只能对已存在的文件进行创建,软连接可以对不存在的文件及目录创建。
  • 影响不同:删除硬链接不影响其它具有相同Inode的文件,删除软连接的快捷方式也不影响,但是删除软连接的源文件,将导致软连接不能运行。

线程崩溃了进程一定崩溃吗

进程与进程之间完全隔离,所以进程a崩了,进程b不会崩

一个进程内所有线程共享同一内存空间,线程与线程之间是没有隔离的,线程的某个行为很有可能会影响到其他的线程

在java里,某个线程抛出异常没有捕获,线程会崩溃,单是对应的进程(JVM虚拟机)并不会随之崩溃.好处是别的线程不受影响,坏处是很难察觉到对应的线程是否已经崩溃

Nginx是多进程还是多线程

Nginx采用的是多进程单线程和多路IO复用模型

多进程之间的通信?

  • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  • 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  • 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
     

待解决的问题:

服务上线后如何不停掉项目修改代码?

es建立索引的效率怎么样?

es文件空间的消耗怎么样?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值