栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

SpringCloud中的Netflix使用的Ribbon

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

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

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


    
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.projectlombok
        lombok
    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-ribbon
    

消费方使用的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 test3() {
     log.info("使用负载均衡动态从Eureka服务器获取服务");
     String url = "http://service-ming/service/getAllZKData";
     log.info("此时IP和端口换成服务名/服务id");
     List 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的简单介绍。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/658397.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号