zoukankan      html  css  js  c++  java
  • SpringCloud入门实战(4)-Ribbon使用

    Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST请求自动转换成客户端负载均衡的服务调用。本文主要介绍Ribbon的基本使用,文中使用到的软件版本:Spring Boot 2.2.5.RELEASE、Spring Cloud Hoxton.SR3、Java 1.8.0_191。

    1、Ribbon原理

    服务列表:通过注册中心获取可用的服务列表
    服务过滤:对原始服务列表使用一定策略进行过滤,并返回有效的服务器列表给客户端负载均衡器使用
    服务心跳检测:用来检测一个微服务实例是否可用;如果检测到某服务实例不可用,则会从列表中及时移除
    负载均衡策略:在多个服务实例中选择一个有效的服务实例,并进行相应的服务请求处理

    2、Ribbon负载均衡策略

    策略类   命名 描述
    RandomRule 随机策略 随机选择server
    RoundRobinRule 轮询策略 按照顺序选择server(ribbon默认策略)
    RetryRule 重试策略 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server
    BestAvailableRule 最低并发策略 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
    AvailabilityFilteringRule 可用过滤策略 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
    ResponseTimeWeightedRule 响应时间加权重策略 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
    ZoneAvoidanceRule 区域权重策略 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

    3、常用参数设置

    ribbon.MaxAutoRetries=0 #对当前实例的重试次数,默认0
    ribbon.MaxAutoRetriesNextServer=1 #切换实例的重试次数,默认1
    ribbon.ReadTimeout=5000 #请求处理的超时时间,默认5秒
    ribbon.ConnectTimeout=2000 #请求连接的超时时间,默认2秒
    ribbon.OkToRetryOnAllOperations=false #对所有操作请求都进行重试,默认false

    4、使用

    4.1、引入依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>

    如果使用的eureka-client等服务发现组件,则默认包含了robbin。

    4.2、定义RestTemplate

    package com.inspur.scdemo.client.config;
    
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }

    4.3、调用服务

    @RequestMapping("/getUser")
    public CallResult<User> getUser(long id) {
        logger.info(id + "");
    
        CallResult<User> result;
        try {
            MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
            map.add("id", id + "");
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity(map, null);
            ParameterizedTypeReference type = new ParameterizedTypeReference<CallResult<User>>(){};
            //scdemo-server为服务名
            //ResponseEntity<User> responseEntity = restTemplate.postForEntity("http://scdemo-server/user/getUser", map, User.class);
            ResponseEntity<CallResult<User>> responseEntity = restTemplate.exchange("http://scdemo-server/user/getUser", HttpMethod.POST, requestEntity, type);
            result = responseEntity.getBody();
        } catch (Exception e) {
            result = new CallResult<>(-1, "发生异常");
            e.printStackTrace();
        }
        return result;
    }

    4.4、feign

    如果使用feign调用服务,里面默认包含了robbion,不需要特殊处理。

    4.5、说明

    Robbion负载均衡器是spring Cloud默认的负载均衡器,但现在已处于维护的状态,不建议使用,Spring Cloud推荐使用BlockingLoadBalancerClient来作为负载均衡器;可以把spring.cloud.loadbalancer.ribbon.enabled设为false来停用Robbion。

  • 相关阅读:
    通信原理
    java实现聊天室的简单实现
    计算机网络笔记——第四章、网络层
    泛型高级之通配符
    看文档总结
    HashSet源码解析
    HashTable源码解析
    计算机网络笔记——第三章、数据链路层
    Collection集合的功能
    第六章 应用层
  • 原文地址:https://www.cnblogs.com/wuyongyin/p/13522238.html
Copyright © 2011-2022 走看看