基于gateway的ribbon负载均衡

网关的包
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
熔断的包,防止雪崩
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
yml里面配置:
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 10
  application:
    name: iem-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: iem-resource
          uri: lb://iem-resource
          predicates:
            - Path=/resource-api/**
          filters:
            - StripPrefix=1
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/fallBackResource


一个应用启动多次,9009,8001端口,riboon负载均衡

my-load-balanced-service:
  ribbon:
    listOfServers: localhost:9009,localhost:8001
    NFLoadBalancerRuleClassName: com.brt.iem.gateway.auth.blance.MyLoadBalancerRule
    #com.netflix.loadbalancer.RoundRobinRule

MyLoadBalancerRule均衡策略可以自己写

package com.brt.iem.gateway.auth.blance.MyLoadBalancerRule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.ArrayList;
import java.util.List;

/**
 * peiyajie 20200824
 */
public class MyLoadBalancerRule extends  AbstractLoadBalancerRule {

    private volatile int total;

    private volatile int index;

    List<Server> upList=new ArrayList<Server>();

    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>  allList=lb.getAllServers();
               int serverCount =allList.size();
               if(serverCount==0){
                   return null;
               }

               if(total==0){
                   upList=lb.getReachableServers();
               }

               if(total<3){
                   if(upList.size()!=lb.getReachableServers().size()){
                       index=0;
                   }
                   server=lb.getReachableServers().get(index);
                   total++;
               }else{
                   total=0;
                   index++;
                   if(index>=lb.getReachableServers().size()){
                       index=0;
                   }
               }

               if(server==null){
                   Thread.yield();
               }else{
                   if(server.isAlive()){
                       return server;
                   }
                   server=null;
                   Thread.yield();
               }
           }//server=null的判断
           return server;
       }
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {

    }

    @Override
    public Server choose(Object key) {
        return this.choose(this.getLoadBalancer(),key);
    }
}

参考:https://blog.youkuaiyun.com/u014704612/article/details/105028834/

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值