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

简介: 自定义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

效果如下:


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
4月前
|
负载均衡 算法 Nacos
【Ribbon实现客户端负载均衡和故障转移】—— 每天一点小知识
【Ribbon实现客户端负载均衡和故障转移】—— 每天一点小知识
156 0
|
8月前
|
负载均衡 Java 索引
Spring Cloud:自定义 Ribbon 负载均衡策略
Spring Cloud:自定义 Ribbon 负载均衡策略
|
9月前
|
负载均衡 算法 Nacos
Ribbon自定义负载均衡策略
如何Ribbon自定义负载均衡策略
76 0
|
9月前
|
缓存 负载均衡 算法
SpringCloud极简入门-客户端负载均衡Ribbon
我们知道,为了防止应用出现单节点故障问题,同时为了提高应用的作业能力,我们需要对应用做集群 ,如果我们对user-server(用户服务)做了集群 ,那么这个时候回衍生出一些问题:现在有两个user-server(用户服务)就意味着有两个user-server(用户服务)的通信地址,我的order-server(订单服务)在向user-server(用户服务)发起调用的时候该访问哪个?如何访问?这个时候就需要有一个组件帮我们做请求的分发,即:负载均衡器,而Ribbon就是一个客户端负载均衡器。
86 0
|
9月前
|
消息中间件 负载均衡 算法
通过Ribbon实现客户端负载均衡
通过Ribbon实现客户端负载均衡
|
9月前
|
负载均衡 算法 Java
Ribbon 的负载均衡策略和自定义负载均衡
Ribbon 的负载均衡策略和自定义负载均衡
165 0
|
10月前
|
负载均衡 算法 Java
Ribbon默认负载均衡规则替换为NacosRule
Ribbon默认负载均衡规则替换为NacosRule
69 0
|
11月前
|
负载均衡 算法 容灾
Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)
Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)
129 0
|
11月前
|
负载均衡 算法 Java
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
186 0
|
11月前
|
负载均衡 算法 Java
Spring Cloud Alibaba - 08 Ribbon 两种方式实现细粒度自定义配置控制微服务的负载均衡策略
Spring Cloud Alibaba - 08 Ribbon 两种方式实现细粒度自定义配置控制微服务的负载均衡策略
96 0