上面的Netty是啥?
Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。
深入了解:什么是netty--通俗易懂 - 简书
上面的RPC是啥?
RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
深入了解:什么是RPC? - 简书
上面的Rest风格是啥?
URL中只使用名词来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。
深入了解:什么是REST风格? 什么是RESTFUL?(一篇全读懂)_seniorShen的博客-CSDN博客_rest风格和restful风格
负载平衡的意义什么?
负载平衡的意义什么?
负载均衡的意义是是用来避免单一应用由于并发等原因,导致应用宕机从而让系统整体无法使用,使用负载均衡能够实现服务的高可用、高并发,还可以提高数据处理能力和增加吞吐量
什么是负载平衡?
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如现在有大量请求进来,如果没有负载均衡那就都由一个应用服务来处理这些请求,可能因为请求量太大导致服务崩溃,通过负载均衡就可以把这些请求分发给各个服务来进行处理,从而协同完成工作任务。
项目中的使用?
负载均衡很出色的就是nginx,在我们项目中,服务的接入层由nginx管理,用户请求经过nginx之后,根据相应的域名,转发到对应的服务器去,由于nginx只负责请求转发,没有业务逻辑处理,所以效率上非常高。
nginx的负载均衡策略
nginx支持的负载均衡策略有很多,我们在nginx.conf中配置upstream模块即可。
轮训,默认的就是这种方式,就是一个个来,每个服务器轮流处理一个请求
权重的方式,就是根据服务器的性能,配置较大的权重,nginx就会分配更多的请求
iphash的方式,nginx会根据请求的ip地址,经过那个hash运算得到一个hash值,然后分配相应的服务器
最少连接数,把请求转发给连接数较少的后端服务器
微服务中的体现
在微服务架构中,feign和zuul都集成了ribbon的的功能,它是负责在微服务之间相互调用的时候,帮我们实现负载均衡的功能,我们在将微服务注册到注册中心时,如果服务名称一致,就默认为一个集群,在进行远程调用或者路由转发的时候,都可以均衡的访问响应的服务器,ribbon的负载均衡机制有轮训和随机,默认是轮训,当然也可以自定义负载均衡的策略。
什么是 Hystrix?它如何实现容错?
提到Hystrix就不得不提一个东西叫“雪崩效应”
什么是“雪崩效应”?
服务雪崩效应是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象
上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了。这时候就出现了Hystrix,他的作用就是:避免了单个调用的微服务导致全局”雪崩”。
什么是Hystrix断路器?
Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟、异常,引起资源耗尽导致系统不可用的解决方案,在分布式系统,各个服务相互调用相互依赖,必然会有部分系统的调用会失败,这就很容易引起服务雪崩,而Hystrix 通过分离服务的调用点,阻止错误在各个服务的传播,并且提供了错误回调机制,这一系列的措施提高了系统的整体服务弹性。
Hystrix断路器就像我们家庭电路中的断容器,当家庭电压过大时就好自己烧断保险丝,而断路器就是一旦后端服务不可用,断路器会直接切断请求链,避免发送大量无效请求影晌系统吞吐量,并且断路器有自我检测并恢复的能力。
Hystrix断路器有三种状态
断路器有完全打开状态:一段时间内达到一定的次数无法调用 并且多次监测没有恢复的迹象断路器完全打开那么下次所有请求就不会请求到该服务
半开:短时间内有恢复迹象断路器会将部分请求发给该服务
关闭:当服务一直处于正常状态能正常调用
为什么需要Hystrix断路器功能
在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用。为了保证其高可用,单个服务又必须集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用, 如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络请求涌入,会形成任务累积,导致服务瘫痪,甚至导致服务“雪崩”。为了解决这个问题,就出现断路器模型。
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等, Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
Hystrix断路器机制
当Hystrix Command请求后端服务失败数量超过一 定比例(默认50%),断路器会切换到完全打开状态(Open)。这时所有请求会直接失败而不会发送到后端服务。断路器保持在完全打开状态一段时间后(默认5秒),自动切换到半开状态(HALF-OPEN)。这时会判断下一次请求的返回情况,如果请求成功,断路器切到关闭状态 (CLOSED),否则重新切换到完全打开状态(OPEN)。
Fallback(回退机制的逻辑): Fallback相当于是降级操作。对于查询操作,我们可以实现一个fallback方法,当请求后端服务出现异常的时候,可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存。
它如何实现容错?
Hystrix主要通过以下几点实现延迟和容错。
包裹请求:使用HystrixCommand包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用了设计模式中的“命令模式”。(这里的依赖是指的一个服务调用其他服务,那这个服务就依赖其他的服务)
跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix就会跳闸,停止请求该服务一段时间。
资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。
监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。
自我修复:断路器打开一段时间后,会自动进入“半开”状态。
骚戴理解:说白了就是当其中的某个服务出错了,那么如果还有大量的请求进来就会直接被拒绝,也就是不会调用这个出错了的服务,然后直接返回一个默认的错误值,告诉调用这个服务的服务这个服务出了问题,现在不可用,而不是让大量的请求一直在等待这个出错了的服务来处理这些请求,因为如果一直等待的话就很容易出现服务雪崩
什么是 Netflix Feign?它的优点是什么?
什么是 Netflix Feign?
考虑到Spring Cloud的服务治理组件也是基于HTTP的,因此特别需要一款简化服务调用的组件。Feign的出现就是为了解决这个问题,我们可以借助Feign的代理机制,像调用一个接口方法一样发起远程HTTP调用来进行服务之间的通信。简单来说就是用来实现各个微服务直接的通信的,说白了就是各个微服务之间的调用要通过Feign来实现
它的优点是什么?
- feign采用的是基于接口的注解
- feign整合了ribbon,具有负载均衡的能力
- 整合了Hystrix,具有熔断的能力
什么是 Spring Cloud Bus?我们需要它吗?
什么是 Spring Cloud Bus?
用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置。它承担了批量通知和推送配置变更的工作,而且我们可以通过扩展Bus的事件,实现“消息广播”的应用场景。
我们需要它吗?
Spring Cloud Bus 提供了跨多个实例刷新配置的功能。只要我们修改了某个模块的配置,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新。
简单来说就是可以动态的刷新配置内容,只要修改了某个配置文件,其他的所依赖它的配置文件就都会动态刷新
了解分布式系统吗?说说你的理解
1、什么是分布式?
在讲什么是分布式之前应该知道什么是微服务?微服务就是将一个大的服务拆分成几十个甚至上百个微小的服务,每个服务都可以独立运行。分布式不是一种技术,分布式是一种方案,分布式就是在微服务的基础上,可以允许把这些拆分的微服务放到不同的电脑上去运行,分布在不同的地方的电脑上运行都可以,微服务是分布式系统的一种具体落地方案。
2、优点
系统可用性提升
传统的集中式计算或集中式存储在遇见单点故障时很容易造成整个服务不可用,分布式下的服务体系,单台机器有故障,不致于造成整个服务不可用。
系统并发能力提升
请求通过 Nginx 负载均衡被分发到不同的服务器上,运行同样代码的服务器可以有 1 台或 N 台,通常情况下会根据实际用户访问量随时增加机器,无论是数据库或者服务,都可以做到随时水平扩展。
比如双 11 活动,平时订单少 50 台机器就够了,到了 11 订单量剧增,服务器增加到 100 台,每台机器之间相互独立,互不影响。
系统容错能力提升
同一组服务分别部署在北京上海杭州,杭州的机房突发断电或者火灾,杭州机房的流量会被自动分发到北京和上海的机房,不影响用户使用。
低延迟
参考上一个图,北京的用户请求自动分发到北京,上海的用户请求被分发到上海,服务器会根据用户的 IP 选择距离自己最近的机房,降低网络延迟。
3、缺点
分布式服务依赖网络
服务器间通讯依赖网络,不可靠网络包括网络延时,丢包、中断、异步,一个完整的服务请求依赖一连串服务调用,任意一个服务节点网络出现问题,都可能造成本次请求失败。
维护成本高
传统单体式服务只需要维护一个站点就可以。
分布式服务系统被拆分成若干个小服务,服务从 1 变为几十个上百个服务后,增加运维成本。
一致性,可用性,分区容错性无法同时满足
这个是最主要的,这三种特性就是平时说的 CAP 定理,在分布式系统中,这三种特性最多只能满足两种,无法同时满足,需要根据实际情况去调整牺牲掉其中哪个。
CAP 定理
CAP 理论告诉我们,一个分布式系统不可能同时满足一致性(C:Consistency),可用性(A: Availability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的2个。
假设有一个系统如下:
整个系统由两个节点配合组成,之间通过网络通信,当节点 A 进行更新数据库操作的时候,需要同时更新节点 B 的数据库(这是一个原子的操作)。
上面这个系统怎么满足 CAP 呢?C:当节点A更新的时候,节点B也要更新,A:必须保证两个节点都是可用的,P:当节点 A,B 出现了网络分区,必须保证对外可用。
可见,根本完成不了,只要出现了网络分区,A 就无法满足,因为节点 A 根本连接不上节点 B。如果强行满足 C 原子性,就必须停止服务运行,从而放弃可用性 C。
所以,最多满足两个条件: