Ribbon与Eureka的关系
Eureka的服务拉取与负载均衡都是由Ribbon来实现的。
当服务发送http://userservice/user/xxxhtt://userservice/user/xxx请求时,是无法到达userservice服务的,会通过Ribbon会把这个请求拦截下来,通过Eureka-server转换为真实的ip与端口。
如果服务名对应多个服务,Eureka-server会把所有的ip与端口返回给Ribbon,Ribbon来做负载均衡。
@LoadBalanced注解表示以后的请求由Ribbon拦截和处理。
负载均衡策略
Ribbon的负载均衡策略规则是一个叫做IRule的接口来定义的,每一个子接口都是一种规则。
下面是IRule接口的继承关系图:
调整负载均衡的方案
Ribbon的默认负载均衡策略是轮询(Round Robin)调度。
方法一,定义一个新的IRule:
这种方法,以后不管调用哪个微服务都是指定这个方案的。
@Bean
public IRule randomRule() {
return new RandomRule();
}
方法二,在yml中配置:
只有userservice这个服务时,才会使用RandomRule的方案。
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
注意:方法一的优先级比方法二高!
解饿加载
Ribbon模式是采用懒加载,既第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载。
这里的服务名称是自己要调用的服务名称,不是自己的服务名称。
ribbon:
eager-load:
enabled: true #开启饥饿加载
clients: userservice #指定对userservice这个服务饥饿加载
使用方法:
在 Spring Boot 应用程序的主类上添加@EnableDiscoveryClient注解以启用服务发现。
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonClientApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonClientApplication.class, args);
}
}
@LoadBalanced 是一个 Spring Cloud 注解,通常与 RestTemplate 一起使用,用于开启客户端负载均衡。这个注解会告诉 Spring Cloud,通过这个被注解的 RestTemplate 发出的请求需要进行负载均衡。
@LoadBalanced // 开启负载均衡
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}