目录
2.1、什么是微服务,单体架构的优点和缺点,微服务架构的优点和缺点?
2.4、什么是网关,网关和api层有什么区别,为什么要新增一个api层?
2.5、微服务网关的几个重要的作用,网关和nginx的区别?
一、缓存相关问题
1,什么是缓存穿透,缓存穿透带来的问题,如何解决缓存穿透?
缓存穿透是指在使用缓存的过程中,出现无法命中缓存的情况。具体来说,指的是某个请求在缓存中不存在,但是在数据库中也不存在的情况。因此,这个请求会占用服务器等资源,直到超时,导致系统性能下降甚至宕机。
缓存穿透带来的问题包括:
-
大量的请求直接命中数据库,导致数据库宕机
-
占用过多的系统资源
-
延长响应时间,影响用户体验
解决缓存穿透的方法有以下几种:
-
在缓存中添加空对象,用来标识请求无效的情况
-
对请求参数加密,在缓存中存储加密后的结果,无效请求则不会命中缓存
-
设置定时清空缓存,以避免失效数据长时间占用缓存资源
-
使用布隆过滤器等数据结构,对请求进行过滤,减少对数据库的直接访问。
2,什么是缓存击穿,缓存击穿带来的问题,如何解决缓存击穿?
缓存击穿是指某个热点数据在缓存中过期或者被删除时,大量并发请求同时访问这个数据,导致缓存失效,请求直接落到数据库上,占用大量系统资源,导致系统性能下降甚至宕机的情况。
缓存击穿带来的问题包括:
-
数据库承受大量请求,压力过大而宕机,导致系统不可用
-
缓存命中率降低,导致系统性能下降
-
延长响应时间,影响用户体验
解决缓存击穿的方法有以下几种:
-
对热点数据设置更长的过期时间,或者添加定时刷新机制,避免同时过期
-
使用分布式锁,避免多个线程同时进行对数据库的访问
-
使用互斥锁,或者从缓存中访问数据时判断是否为空并加锁,再进行数据库查询,在加锁期间,其他线程如果访问到了该数据,会等待该线程完成后再进行访问
-
使用缓存预热机制,提前把一些热点数据加载到缓存中,降低缓存击穿的频率
-
在数据查询时加入空对象或默认值,防止缓存穿透,并且避免大量请求同时访问数据库。
3,什么是缓存雪崩,缓存雪崩带来的问题,如何解决缓存雪崩?
缓存雪崩是指缓存中的大量数据同时过期或者失效,在高并发的情况下,大量请求同时访问数据库,导致系统瞬间承受巨大的访问压力,甚至直接宕机的情况。
缓存雪崩带来的问题包括:
-
大量请求压垮数据库,导致系统不可用
-
业务受到严重影响,用户无法正常访问系统
-
数据丢失,导致系统出现数据一致性问题
解决缓存雪崩的方法有以下几种:
-
对缓存数据的过期时间进行随机化或是加入定时刷新机制,避免大量数据同时失效
-
使用缓存高可用方案,比如redis-cluster、redission等,避免单机器崩溃或网络故障导致整个缓存数据丢失
-
针对重要的数据进行冷备,保证在数据丢失时可以快速进行恢复
-
数据库承受不住请求压力时,可以通过增加数据库并发能力、缓存预热机制等方式避免大量请求打到数据库。另外,可以加入随机因子,减少缓存雪崩的同时,也为数据的负载均衡提供一定缓冲
-
对于不同的业务系统,根据业务特点采取不同的缓存策略,以保证系统对缓存的使用安全可靠。
二、微服务架构的相关问题
2.1、什么是微服务,单体架构的优点和缺点,微服务架构的优点和缺点?
微服务是一种架构风格,它将一个大型的应用程序分为多个小型服务,每个服务独立运行、独立部署、独立维护,服务间通过轻量级的通信机制进行通信,实现高可用、高可扩展、高并发、松耦合的软件系统。
单体架构的优点包括:
-
学习成本低,易于开发和维护
-
代码规模小,开发、测试、部署、运维相对简单
-
实现功能集中化,对于小规模的系统适用
-
数据交互简单,通信效率高
-
执行效率高,相对简单的设计能够提供良好的性能
单体架构的缺点包括:
-
可扩展性差,难以应对高并发量和无限制的扩展需求
-
单点故障,一旦系统出现故障,可能导致整个系统瘫痪
-
开发、测试、部署和维护的复杂度增加,代码膨胀、模块耦合、功能臃肿
-
系统销毁重建的成本高,影响项目的整体发展
微服务架构的优点包括:
-
微服务之间高度解耦,容易开发、维护和扩展
-
每个微服务独立运行、独立部署、独立维护,可以大大提高系统的可用性和可扩展性
-
可以指定最佳工具、技术和语言去实现,更大程度上发挥各个人员的专业技能优势
-
可以采用微服务方式提供对外接口,实现跨平台、多语言的开发
-
可以针对不同服务进行容器化,使系统管理更加灵活
微服务架构的缺点包括:
-
微服务之间的网络通信成本较大,需要相应的高效通信方案
-
微服务的数量增多会导致管理复杂
-
服务可复用性不高,存在大量代码重复或微服务之间的耦合问题
-
需要增加负载均衡、服务发现和网关等复杂的架构技术
-
对部署、测试和维护的工作提出更高要求
2.2、分布式和微服务的区别。
分布式:分散部署
微服务:分散能力
分布式系统是由多个独立的计算机节点组成的系统,这些节点通过网络互相通信和协调,以共同完成一项任务。分布式系统可以提供更高的可靠性、可扩展性和灵活性,但也面临着一些挑战,如节点之间的通信延迟、数据同步问题等。
微服务是一种架构风格,通过将应用程序拆分成一系列小型服务来实现。每个服务都是独立的,它们可以相互协作来完成一个大型系统的功能。微服务采用松耦合的架构,并使用轻量级通信机制如RESTful API来实现服务之间的交互。微服务的优势在于能够提高系统的可伸缩性、灵活性和可维护性。
2.3、微服务之间通讯的几种方式?有哪些优缺点?
1,RPC:远程调用(dubbo协议)
优点:相比于http调用,性能更高,因为少了一步序列化操作,还有就是因为http协议太重了,他有请求头,请求体...
缺点:架构复杂,需要引入注册中心。每个服务启动的时候都会将自己暴露的远程调用接口告诉注册中心。
2,MQ:消息队列
优点:解耦,异步,削峰
缺点:分布式事务问题显得尤为突出,因为相比于同步调用方式,如果被调用方报错了,调用方感知不到。
2.4、什么是网关,网关和api层有什么区别,为什么要新增一个api层?
网关(Gateway)是一种通过网络连接不同系统和服务的统一入口和出口点。网关可以在不同协议、不同网络和不同计算机之间传递数据,可以进行协议转换、安全认证、负载均衡、缓存数据等多种功能。
API层是指应用程序的接口层,位于应用程序的业务逻辑层之上,负责处理外部请求,完成请求的相应处理,最终将结果返回给请求方。API层通常遵循某个标准协议,如HTTP协议、SOAP协议等。
网关和API层的区别在于网关通常位于服务架构的边缘,对外提供服务,充当着统一入口和出口点的角色,而API层则是服务架构内部的逻辑处理层。
为什么要新增一个API层呢?API层可以将业务逻辑与网络通讯进行解耦,使得业务逻辑更易于维护和扩展,同时也方便各个服务之间的调用。而网关则可以作为API层的保护层,完成请求的鉴权、负载均衡等功能。所以,新增一个API层可以提高系统的灵活性、可扩展性和安全性。
2.5、微服务网关的几个重要的作用,网关和nginx的区别?
网关作为微服务架构中的一个组件,具有以下几个重要的作用:
-
统一鉴权和认证:网关可以对访问的客户端进行身份验证和鉴权,保证只有授权访问的用户能够访问业务系统,增强了系统的安全性。
-
负载均衡:网关可以根据配置的负载均衡策略将请求分发到不同的服务实例中,避免某个实例被过度访问,提高了系统的可用性和性能。
-
熔断和限流:网关可以对流量进行限制和限流,避免服务因请求量过大而发生雪崩效应,并能够自动降级和恢复。
-
消息转发和转换:网关可以将不同协议和格式的消息转换为服务端可识别的格式,减少了服务之间的调用复杂度。
与 Nginx 相比,网关是一种更加专业化和定制化的反向代理服务器,在微服务架构中可以充当统一的 API 网关和服务端负载均衡器。相比而言,Nginx 不是专为服务治理而设计的,它的定位更多是静态内容分发和负载均衡。但是,Nginx 的并发处理量和性能比较高,可以应对大规模的流量。
2.6、网关和zookeeper区别?
网关和 Zookeeper 都是微服务架构中的关键组件,但是它们的职责和作用有所不同。
网关主要负责微服务架构中的 API 网关管理,包括请求的路由,负载均衡和限流等,主要侧重于客户端和后端微服务之间的通信管理。
ZooKeeper 是一个分布式协调服务,它主要负责微服务架构中的配置管理、服务注册和发现、分布式锁等,主要侧重于后端微服务之间的通信管理。Zookeeper 提供了一个分布式协调服务,以在分布式系统中进行应用程序协作和配置管理,可以让客户端快速找到服务的提供者,支持负载均衡和故障转移等高可用的功能。
需要注意的是,ZooKeeper 提供了一些 API,可以在应用程序中使用,但它不是像网关那样作为中间层来管理微服务架构的 API 路由和流量控制。
因此,网关主要是负责微服务间的 API 管理,而ZooKeeper 则是负责微服务间的协同与配置管理。两者都是微服务架构中不可少的组件,而且它们的功能互不重叠,可以配合使用来构建高可用、可靠、可扩展的微服务架构。
2.7、nginx几种常见的负载均衡策略。
-
按权重进行负载均衡策略:根据每个后端服务器的权重值决定分配的请求比重,分配满足权重比例的请求流量。权重高的服务器分配的请求量较多,而权重低的服务器分配的请求较少。
-
IP hash 负载均衡策略:该方式是根据请求来源客户端的 IP 地址进行哈希计算,将同一客户端的请求始终分发到同一台后端服务器上,保持会话一致性。
-
轮询负载均衡策略:请求依次按顺序分配到每个后端服务器,循环进行分配,实现简单,适合稳定的请求量。
-
随机负载均衡策略:根据后端服务器的数量,以均匀的随机权重分配请求,实现多样化的请求分配。