Ribbon 提供了一套微服务负载均衡的解决方案。
目前业界主流的负载均衡方案可分成两类:
负载均衡策略,常见的有:
策略类 | 命名 | 描述 |
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
案例:(由于Ribbon停更,且目前eureka中的负载均衡被loadbalancer取代,下面的是loadbalancer案例)
config增加配置
package com.example.eurekaclient2.config;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced //启用负载均衡注解
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
/**
* 策略改为随机
*/
@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory){
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory
.getLazyProvider(name, ServiceInstanceListSupplier.class),
name);
}
}
启动类增加修改策略的引用 @LoadBalancerClients
@LoadBalancerClients(defaultConfiguration = {RibbonConfig.class})
@SpringBootApplication
//如果配置文件配置了注册中心相关配置,则默认开启注册中心注解(@EnableEurekaClient)
public class EurekaClient2Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient2Application.class, args);
}
}
controller
@RestController
public class ClientConntroller {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/postRest")
private String postRest(){
Persion ps = new Persion();
ps.setUserName("卢大宝");
//包含响应的一些信息
ResponseEntity<Persion> pp = restTemplate.postForEntity("http://LUDB-CLIENT-1/postUser", ps, Persion.class);
Persion p = pp.getBody();
return p.getUserName();
}
}