Ribbon 负载均衡的策略
所谓负载均衡就是将服务器端的请求导向不同的真正处理业务的节点,然后返回一个响应的结果。
- 随机规则 (RandomRule 提供核心功能)
- 轮询规则 (RoundRobinRule 提供核心功能)
- 重试规则 (RetryRule 提供核心功能)
- 权重规则 (WeightedResponseTimeRule 提供核心功能)
- BestAvailableRule : 会过滤掉故障的实例,找出找出请求数最小的一个,选出最空闲的节点 –>继承ClientConfigEnableRoundRobinRule
- PredicateBasedRule : 通过predicate方法过滤一部分服务实例, 然后以线性轮询的方式从过滤后的实例选一个 –>继承ClientConfigEnableRoundRobinRule
- AvailabilityFilteringRule : 是否故障, 判断请求数是否大于阈值
- ZoneAvoidanceRule : 可用的zone中选出, 过滤后的实例总数>=最小过滤实例(默认1) 过滤后的实例 >最小过滤百分比(默认0)
ribbon使用
引入pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
java 部分
@RestController
public class HelloControler {
@Autowired
HelloService helloService;
@GetMapping(value = "/hi")
public String hi(@RequestParam(value="name" , required = false, defaultValue = "ninuxGithub") String name) {
return helloService.hiService( name );
}
}
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String hiService(String name) {
return restTemplate.getForObject("http://EURKA-CLIENT/hi?name="+name,String.class);
}
public String hiError(String name) {
return "hi,"+name+",sorry,error!";
}
}
@Configuration
public class RibbonRuleConfig {
@Bean
public IRule ribbonRule(){
return new WeightedResponseTimeRule();
}
}
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@RibbonClient(name="EURKA-CLIENT", configuration = RibbonRuleConfig.class) //使用的负载均衡的规则
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
通过访问http://localhost:8764/hi?name=java 发现请求的响应结果是来自不同的服务器
细节问题: 将EURKA-CLIENT对应的服务启动在不同的端口,形成一个集群注册到eureka server
使用规则
@RibbonClient(name="EURKA-CLIENT", configuration = RibbonRuleConfig.class) //使用的负载均衡的规则
RibbonRuleConfig 定义了使用WeightedResponseTimeRule 观测console
Weight adjusting job started.....