1、说说你对springcloud的理解?
Spring cloud是⼀个基于Spring Boot实现的服务治理框架,⽤于微服务架构中管理和协调各个服务。它提供了一系列组件方便用户快速搭建微服务,如服务发现注册nacos、 配置中⼼nacos、服务网关gateway,客户端负载配置Ribbon、服务间调用openfeign、短路器Hystrix、分布式事务服务Seata等

2、nacos 注册中心工作流程
- 1、服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据。比如IP地址、端口等信息,Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
- 2、服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被踢除。默认5秒发送一次心跳。
- 3、服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
- 4、服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务(35秒/次)定时拉取服务端最新的注册表信息更新到本地缓存。nacos支持服务列表变更的消息推送模式,服务列表更新及时
- 5、服务健康检查:Nacos Server会开启一个定时任务来检查注册服务实例的健康情况,对于超过15秒没有收到客户端心跳的实例,会将它的healthy属性置为false(客服端服务发现时不会获取),如果某个服务实例超过30秒没有收到心跳,直接踢除该实例(被踢除的实例如果恢复发送心跳则会重新注册)
3、nacos如何进行健康检查?
nacos有两种健康监测方式,一种是对临时服务,一种是持久化服务,服务注册时通过ephemeral参数进行区分,ephemeral=true代表是临时服务,ephemeral=false代表是持久化服务,所有服务默认为临时服务
- 临时实例每隔 5 秒会主动上报一次自己的健康状况,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果心跳包的间隔时间超过了 15 秒,那么 Nacos 服务器端就会将此服务实例标记为非健康实例,如果心跳包超过了 30s 秒,那么 Nacos 服务器端将会把此服务实例从服务列表中删除掉
- 持久化服务检查机制:由注册中心主动探测, 它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),探测失败,服务为不健康服务,但是服务不会被摘除,永久实例支持 3 种探测协议,TCP、HTTP 和 MySQL,默认探测协议为 TCP,也就是通过不断 ping 的方式来判断实例是否健康。
4、nacos配置中心动态监听
nacos采用的是pull模式(客户端从服务端主动拉取数据),但不是简单的pull模式,而是一种长轮训机制,它结合了push和pull两者优势,客户端采用长轮训的方式定时发起pull请求,去检查服务配置信息是否发生了变更,如果服务端如果有配置发生变化,就直接返回,如果没有变化,则服务端会hold住这个请求,也就是服务端拿到这个连接之后在指定的时间内一直不返回结果,直到这段时间内配置发生变化,服务端会把原来hold住的请求进行返回。长连接默认时间是30秒
5、Feign服务调用原理工作的总结
- 通过 @EnableFeignCleints 触发 Spring 应用程序对@FeignClient 修饰类的扫描
- 解析到 @FeignClient 修饰类后, Feign 框架通过扩展 Spring Bean Deifinition 的注册逻辑, 最终注册一个 FeignClientFacotoryBean 进入 Spring 容器
- Spring 容器在初始化其他用到 @FeignClient 接口的类时, 获得的是 FeignClientFacotryBean 产生的一个代理对象 Proxy.
- 基于 java 原生的动态代理机制, 针对 Proxy 的调用, 都会被统一转发给 Feign 框架所定义的一个 Handler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收等工作
6、说说Ribbon是如何实现负载均衡的?
-
发送请求,被LoadBalancerInterceptor拦截器拦截,请求被交给ribbon来处理
-
LoadBalancerClient在初始化的时候(execute方法),会通过ILoadBalance(BaseLoadBalancer是实现类)向注册中心获取服务注册列表,并通过服务健康检查,来判断服务的可用性,如果服务的可用性发生了改变或者服务数量和之前的不一致,则从注册中心更新或者重新拉取。LoadBalancerClient有了这些服务注册列表,就可以根据具体的IRule来进行负载均衡。
-
使用负载均衡算法(默认轮询算法)从所有的服务实例信息中选择一台机器出来
-
将请求发送给负载均衡选择出来的服务实例上去