自定义Ribbon规则--客户端写法

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 自定义Ribbon规则--客户端写法


代码结构

controller的代码

package com.demo.springcloud.controller;
import com.demo.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class DeptConsumerController {
    @Autowired
    private RestTemplate restTemplate;
//  private static final String REST_URI_PREFIX = "http://localhost:8001";
    private static final String REST_URI_PREFIX = "http://springcloud-provider-dept";
    @GetMapping("/consumer/dept/queryAll")
    public List<Dept> queryAll(){
        return restTemplate.getForObject(REST_URI_PREFIX+"/dept/queryAll", List.class);
    }
}

springcloud-provider-dep是服务提供者的id:

自定义配置文件

自定义的规则:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.demo.springcloud.myRule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
/**
 * 自定义的规则:
 * 每个服务走5次,然后才切换到另一个服务上
 */
public class HflRandomRule extends AbstractLoadBalancerRule {
    private int total;
    private int curentIndex;
    public HflRandomRule() {
    }
//    @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        } else {
            Server server = null;
            while(server == null) {
                if (Thread.interrupted()) {
                    return null;
                }
                List<Server> upList = lb.getReachableServers();
                List<Server> allList = lb.getAllServers();
                int serverCount = allList.size();
                if (serverCount == 0) {
                    return null;
                }
                if(total<5){
                    server = upList.get(curentIndex);
                }else{
                    total = 0;
                    curentIndex ++;
                    if(curentIndex > upList.size()){
                        curentIndex = 0;
                    }
                    server = upList.get(curentIndex);
                }
                total++;
                if (server == null) {
                    Thread.yield();
                } else {
                    if (server.isAlive()) {
                        return server;
                    }
                    server = null;
                    Thread.yield();
                }
            }
            return server;
        }
    }
    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(), key);
    }
    public void initWithNiwsConfig(IClientConfig clientConfig) {
    }
}

application.yml

效果如下:


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
3月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
41 0
|
6月前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
238 3
|
7月前
|
负载均衡 算法 Java
Ribbon自定义负载均衡算法
Ribbon自定义负载均衡算法
66 1
|
7月前
|
负载均衡 算法 Nacos
【Ribbon实现客户端负载均衡和故障转移】—— 每天一点小知识
【Ribbon实现客户端负载均衡和故障转移】—— 每天一点小知识
233 0
|
负载均衡 Java 索引
Spring Cloud:自定义 Ribbon 负载均衡策略
Spring Cloud:自定义 Ribbon 负载均衡策略
|
负载均衡 算法 Nacos
Ribbon自定义负载均衡策略
如何Ribbon自定义负载均衡策略
105 0
|
缓存 负载均衡 算法
SpringCloud极简入门-客户端负载均衡Ribbon
我们知道,为了防止应用出现单节点故障问题,同时为了提高应用的作业能力,我们需要对应用做集群 ,如果我们对user-server(用户服务)做了集群 ,那么这个时候回衍生出一些问题:现在有两个user-server(用户服务)就意味着有两个user-server(用户服务)的通信地址,我的order-server(订单服务)在向user-server(用户服务)发起调用的时候该访问哪个?如何访问?这个时候就需要有一个组件帮我们做请求的分发,即:负载均衡器,而Ribbon就是一个客户端负载均衡器。
135 0
|
消息中间件 负载均衡 算法
通过Ribbon实现客户端负载均衡
通过Ribbon实现客户端负载均衡
|
负载均衡 算法 Java
Ribbon 的负载均衡策略和自定义负载均衡
Ribbon 的负载均衡策略和自定义负载均衡
263 0
|
负载均衡 算法 Java
Ribbon默认负载均衡规则替换为NacosRule
Ribbon默认负载均衡规则替换为NacosRule
108 0