1.Spring Cloud五大组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul / gateway
分布式配置——Spring Cloud Config
1.1Eureka
一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器(Service)和Eureka客户端(Client)。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
1.2 Ribbon
Ribbon,主要提供客户端的软件负载均衡算法。
Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:
简单轮询负载均衡
加权响应时间负载均衡
区域感知轮询负载均衡
随机负载均衡
Ribbon中还包括以下功能:
易于与服务发现组件(比如Netflix的Eureka)集成
使用Archaius完成运行时配置
使用JMX暴露运维指标,使用Servo发布
多种可插拔的序列化选择
异步和批处理操作(即将推出)
自动SLA框架(即将推出)
系统管理/指标控制台(即将推出)
1.3 Hystrix
断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障的对性能的影响。它可以帮助快速地拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来监测由断路器保护系统的部件的健康状况,或以提醒管理员当断路器跳闸,以在打开状态。
1.4 Spring Cloud Gateway
Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了Ribbon做负载均衡,以及默认使用Hystrix对网关进行保护,当然也可以选择其他的容错组件,例如Sentinel优点:性能强劲:是第一代网关Zuul的1.6倍功能强大:内置了很多实用的功能,例如转发、监控、限流等设计优雅,容易扩展缺点:其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,有一定的学习成本不能在Servlet容器下工作,也不能构建成WAR包,即不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行不支持Spring Boot 1.x,需2.0及更高的版本.
Gateway路由流程:
Gateway Client发送请求给Spring Cloud Gateway,Gateway Handler Mapping会判断请求的路径是否匹配路由的配置,如果匹配则会进入Gateway Web Handler,Web Handler会读取路由上所配置的过滤器,然后将该请求交给过滤器去处理,最后转发到路由配置的微服务上
Gateway Client:泛指外部请求,例如浏览器、app、小程序等
Proxied Service:指的是被网关代理的微服务
1.4.1 Route(路由)
Spring Cloud Gateway的基础元素,可简单理解成一条转发规则。包含:ID、目标URL、Predicate集合以及Filter集合
1.4.2 Predicate(谓词)
即java.util.function.Predicate这个接口,Gateway使用Predicate实现路由的匹配条件
1.4.3 Filter(过滤器)
与我们平时使用的Servlet编程模型里的过滤器概念类似,同样可以用于修改请求以及响应数据,可以利用Filter实现鉴权、访问日志记录,接口耗时记录等功能.
过滤器的生命周期:
Gateway以转发请求为边界,所以其生命周期只包含pre和post:
pre:Gateway转发请求之前
post:Gateway转发请求之后
自定义过滤器工厂的方式:
1.继承AbstractGatewayFilterFactory
2.继承AbstractNameValueGatewayFilterFactory
注:AbstractNameValueGatewayFilterFactory继承了AbstractGatewayFilterFactory,所以实际上第二种方式是第一种方式的简化.
全局过滤器
自定义全局过滤需要实现GlobalFilter 接口,该接口和 GatewayFilter 有一样的方法定义,只不过 GlobalFilter 的实例会作用于所有的路由。
最后需要使该全局过滤器生效,方法有很多种,可以直接在该类上加@Component注解,也可以通过代码配置(@Bean),还有其他的一些方式。这里个人比较倾向于使用一个专门的配置类去实例化这些全局过滤器并交给Spring容器管理。
1.5 Spring Cloud Config
这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。