1、集群
一组共同工作的服务群体,每个服务实体都具有完整的业务功能
特性:可扩展性:新的业务可动态添加到集群中。
高可用性:一个服务实体挂了,还有其他服务实体替代。
2、负载均衡
根据算法把请求分发给不同的服务器,从而获得高可用性和较好的性能。
3、分布式
将不同的业务分布在不同的服务实体上,每个服务实体都是不同的功能,所有的服务实体的功能组合起来形成一个完整的功能。一个服务实体挂了,整个业务就挂了。
4、集群和分布式
分布式:降低系统间的耦合度,提高服务服用性和效率
集群:提高服务器处理能力,高并发、高可用
5、微服务
把一个完整的系统分成多个子系统,每个子系统都有自己的独立功能和进程,这些子系统之间通过http或者RPC协议通信,不同子系统可以选择不同的编程语言,每个子系统都可以由自己独立的数据库。
6、spring cloud常用组件
Eureka:管理微服务的通信地址,通过服务名调用服务。
Ribbon、Fegin:都是客户端的负载均衡。在服务发生调用的时候,将请求按照某种算法发送到多个目标服务器上。
Hystrix:熔断器。解决微服务故障问题,当请求需要多个微服务完成时,其中某个服务器发生故障,导致整个服务器出现故障,此时通过熔断器进行服务降级,并返回兜底数据。
Zuul、getway:微服务网关。所有请求都经过Zuul转发到目标服务。他可以做一些用户鉴权,请求监控
Config:分布式配置,管理服务的配置文件。
7、服务注册
微服务客户端将自己的IP、port等信息发送到注册中心保存起来。后期访问就根据ip、端口号访问。
8、服务发现
微服务客户端会定期(30s)向注册中心拉取他的地址列表缓存到本地。当发起调用时就可以根据这个地址列表寻找目标地址发送请求。
9、服务续约
微服务客户端每隔一段时间向注册中心发送心跳请求,代表我还活着。当在规定时间(3次机会,每次30s)内没有发送请求,注册中心就会立马删除此服务地址信息。
10、如果服务挂了,注册中心要等到90s后剔除,那么在剔除前这段时间,挂掉的服务有可能还是会被调用,怎么处理
1、修改注册中心的剔除服务器时间间隔,加快服务续约的心跳请求频率
2、使用hystrix的熔断降级机制,当服务不能访问,则返回兜底数据。
3、重试
11、服务发现和服务续约每隔30s做一次请求实现技术。
通过ThreadPoolExecutor线程池的scheduler定时任务实现
服务发现是先判断是否开启了服务发现功能(默认开启),获取定时任务的间隔时间(30s),然后初始化服务发现的定时任务,时间间隔可以在配置文件中修改。
服务续约是先判断是否开启服务注册(默认开启),获取定时任务时间间隔(30s),然后初始化心跳请求的定时任务,时间间隔可以在配置文件中修改。
12、Ribbon是什么,Ribbon的工作原理
提供客户端负载均衡算法,可以通过负载均衡算法向多个服务发起调用。
原理:在一个服务节点做了集群后,其他服务节点调用此服务时,会根据服务名找到多个端口,此时ribbon通过负载均衡算法向多个端口中的一个发送请求
13、Ribbon负载均衡算法,配置方法
算法:RoundRobinRuoe:轮询
AvailabilityFilteringRule:忽略短路、并发高的服务器
WeightedResponseTimeRule:权重,性能高的服务器会多接收请求
ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择
BestAvailableRule:忽略短路服务器,选择并发低的服务器
RandomRule:随机可用
Retry:重试机制的选择逻辑
配置方法:在启动类中注册Bean,以算法为类型写个类
14、OpenFiegn的工作流程
当程序启动时,使用了@FeignClient注解的接口会被扫描到交给spring容器管理。
发送请求时,会使用JDK动态代理,并为每个方法生成相应的RequestTemplate,同时封装http信息,包括URL和请求参数。
最后由RequestTemplate生成request请求,使用ribbon的负载均衡发起调用。
15、为什么Fegin的客户端接口没有写实现类也可以直接被依赖注入
首先导入feign的依赖,在启动类中打了@EnableFeignClients注解开启feign。同时也在feign的客户端接口上打了注解@FeignClient。当程序启动时,这些打了FeignClient的接口会交给Spring管理。发送请求时,会通过JDK动态代理代理接口,生成对应的RequsetTemplate,Feign会对每个方法生成对应的RequesTemplate,同时封装好http信息。最终RequestTemplate生成request请求,交给http客户端,然后http客户端交给Load BalancerClient,使用ribbon发起调用。
16、Hytrix
熔断器,为了不影响整个系统业务,将出现故障的服务通过熔断、降级等方式隔离。
17、熔断、降级概念
熔断:某个服务出现不能访问、调用超时等情况时,就会触发熔断机制,配合降级返回兜底数据,解决长时间等待造成的请求阻塞、避免返回错误信息给客户端。
降级:当服务出现故障不能正常运作时,有请求到达就会給此请求放回已经设置好的数据。
18、资源隔离
限制分布式服务的资源使用,将服务的提供者隔离,一个服务失败或延时,不会导致整个系统失败,同时也能控制调节服务的并发。
19、资源隔离:信号量和线程池的区别
线程池:使用线程池存储请求,线程池对请求做处理,设置任务返回超时时间。堆积的请求则会进入线程池队列中,为每个依赖服务申请线程池有一定资源消耗,但能面对高并发。
信号量:使用原子计数器记录当前线程数,当请求进行时原子计数器加一,处理完成减一请求来时判断线程数是否超过最大线程数,超过就丢弃请求。无法应对突然的高并发数。
20、CAP理论,Eureka选择的是AP还是CP
CAP:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。在分布式中,网络是不可控的,首先要保证P,然后再A、C之间做选择。
Euraka选择了AP保证了可用性降低了一致性。
21、Eureka的自我保护
EurakaServer接收到服务续约的心跳失败比例在15分钟之内低于85%,EurekaServer就会把这些服务保护起来,不会把这些服务从地址列表踢出,但是用户可能请求这些服务时出现不可用等情况,这时需要配合熔断和降级。
自我保护开关:yml中配置。eureka.server.enable-self-preservation=false or true
22、zuul有几类filter,执行顺序是怎样的。
类型:pre、routing、post、error
正常:pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,
执行请求,返回结果后,到达post过滤器。而后返回响应。
不正常1:pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完
毕后,会将请求交给POST过滤器,最后返回给用户。
不正常2:error过滤器自己出现异常,最终也会进入POST过滤器,而后返回
不正常3:POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,
请求不会再到达POST过滤器了
23、zuul中做登录检查如何实现
继承ZuulFilter抽象类,自定义pre类型的过滤器,shouldFilter方法中可以自定义需要放行的资源,run方法中检查请求头中的token信息,如果没有token,就响应到客户端未登录的信息,并组织filter继续往后执行。
24、zuul中如何做限流
1、可以通过继承ZuulFilter抽象类自定义pre过滤器,加上限流算法来实现
2、可以通过hystrix的资源隔离模式,设置线程池最大连接数或最大信号量来实现
25、配置中心解决什么问题
在分布式系统中,由于服务数量很多,springConfig可以集中管理这些配置文件。
支持修改配置无需重启服务
支持本地仓库、远程仓库
26、Eureka作用
在微服务中,各个服务之间需要通信,则他们需要知道对方的通行地址。eureka则是利用服务注册和服务发现来解决服务之间的通信问题的。
27、Ribbon的作用
微服务中的一个服务做了集群,则会出现一个服务名对应多个通信地址,那么调用哪个地址成了一个问题。Ribbon是一个负载均衡器,它可以按照负载均衡算法向多个服务发起调用。当一个微服务有多个集群时,就可以使用它做请求分发。
28、config配置中心作用
微服务中的每个服务对应一个配置文件,配置中心则可以集中管理这些配置文件,他支持本地配置文件,也支持远程配置文件。
29、Ribbon和Feign的区别
两个都是SpringCloud实现负载均衡的组件
Ribbon:基于http和TCP客户端的负载均衡工具。它在客户端配置RibbonServerList,然后轮询请求实现负载均衡
Feign:一个HTTP客户端,采用接口的方式,只需要创建一个接口,在上门添加注解。为
要调用其他服务的方法写成抽象方法放在这个接口中,不需要构建HTTP请求。
30、Spring,SpringBoot和SpringCloud的关系以及区别
Spring是一个开源的轻量级控制反转和面向切面编程的容器框架。轻量级是说它开发使用简单,功能强大。控制反转是指将对象的创建,销毁控制交给ioc容器,方便解耦合,降低维护难度,面向切面编程是指将相同的逻辑横向抽取出来,可以对一些通用业务如事务,日志进行集中管理。
Springboot是一个基于spring的框架,对spring做了大量简化,使开发流程更快,更高效。比如它大量简化maven依赖,基于注解配置(JavaConfig)无需XML,内嵌Tomcat,部署流程简单,打包和部署更加灵活,允许独立运行
SpringCloud是基于SpringBoot实现的,用于微服务架构中管理和协调服务的,它是一系列框架的有序集合,它为开发者提供了一系列工具,例如服务发现与注册,配置中心,网关,负载均衡,熔断器,链路追踪等等,让微服务架构落地变得更简单