随着产品业务的剧增,不同服务间面临着高耦合的风险,为了降低不同服务之间的耦合度,可将将不同的业务划分成不同的模块。
Eureka
不同的服务之间有依赖关系,为了找到依赖的服务,Eureka提供了服务注册的功能。每个服务的创建和销毁的事件要向Eureka打招呼。Eureka掌握着整个系统所有的服务的信息。当服务A需要调用服务B时,通过Eureka获取服务B的信息,拿到服务B的信息再调用服务B。
Eureka相当于一个中介者的角色。
Ribbon与Feign
由于服务可以部署在多个服务器上,每个服务器的ip地址都是不同的。因此当服务A调用服务B时,到底选择哪个服务器,需要根据不同服务器的负载大小进行有选择的调用。这项功能(负载均衡)通过Ribbon来做。
为了做到负载均衡Ribbon运行时主要做四件事儿:
-
优先选择在一个Zone且负载较少的Eureka Server,进行连接。(用于获取服务列表)
-
定期从Eureka更新、过滤服务和实例列表
-
根据Ribbon提供的负载均衡策略,从注册表中选择一个真正的实例地址。
-
通过Ribbon client对服务发起调用。
仅仅使用Ribbon就可以完成当前服务对其他服务的调用,为了简化可以使用Feign配合使用。Feign使用了Java的动态代理机制,将Ribbon服务调用的逻辑封装出了一套简洁的接口调用方式。
断路器 Hystrix
断路器的应用场景:一个请求的完成需要依次调用多个服务,若中间某个服务(旁路服务)出现故障将导致不能调用后续服务,因此请求一直完成不了。
所谓旁路服务是指该服务在完成请求时可有可无的操作,因此在该服务出现问题时,系统应阻断该服务,直接进行后续服务的调用,而不耽误处理用户请求。
Api网关Zuul
网关其实是一对过滤器的集合,可以实现一些与业务无关的横切面功能。
Zuul的职责:
-
安全认证。提供统一的认证方式和鉴权功能,避免重复开发。
-
熔断,限流。针对问题服务,进行熔断操作;对流量进行预估,限制访问。
-
日志监控。统一流量入口,进行流量分析和监控。
-
屏蔽内部细节,对外提供一致的接口。
-
实现灰度。使用自定义策略实现分流,达到测试的目的。
总结
1、服务注册中心,统一管理所有服务的信息,默认组件是Eureka。
2、RPC,网络通信组件,服务A怎么调用服务B。在SpringCloud中,就是Ribbon+Feign。
3、网关,拆分的服务怎么暴露接口,最终见人的样子。 默认组件是Zuul。