Ribbon负载均衡的@LoadBalanced怎样实现负载均衡

在RestTemplate上加上注解:@LoadBalanced,标记这个restTemplate发起的请求被ribbon拦截喝处理了。

LoadBalancerInterceptor.java

LoadBalancerInterceptor继承了ClientHttpRequestInterceptor类,ClientHttpRequestInterceptor是拦截客户端发起的http请求进行处理,LoadBalancerInterceptor继承ClientHttpRequestInterceptor

实现intercept方法。

其中request.getURI()获取的是服务的地址,(http://userservice/user/1) userservice是服务名。

originalUri.getHost()获取的是主机名,userservice是服务名。

拿到服务名称去找eureka拉取服务地址,loadBalancer.execute去拉取服务列表。

RibbonLoadBalancerClient.java的ILoadBalancer loadBalancer = getLoadBalancer(serviceId);获取服务列表,其中allServerList 就是获取到的服务列表,比如:8081或者8082.

实现负载均衡:取出一个服务,getServer(loadBalancer, hint);

 

 

 根据规则选取服务,rule.choose。

 IRule的规则:(随机,轮询等规则) 选出一个服务,返回给RibbonLoadBalancerClient,用这个IP和端口替换服务名称找到真实请求地址。

默认实现的是ZoneAvoidanceRule,轮询。

修改负载均衡的策略:

1.在Application.java 中定义一个新的rules。(此种方案是全局配置,不管调用什么服务都是随机的)

@Bean
Public IRule RandomRule(){
    return new RandomRule();
}

2.在yml文件中添加配置:(可指定服务名称配置负载均衡的策略)

userservice:  #服务名称
    ribbon:
        NFloadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule

饥饿加载:

Ribbon默认是懒加载,第一次访问时去创建LoadBalanceClient,(懒加载是项目在第一次访问时才去创建RibbonLoadBalancerClient并且拉取服务)所以第一次访问耗时较长。再次加载不会耗时过长,存在缓存中。

可以添加配置,开启饥饿记载,降低第一次访问的时间,饥饿加载会在项目启动时候创建。

在yml文件中配置:

ribbon:
    eager-load:
        enabled:true # 开启饥饿加载
        clients: userservice # 指定服务名称 对这个服务进行饥饿加载

        clients: # 多个服务 饥饿加载
            - userservice 
            - orderservice 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值