SpringCloud组件学习记录
一、Eureka
1.Eureka概论
- Eureka服务端:作为一个服务注册中心,如果使用它做集群部署,当集群中有分片出现故障的时候Eureka会进入自我保护模式。这个自我保护模式允许它在分片故障期间继续提供服务的发现和注册,当这个分片故障恢复时,集群中其他分片会把它们的状态再同步回来。
- Eureka客户端:主要处理服务的注册于发现。客户端服务通过注解和参数配置的方式嵌入在服务的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来关心它的服务租约。同时,它能从服务端查询当前注册的服务信息并把它们缓存到本地,周期性地更新服务状态。
- Eureka高可用:实际上就是把自己当做一个服务去向其他注册中心注册自己,以实现服务清单同步,达到高可用的效果。
2.Eureka实现原理
服务提供者
服务注册:服务提供者启动的时候会发送REST请求的方式将自己注册到Eureka Server上,同时带上自己服务的一些元数据信息。Eureka Server接收到这个REST请求后,将这些元数据存储到一个双层结构的Map中,其中第一层的key是服务名,第二层key是具体服务的实例名。
服务同步:两个服务服务提供者分别注册到不同的服务中心上,这两个注册中心又相互注册。当服务发送注册请求到其中一个注册中心上时,由于两个注册中心相互注册,就会从这个注册中心发到另一个注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个不同的服务分别注册在两个注册中心时,可以在任意一个注册中心得到这两个服务的信息。
服务续约:在注册完服务后,服务提供者会定时向注册中心发送心跳包,告诉注册中心我这个服务还活着,防止注册中心将服务剔除。
客户端
获取服务:当我们启动服务消费者的时候,会发送一个REST请求给注册中心来获取上面的服务清单,默认缓存清单30秒更新一次。
服务调用:服务消费者在获取服务清单后,通过服务名可以获得这个服务的实例和元数据信息(注册时存储的双层结构Map里的信息)。在Ribbon中会默认采用轮询的方式进行调用,从而达到负载均衡的作用。
服务下线:当服务实例正常关闭时,会向注册中心发送一个REST请求。注册中心收到请求后就将这个服务实例状态改成下线,并且把事件传播出去。
服务注册中心
自我保护机制:当注册中心运行期间,会统计15分钟内心跳失败的比例是否低于85%,如果低于85,注册中心就会把这个服务的信息保存起来,不会从缓存清单删除或者更新,直到心跳包重新恢复正常。在保护期间由于服务信息一直保持在触发保护机制时的状态,如果在这期间服务挂了或者关掉,注册中心并不会知道,这样调用服务时会拿到失效的实例导致出现错误,这时候就需要熔断器的存在。
二、Ribbon
Ribbon默认会对Server List用轮询的方式来访问以达到负载均衡的作用。
服务提供者只需要启动一个或者多个实例并且注册到服务注册中心,然后客户端直接调用被@LoadBalanced注解修饰过的RestTemplate调用服务就可以。
三、Feign
Feign的关键机制是使用了动态代理
- 首先对某个接口定义了@FeignClient的注解,Feign就会针对这个接口创建一个动态代理
- 接着调用接口的时候,本质就是调用Feign动态代理的接口
- Feign会根据接口上的@RestMapping注解来动态构造请求地址
- 针对这个接口发起请求、解析响应
四、Hystrix
Hystrix会为每一个服务创建单独的线程池,实现服务与服务之间的隔离,不会因为某个服务超时或者其他故障影响到其他服务的正常运行。
雪崩效应以及常见场景
- 硬件故障:服务器宕机、机房断电等。
- 流量激增:电商双11秒杀等。
- 缓存穿透:服务重启时,缓存数据还没完全加载,会导致大量请求直接进入服务导致服务超负荷运行,造成 服务阻塞、不可用。
4)程序bug:不合理的代码导致线程池爆满,频繁Full GC。
五、GateWay
匹配路由地址,请求接口