springcloud負載平衡採用一致性雜湊演算法

來源:互聯網
上載者:User

標籤:tco   oid   actor   etc   gen   client   hash   object   com   

 

  spring cloud網關整合了zuul和熔斷器,因此網關天生具有負載平衡和熔斷的功能。因此spring cloud的負載平衡演算法,就是ribbon的負載平衡演算法。在ribbon中,負載平衡預設了輪詢的方法。如果想採用一致性雜湊演算法,實現負載平衡,那應該怎麼辦呢?

  這裡我才用guava的一致性雜湊演算法,就不自己寫一致性雜湊演算法了。

  首先pom.xml:

<!--guava緩衝cache-->      <dependency>          <groupId>com.google.guava</groupId>          <artifactId>guava</artifactId>          <version>23.0</version>      </dependency>

  然後自己寫一個類,整合AbstractLoadBalancerRule:


@Component
public class ConsistentHash extends AbstractLoadBalancerRule {    private Logger log = LoggerFactory.getLogger(ConsistentHash.class);    public Server choose(ILoadBalancer lb, Object key) {        if (lb == null) {            log.warn("no load balancer");            return null;        }        Server server = null;        int count = 0;        while (server == null && count++ < 10) {            List<Server> reachableServers = lb.getReachableServers();            List<Server> allServers = lb.getAllServers();            int upCount = reachableServers.size();            int serverCount = allServers.size();            if ((upCount == 0) || (serverCount == 0)) {                log.warn("No up servers available from load balancer: " + lb);                return null;            }            //擷取請求URI            RequestContext ctx = RequestContext.getCurrentContext();            HttpServletRequest request = ctx.getRequest();            String URI = request.getServletPath()+"?"+request.getQueryString();            int hashcode = URI.hashCode();            int model = Hashing.consistentHash(hashcode, serverCount); //一致性雜湊,直接返回第幾個數            server = allServers.get(model);            if (server == null) {                /* Transient. */                Thread.yield();                continue;            }            if (server.isAlive() && (server.isReadyToServe())) {                return (server);            }            // Next.            server = null;        }        if (count >= 10) {            log.warn("No available alive servers after 10 tries from load balancer: "                    + lb);        }        return server;    }    @Override    public Server choose(Object key) {        return choose(getLoadBalancer(), key);    }    @Override    public void initWithNiwsConfig(IClientConfig clientConfig) {        // TODO Auto-generated method stub    }}

  就完成了。

  如果只是想針對某個應用實現一致性雜湊負載平衡,那麼可以以下幾步:

  1.去掉ConsistentHash上面的註解

  2.建立一個類MyRibbonConfiguration:

public class MyRibbonConfiguration {    @Bean    public IRule ribbonRule() {        return new ConsistentHash();//執行個體化與設定檔對應的策略類    }}

  3

@Configuration@RibbonClient(name = "hello-service", configuration = MyRibbonConfiguration.class)public class RibbonConfiguration {}

  這樣就只是針對hello-service進行一致性雜湊負載平衡演算法,其他 的還是採用輪詢。

 

springcloud負載平衡採用一致性雜湊演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.