• Ribbon


    Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务

    提供者的地址列表后,Ribbon会基于某种负载均衡算法,自动的帮助服务消费者取请求。

    一、因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖

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

    二、修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用。

    @Service
    public class UserService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Autowired
        private DiscoveryClient discoveryClient;
    
        public List<User> queryUserByIds(List<Long> ids) {
            List<User> users = new ArrayList<>();
            // 地址直接写服务名称即可
            String baseUrl = "http://user-service/user/";
            ids.forEach(id -> {
                // 我们测试多次查询,
                users.add(this.restTemplate.getForObject(baseUrl + id, User.class));
                // 每次间隔500毫秒
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            return users;
        }
    }

    三、配置Ribbon负载均衡的策略

    user-service:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

    格式是:{服务名称}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的实现类。

    四、重试机制

    Eureka的服务治理强调了CAP原则中的AP,即可用性和可靠性。它与Zookeeper这一类强调CP(一致性,可靠性)的服务治理框架最大的区别在于:Eureka为了实现更高的服务可用性,牺牲了一定的一致性,极端情况下它宁愿接收故障实例也不愿丢掉健康实例,正如我们上面所说的自我保护机制。

    但是,此时如果我们调用了这些不正常的服务,调用就会失败,从而导致其它服务不能正常工作!这显然不是我们愿意看到的。

    因此Spring Cloud 整合了Spring Retry 来增强RestTemplate的重试能力当一次服务调用失败后,不会立即抛出一次,而是再次重试另一个服务

    只需要简单配置即可实现Ribbon的重试:

    spring:
      cloud:
        loadbalancer:
          retry:
            enabled: true # 开启Spring Cloud的重试功能
    user-service:
      ribbon:
        ConnectTimeout: 250 # Ribbon的连接超时时间
        ReadTimeout: 1000 # Ribbon的数据读取超时时间
        OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
        MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
        MaxAutoRetries: 1 # 对当前实例的重试次数

    根据如上配置,当访问到某个服务超时后,它会再次尝试访问下一个服务实例,如果不行就再换一个实例,如果不行,则返回失败。切换次数取决于MaxAutoRetriesNextServer参数的值

    引入 spring-retry的依赖

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>
  • 相关阅读:
    Python多进程编程
    Cython学习
    cProfile——Python性能分析工具
    Python垃圾回收机制:gc模块
    新纪元
    类模版的static成员
    我的2015plan
    Linux之sed
    getenv, _wgetenv
    vs2010下如何调试带输入参数的程序
  • 原文地址:https://www.cnblogs.com/houchen/p/12056669.html
Copyright © 2020-2023  润新知