2-3.SpringCloud——Ribbon负载均衡

负载均衡本质就是把流量进行均衡,防止某个服务被请求过多,过载,而同样业务的其他服务几乎没有压力。

负载均衡算法,其实这个也是找工作的热点问题之一
有轮询,随机,加权轮询,加权随机,最少连接数,ip Hash法等。这里不再展开。

SpringCloud中的Netflix使用的Ribbon

项目地址
https://github.com/mingweihua/ming-cloud

前期基础可以看以前的文章
2-1.SpringCloud前期基础(微服务概念、服务调用方式、Http客户端工具、RestTemplate)
2-2.SpringCloud——Eureka注册中心

主要在服务消费方/调用方进行配置

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>

消费方使用的RestTemplate,因此在上面添加注解

@Configuration
public class OthersConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean
    //负载均衡方式
    @LoadBalanced
    public RestTemplate restTemplate2() {
        return new RestTemplate();
    }
}

@LoadBalanced表示的开启负载均很,并且轮询算法,可以通过打断点,查看源码。
这里直接说了,主要看BaseLoadBalancer.java这个类

2-3.SpringCloud——Ribbon负载均衡
默认的规则是轮询,当然也通过配置文件进行更改。
常用配置是

 ribbon:
  ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
  ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
  OkToRetryOnAllOperations: true #对超时请求启用重试机制
  MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
  MaxAutoRetries: 1 # 切换实例后重试最大次数
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法

注意!!
为什么config类配置两个restTemplate,由于我有些别的方法测试时不希望使用负载均衡,添加注解@LoadBalanced,若使用到该restTemplate,拦截请求,然后进行负载均衡,详细通过打断点,发现走到LoadBalancerInterceptor.java,,这个类是继承ClientHttpRequestInterceptor,拦截请求

2-3.SpringCloud——Ribbon负载均衡

Controller类

@RequestMapping("/test3")
public List<ZK_collect> test3() {
     log.info("使用负载均衡动态从Eureka服务器获取服务");
     String url = "http://service-ming/service/getAllZKData";
     log.info("此时IP和端口换成服务名/服务id");
     List<ZK_collect> zk_collects = restTemplate2.getForObject(url, List.class);
     return zk_collects;
 }

注意,有坑
服务调用方地址的host不能是ip地址,也不能是域名,必须是Eureka Server上的application name,也就是服务名。

因为在LoadBalancerInterceptor.java会执行intercept方法,获取url中的Host,作为serviceName进行传参

2-3.SpringCloud——Ribbon负载均衡
执行loadBalancer的execurt方法,具体实现类是BlockingLoadBalancerClient

2-3.SpringCloud——Ribbon负载均衡
也就是根据serverName进行选择相应的服务实例,若改成ip等之类的就会报错,显示No instances available for ****

以上就是配置Ribbon的简单介绍。

虽然比较简单,但是抽空写博客给大家参考不容易,欢迎大家点个赞,评论之类的。你们的赞扬和肯定是博主们坚持的动力,谢谢!

上一篇:基于SpringBoot整合SpringCloud微服务框架--Eureka注册中心及Feign远程调用/Ribbon负载均衡及Hystrix熔断器及zuul网关


下一篇:Spring Cloud Netflix超时时间设置