Eureka:服务注册与发现
注册:每个服务都向
Eureka
登记自己提供服务的元数据,包括服务的
ip地址、端口号、版本号、通信协议等。
eureka
将各个服务维护在了一个服务清单中(双层
Map
,第一层
key
是服务名,第二层
key是实例名,
value
是服务地址加端口)。同时对服务维持心跳,剔除不可用的服务,
eureka集群各节点相互注册每个实例中都有一样的服务清单。
发现:
eureka注册的服务之间调用不需要指定服务地址,而是通过服务名向注册中心咨询,并获取所有服务实例清单
(
缓存到本地
)
,然后实现服务的请求访问。
Ribbon:客户端负载均衡
服务间发起请求的时候,基于
Ribbon做负载均衡,从⼀个服务的多台机器中选择⼀台 (被调用方的服务地址有多个),
Ribbon
也是通过发起
http请求,来进行的调用,只不过是通过调用服务名的地址来实现的。虽然说
Ribbon
不用去具体请求服务实例的
ip地址或域名了,但是每调用一个接口都还要手动去发起
Http
请求。
Feign:RPC远程调用
基于
Feign
的动态代理机制,根据注解和选择的机器,拼接请求
URL地址,发起请求 ,简化服务间的调用,在
Ribbon
的基础上进行了进一步的封装。单独抽出了一个组件,就是
Spring Cloud Feign
。
在引入
Spring Cloud Feign后,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。
调用远程就像调用本地服务一样。
public class TestController {
@Resource UserClient userClient;
@RequestMapping("/test") public String test(){
String user = userClient.getUser();
return user;
}
}
Hystrix:熔断降级工具
发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,通过统计接口超时次数返回默认值,实现服务熔断和降级。
Zuul:路由网关
如果前端、移动端要调⽤后端系统,统⼀从
Zuul
⽹关进⼊,由
Zuul⽹关转发请求给对应的服务,通过与
Eureka
进行整合,将自身注册为
Eureka
下的应用,从
Eureka下获取所有服务的实例,来进行服务的路由。
Zuul还提供了一套过滤器机制,开发者可以自己指定哪些规则的请求需要执行校验逻辑,只有通过校验逻辑的请求才会被路由到具体服务实例上,否则返回错误提示。