天天看点

艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统

艰难的秋招之路(Java综合面经(分布式与微服务和操作系统))

  • 写在前面
  • 一、分布式与微服务
      • 1.谈谈你对微服务的理解
      • 2.负载均衡策略有哪几种方式
      • 3.SOA和微服务的区别
      • 4.如何实现分布式锁
      • 5.限流的算法有哪些?
      • 6.CAP理论和base定理
      • 7.了解RPC吗?有哪些常见的 RPC 框架?如果让你自己设计 RPC 框架你会如何设计?
      • 8.为什么要网关?你知道有哪些常见的网关系统?
      • 9.为什么要分布式 id ?分布式 id 生成策略有哪些?
      • 10.服务熔断和服务降级的区别
      • 11.分布式系统需要考虑哪些问题
      • 12.你的系统你会从哪些方面考虑去优化
      • 13.你的服务挂了怎么处理
      • 14.服务注册中心的工作流程
  • 操作系统
      • 1.线程和进程的区别 (协程)
      • 2.进程的调度算法
      • 3.虚拟内存解决了什么问题?(分页,分段,段页的区别)
      • 4.操作系统的作用和功能
      • 5.死锁的定义以及如何避免死锁(银行家算法)
      • 6.进程的通信方式(实现原理,具体应用场景)
      • 7.线程的七态模型
      • 8. 进程间同步与互斥的区别,线程同步的方式
      • 9.动态链接库与静态链接库的区别
      • 10.linux的各种IO模型?(重点掌握epoll,底层结构红黑树 + 链表,能够说出为什么在管理数百万连接的过程效率还好,以及ET模式和LT模式)
      • 11.内核态和用户态的区别以及转换?(什么情况会转化:中断,各种中断进行分类)
      • 12.linux底层的零拷贝技术(经历4次 ->3次 ->2次拷贝的优化历程)
      • 13.操作系统大内核和微内核之间的区别以及各自的好处?
      • 14.僵尸进程和孤儿进程产生的原因以及解决方式?
      • 15.操作系统的各自调度方式

写在前面

这是我校招面经系列第3部曲,关于Java高级部分的分布式与微服务。之前介绍过的计网和Java基础以及数据库和框架都可以结合的看下。如有错误或者有新的问题,欢迎留言或私信。

一、分布式与微服务

1.谈谈你对微服务的理解

微服务在近几年大火,它具备了灵活部署、可扩展、技术异构等优点,但同时也带来了开发、运维的复杂性。是否要采用微服务架构需要根据系统的特点,结合企业的组织架构、团队能力等多个方面进行综合的判断,而不是为了微服务而微服务。自己瞎吹吧。

2.负载均衡策略有哪几种方式

  1. 轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

  2. 指定权重

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

  3. IP绑定 ip_hash

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

  4. fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  5. url_hash(第三方)

    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

3.SOA和微服务的区别

  • 微服务剔除SOA中复杂的ESB企业服务总线,所有的业务智能逻辑在服务内部处理,使用Http(Rest API)进行轻量化通讯
  • SOA强调按水平架构划分为:前、后端、数据库、测试等,微服务强调按垂直架构划分,按业务能力划分,每个服务完成一种特定的功能,服务即产品
  • SOA将组件以library的方式和应用部署在同一个进程中运行,微服务则是各个服务独立运行。
  • 传统应用倾向于使用统一的技术平台来解决所有问题,微服务可以针对不同业务特征选择不同技术平台,去中心统一化,发挥各种技术平台的特长。
  • SOA架构强调的是异构系统之间的通信和解耦合;(一种粗粒度、松耦合的服务架构)
  • 微服务架构强调的是系统按业务边界做细粒度的拆分和部署。

4.如何实现分布式锁

  • 数据库实现分布式锁
  • Redis实现分布式锁
  • Zookeeper实现分布式锁

5.限流的算法有哪些?

  1. 固定窗口计数器算法
    艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统
  2. 滑动窗口计数器
    艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统
  3. 漏桶
    艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统
  4. 令牌桶
    艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统

6.CAP理论和base定理

一个分布式系统在(C)(强)一致性、(A)可用性、(p)分区容错性,这三个只能同时满足两个。

BASE理论是Basically Available(基本可用),Soft State(软状态)和Eventually Consistent(最终一致性)三个短语的缩写。

既是无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。

7.了解RPC吗?有哪些常见的 RPC 框架?如果让你自己设计 RPC 框架你会如何设计?

艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统

常见RPC框架:Dubbo,gRPC,thrift,Hessian.

一个典型的使用 RPC 的场景如下,一般情况下 RPC 框架不仅要提供服务发现功能,还要提供负载均衡、容错等功能,这个的 RPC 框架才算真正合格。

艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统
  1. 注册中心首先是要有的,推荐使用 Zookeeper。注册中心主要用来保存相关的信息比如远程方法的地址。
  2. 既然要要互相调用方法就要发请求,推荐nio 的 netty框架。
  3. 发请求发送什么数据呢?我们就要考虑序列化协议了。
  4. 另外,动态代理也是需要的。因为 RPC 的主要目的就是让我们调用远程方法像调用本地方法一样简单,使用动态代理屏蔽远程接口调用的细节比如网络传输。
  5. 负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题,我们从负载均衡的这四个字就能明显感受到它的意义。。

8.为什么要网关?你知道有哪些常见的网关系统?

微服务下一个系统被拆分为多个服务,但是像 安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。

综上:一般情况下,网关一般都会提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、容灾、日志、监控这些功能。

上面介绍了这么多功能实际上网关主要做了一件事情:请求过滤 。权限校验、流量控制这些都可以通过过滤器实现,请求转也是通过过滤器实现的。

常见的网关系统:1. Kong 2. Netflix zuul 3.gateway

9.为什么要分布式 id ?分布式 id 生成策略有哪些?

ID是数据的唯一标识,传统的做法是利用UUID和数据库的自增ID,在互联网企业中,大部分公司使用的都是Mysql,并且因为需要事务支持,所以通常会使用Innodb存储引擎,UUID太长以及无序,所以并不适合在Innodb中来作为主键,自增ID比较合适,但是随着公司的业务发展,数据量将越来越大,需要对数据进行分表,而分表后,每个表中的数据都会按自己的节奏进行自增,很有可能出现ID冲突。这时就需要一个单独的机制来负责生成唯一ID,生成出来的ID也可以叫做分布式ID,或全局ID。

艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统

10.服务熔断和服务降级的区别

相似性:

  1. 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
  2. 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
  3. 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
  4. 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段;

不同点:

  1. 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
  2. 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)

11.分布式系统需要考虑哪些问题

12.你的系统你会从哪些方面考虑去优化

  1. 扩容。增加Nginx,Tomcat等应用服务器的个数,或者物理服务器个数,加大服务器带宽
  2. 调优。Mysql调优,增加Redis,消息队列等缓存技术,代码调优,比如重构,工厂等。

我就知道这些,欢迎补充。

13.你的服务挂了怎么处理

14.服务注册中心的工作流程

操作系统

1.线程和进程的区别 (协程)

2.进程的调度算法

  1. 先来先去服务
  2. 时间片轮转法
  3. 多级反馈队列算法
  4. 最短进程优先
  5. 最短剩余时间优先
  6. 最高响应比优先
  7. 多级反馈队列调度算法

3.虚拟内存解决了什么问题?(分页,分段,段页的区别)

4.操作系统的作用和功能

5.死锁的定义以及如何避免死锁(银行家算法)

死锁产生的4个必要条件:

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件: 若干进程间形成首尾相接循环等待资源的关系。

6.进程的通信方式(实现原理,具体应用场景)

  1. 文件和记录锁定。
  2. 管道。
  3. FIFO。
  4. 消息队列。
  5. 信号灯。
  6. 共享内存。

7.线程的七态模型

艰难的校招之路(Java综合面经系列三)写在前面一、分布式与微服务操作系统

8. 进程间同步与互斥的区别,线程同步的方式

9.动态链接库与静态链接库的区别

10.linux的各种IO模型?(重点掌握epoll,底层结构红黑树 + 链表,能够说出为什么在管理数百万连接的过程效率还好,以及ET模式和LT模式)

11.内核态和用户态的区别以及转换?(什么情况会转化:中断,各种中断进行分类)

12.linux底层的零拷贝技术(经历4次 ->3次 ->2次拷贝的优化历程)

13.操作系统大内核和微内核之间的区别以及各自的好处?

14.僵尸进程和孤儿进程产生的原因以及解决方式?

15.操作系统的各自调度方式