LoadBalance负载均衡。
springCloudRibbon是一个基于Http和TCp的客户端负载均衡工具,负载均衡会维护一个挂可用的服务端清单,通过心跳检测来剔除故障的服务端节点,通过某种算法(比如轮询,按权负载,按流浪负载)来从清单中国取出一台服务器地址。
springCloudRibbon的封装,两步
服务提供者只需要启动多个服务实例并注册到一个注册中心或事多个相关联的服务注册中心。
服务消费者直接调用被@LoadBalanced直接修饰过的RestTemplate来实现面向服务的接口调用
配置初步:
加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
ribbon要和eureka整合。
添加启动类注解
@EnableDiscoveryClient
//该应用注册为Eureka客户端
@SpringBootApplication
public class RibbonConsumerApplication {
@Bean
@LoadBalanced
//开启客户端负载均衡
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
controller,GET请求
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloConsumer(){
return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
}
}
getForEntity和getForObject有三种不同的重载实现。
postForEntity和postForObject三种不同的重载实现
put三种不同的重载实现
delete三种不同的重载实现
返回Object一般就是json,entity就是ResponseEntity对象类型
Ribbon自带的负载均衡算法IRule接口7种实现
RoundRibbonRule轮询
RandomRule随机
AvailabilityFilteringRule会先过滤掉由于多次访问故障处于断路器跳闸 状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务进行轮询
WeightedResponseTimeRule根据平均响应时间计算所有服务的权重,响应时间越快权重越大,被选中的几率越大,刚启动时统计信息不足,则先使用轮询,等统计信息足够了再使用WeightedResponseTimeRule
RetryRule先按照轮询的策略获取服务,如果获取服务失败,会在指定时间内进行重试,获取可用服务。
BestAvailableRule会先过滤掉多次访问故障而处于断路器跳闸状态的服务,然后先择一个并发量小的服务
ZoneAvidanceRule默认规则,复合判断server区域的性能和server的可用性选择服务器
切换负载均衡规则。
再@ComponentScan不能扫描到的包下建立类
@Configuration
public class MyselfRule {
@Bean
public IRule myRule(){
return new RandomRule();
}
}
再启动类上加注解
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)
轮询算法
用第几次的请求数对服务器的集群总台数进行取余操作,list.get(index)