- 实际环境中,咱们每每会开启不少个goods-service的集群。此时咱们获取的服务列表中就会有多个,到底该访问哪个呢
- 如何从多台服务器当中, 均衡的调用
- Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
- Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务链接在一块儿。
- Ribbon是Netflix发布的负载均衡器,Ribbon默认为咱们提供了不少负载均衡算法,
- 例如轮询、随机等。固然,咱们也可为Ribbon实现自定义的负载均衡算法。 在Spring
- Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,
- 并基于负载均衡算法,请求其中一个服务提供者实例。展现了Ribbon与Eureka配合使用时的架构。
- 随机
- 轮询
- hash:根据ip地址进行hash,经过ip值模于服务的数量,从而肯定访问认证
- 最少访问
这些算法, 都不须要要咱们去写, 直接使用一个Robbin进行操做java
IRule是是Ribbon对于负载均衡策略实现的接口web
默认实现IRule接口的类:算法
- RoundRobinRule:轮询
- RandomRule:随机
- AvailabilityFilteringRule:会先过滤因为屡次访问故障处于断路器跳闸状态 的服务,还有并发的链接数据超过阈值的服务,而后对剩余的服务列表按照轮询策略进行选取
- WeightedResponseTimeRule:根据平均响应时间计算全部服务的权重,响应时间越快权重越大,刚启动时若是统计信息不足,则使用RoundRobinRule策略,等统计信息足够时后,会切换到WeightedResponseTieRule
- RetryRule:先按照RoundRobinRule的策略获取服务,若是获取服务失败,则在制定时间内会重试,再获取不到, 则放弃
- BestAvailableRule:会先过滤掉因为屡次访问故障,而处于断路器跳闸的服务,而后选择一个并发量最小的服务
- ZoneAvoidanceRule:默认规则,符合判断Server所在区域的性能和server的可用性选择服务器
IRule配置:在启动类添加
spring
@Bean public IRule Irule(){ return new RandomRule();//随机 }
步骤:服务器
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Eureka的客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
@Configuration public class goodsConfig { @Bean public IRule goods(){ return new RoundRobinRule(); } }
orderconfig:架构
@Configuration public class OrderConfig { @Bean public IRule order(){ return new RandomRule(); } }
概述:并发
直接使用RestTemplate存在问题:在请求接口时,
路径仍存在问题,只解决了服务名称,没有解决服务后,功能路径问题,由于有多是别人开发的, 你不知道后面功能路径是什么app
- Feign是一个声明式WebService客户端。 Feign旨在使编写Java Http客户端变得更容易。
- Feign在RestTemplate基础上作了进一步封装,由他来帮助咱们定义和实现依赖服务接口的定义
- Feign能够把请求进行隐藏,你不用再本身拼接url,拼接参数等等操做,一切都交给Feign去作。
- 调用时,使用的负载均衡,是当前客户端配置的负载均衡规则
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
@FeignClient(name= "client-goods") public interface goodsFeignClient { @RequestMapping("/getGoods.do") public Object getGoods(); }
@Autowired goodsFeignClient goodsFeignClient; @RequestMapping("/getGoods.do") public ResponseResult getGoods(){ return ResponseResult.success("操做成功", goodsFeignClient.getGoods()); }