目录
Spring Cloud 的一个微服务架构技术栈,一套完整的一站式微服务解决方案。基于Spring Boot 框架简化分布式系统基础设施开发,如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等,Spring Boot 开发风格能做到一键启动和部署。
准确的说,Spring Cloud 是一个容器,将市面上较好的微服务框架集成起来,通过Spring Boot 风格进行再次封装屏蔽掉复杂的配置和实现原理,从而得到一套简单易懂、易于部署和维护的分布式系统开发工具,达到简易开发的作用。
一、服务注册发现——Eureka
Eureka是Spring Cloud 的注册服务中心,实现服务注册与服务发现。存储服务提供者和消费者的地址信息、服务发布相关属性信息等内容。当消费者需要调用服务时,可直接在注册中心拉去提供者的地址、端口号、服务名称等内容。
Eureka服务端:服务的注册中心,用来提供服务注册,支持集群部署
Eureka客户端:将服务注册到服务端, 同事将服务端的信息缓存到本地, 客户端和服务端定时交互
Eureka-Server:对外暴露自己地址
二、远程调用——Feign
微服务与微服务之间相互调用时,基于动态代理机制,根据注解调用http请求,拼接url地址,发起远程请求。 Feign组件集成了Ribbon负载均衡策略和Hystrix熔断器。
三、负载均衡——Ribbon
Ribbon是一个基于HTTP和TCP客户端负载均衡器,底层还是基于RestTemplate实现。当Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
四、熔断器——Hystrix
在微服务架构中,⼀个应用可能会有多个微服务组成,微服务之间的数据交互通过远程过程调⽤完成。当某个服务出现故障时,由于故障原因引发故障蔓延,导致整个系统瘫痪。
Hystrix就是一种为了解决此类问题的服务保护机制。在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能
Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,不同的服务走不同的线程池,实现不同服务调用隔离,避免服务雪崩问题
五、网关服务——Zuul/Gateway
Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射,Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做前置过滤,已实现对微服务接口的拦截和校验
那我们常使用的网关服务还有Gateway,那么Gateway和Zuul有什么区别呢?
1、gateway对比zuul多依赖了spring-webflux,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件。zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。
2、zuul仅支持同步,gateway支持异步。
3、gateway线程开销少,支持各种长连接、websocket,spring官方支持,但运维复杂,
zuul编程模型简单,开发调试运维简单,有线程数限制,延迟堵塞会耗尽线程连接资源。
六、总结
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务