ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-12 22:01:37  阅读:160  来源: 互联网

标签:负载 服务 SpringCloud RestTemplate cloud 均衡 public 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这个类

在这里插入图片描述
默认的规则是轮询,当然也通过配置文件进行更改。
常用配置是

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

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

在这里插入图片描述

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进行传参

在这里插入图片描述
执行loadBalancer的execurt方法,具体实现类是BlockingLoadBalancerClient

在这里插入图片描述
也就是根据serverName进行选择相应的服务实例,若改成ip等之类的就会报错,显示No instances available for ****

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

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

标签:负载,服务,SpringCloud,RestTemplate,cloud,均衡,public,Ribbon
来源: https://blog.csdn.net/dogHuaMing/article/details/121893670

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有