负载均衡 Ribbon

什么是Ribbon:

Ribbon是netflix发布的负载均衡器,它有助于控制HTTP和Tcp客户端的行为.为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求.
默认提供了负载均衡算法:轮询,随机等.也可以自定义.

怎么用:

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。直接修改代码:

在RestTemplate的配置方法上添加@LoadBalanced注解:

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

修改调用方式,不再手动获取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/";
        users.add(this.restTemplate.getForObject(baseUrl + id, User.class));
        return users;
    }
}
  • 测试负载均衡策略
@RunWith(SpringRunner.class)
@SpringBootTest(classes = UserConsumerDemoApplication.class)
public class LoadBalanceTest {

    @Autowired
    RibbonLoadBalancerClient client;

    @Test
    public void test(){
        for (int i = 0; i < 100; i++) {
            ServiceInstance instance = this.client.choose("user-service");
            System.out.println(instance.getHost() + ":" + instance.getPort());
        }
    }
}

  • SpringBoot也提供了修改负载均衡规则的配置入口:
#格式是:`{服务名称}.ribbon.NFLoadBalancerRuleClassName`,值就是IRule的实现类。
user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

重试机制

CAP原则:CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得
Eureka的服务治理强调了CAP原则中的AP,即可用性和可靠性
Eureka牺牲了一定的一致性,极端情况下它宁愿接收故障实例也不愿丢掉健康实例,就是自我保护机制。
如果我们调用了这些不正常的服务,调用就会失败,从而导致其它服务不能正常工作

  • 简单配置即可实现Ribbon的重试:
  • 导入pom依赖
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
spring:
  cloud:
    loadbalancer:
      retry:
        enabled: true # 开启Spring Cloud的重试功能
user-service:
  ribbon:
    ConnectTimeout: 250 # Ribbon的连接超时时间
    ReadTimeout: 1000 # Ribbon的数据读取超时时间
    OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
    MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
    MaxAutoRetries: 1 # 对当前实例的重试次数
发布了5 篇原创文章 · 获赞 0 · 访问量 37

猜你喜欢

转载自blog.csdn.net/qq_44060273/article/details/104901968