通过对Eureka的认识,及Eureka集群的搭建,已经基本能够入门Eureka的使用。以前对于服务调用者咱们是直接获取注册列表后经过 get(0) 的方式来获取第一个注册信息。而当咱们服务提供者也搭建了集群以后。这种方式是不可取的。那么如何选择一个合适的提供者来提供服务呢?java
首先排除咱们本身经过硬编码的方式选。算法
以前接触过Zookeeper的朋友应该对负载均衡这个词不陌生,而Ribbon是另外的一种负载均衡程序,和Eureka同为NetFlix公司开发,且在Eureka客户端中集成了Ribbon。通常搭配使用。spring
基础Ribbon实现的服务调用,是经过拉取到全部的服务列表组成(服务名+请求路径)映射关系,借助RestTemplate实现调用。api
在使用 Ribbon 进行服务调用的时候,应用的名称只能使用 - 中划线链接,不能使用下划线。不然服务将没法识别。app
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
@GetMapping("teacher/users") public List getAllUser(){ return restTemplate.getForObject("http://SERVICE-PROVIDER/api/v1/users", List.class); }
根据其内置的负载均衡算法,在有多个服务提供方时,选择合适的一个。Ribbon提供的负载均衡算法有:负载均衡
可经过配置直接修改:编码
# 能够经过 服务名:ribbon:NFLoadBalancerRuleClassName: 对应的策略全类名 SERVICE-PROVIDER: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
除了服务调用和负载均衡,Ribbon家族还提供了容许接口调用时重试。使用方法以下:url
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
spring: cloud: loadbalancer: retry: enabled: true # 重试功能的开关 默认 true SERVICE-PROVIDER: ribbon: ConnectTimeout: 250 # 与服务提供方创建Http链接的超时时间 ReadTimeout: 1000 # 接收返回数据的超时时间 OkToRetryOnAllOperations: true # 是否对全部操做都进行重试 MaxAutoRetriesNextServer: 1 # 切换实例的重试次数 MaxAutoRetries: 1 # 对当前实例的重试次数(包含第一次请求,即配置1至关于请求超时就切换)
若是按照上面的配置,当消费方向提供方尝试创建链接后250ms未能成功,就会直接切换至下一个服务方尝试链接(autoRetries = MaxAutoRetries = 1)。此时若是还失败(autoRetriesNextServer = MaxAutoRetriesNextServer = 1),则请求失败。能够根据业务需求进行实际的配置.net