<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                除了選用Ribbon官方提供的均衡策略外,我們也可以自定義均衡策略。 <br/> 在消費端 cloud-comsumer-order80 自定義均衡策略的步驟如下: **1. 自定義我們的均衡策略** (1)需求:Ribbon默認的輪詢策略是每臺機器一次,然后輪到下一個機器。現在要求在輪詢策略的基礎上加上新的需求,即每個服務器要求被調用5次才開始輪到下一個服務器。 (2)下面先讓我們來看一下 RandomRule 均衡策略的源碼,了解它的基本原理。 *`com.netflix.loadbalancer.RandomRule`* ```java package com.netflix.loadbalancer; import com.netflix.client.config.IClientConfig; import edu.umd.cs.findbugs.annotations.SuppressWarnings; import java.util.List; import java.util.Random; public class RandomRule extends AbstractLoadBalancerRule { Random rand = new Random(); public RandomRule() { } /** * 其實實現其主要作用的就是該方法 */ @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; } // 1. 獲取所有可用的服務 List<Server> upList = lb.getReachableServers(); // 2. 獲取所有的服務,可用的和不可用的 List<Server> allList = lb.getAllServers(); int serverCount = allList.size(); if (serverCount == 0) { return null; } // 3. 可以看到隨機就是隨機地在一個可用的服務列表中隨機的返回一個Server int index = this.rand.nextInt(serverCount); server = (Server)upList.get(index); 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) { } } ``` (3)根據上面的需求實現的自定義均衡器如下。 ```java public class MyRoundRibbonByFiveRule extends AbstractLoadBalancerRule { /** * 每臺總共被調用的次數,目前要求每臺被調用5次 */ private int total = 0; /** * 當前提供服務的機器號 */ private int currentIndex = 0; public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null; while (server == null) { if (Thread.interrupted()) { return null; } // (1)獲取所有可用的機器和所有機器(包括可用的和不可用的) List<Server> upList = lb.getReachableServers(); List<Server> allList = lb.getAllServers(); int serverCount = allList.size(); if (serverCount == 0) { return null; } // (2)根據需求設計的均衡器選擇規則如下 // int index = rand.nextInt(serverCount); // server = upList.get(index); if (total < 5) { server = upList.get(currentIndex); total++; } else { total = 0; currentIndex++; if (currentIndex >= upList.size()) { currentIndex = 0; } } if (server == null) { Thread.yield(); continue; } if (server.isAlive()) { return (server); } server = null; Thread.yield(); } return server; } @Override public Server choose(Object key) { return choose(getLoadBalancer(), key); } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { // TODO Auto-generated method stub } } ``` **2. 將自定義的均衡器進行裝配** 有一個要求:<mark>就是裝配自定義均衡器的類不能在`@ComponentScan`的包及其子包下</mark>,如下的啟動類。 ```java // 1. @SpringBootApplication標注的類為啟動類 @SpringBootApplication public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class, args); } } // 2. @SpringBootApplication用到了@ComponentScan @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { // 3. 所以就是裝配自定義均衡器的類不能與啟動類同級目錄,或者子目錄。 ``` 說了這么多,下面就將自定義的均衡器進行裝配。 ```java /** * 注意:我當前模塊的啟動類位置在 com.atguigu.springcloud.OrderMain80 * 所以當前裝配的自定義均衡策略的類不能定義在com.atguigu.springcloud包下及其子包下 */ @Configuration public class MyRoundRibbonByFiveRuleConfig { /** * 將自定義的均衡器進行裝配。 */ @Bean public IRule myRoundRibbonByFiveRule() { return new MyRoundRibbonByFiveRule(); } } ``` **3. 在消費端啟動類上添加注解`@RibbonClient`** ```java @SpringBootApplication @EnableEurekaClient /** * name:服務端的 spring.application.name 配置 * configuration:我們自定義的均衡策略 */ @RibbonClient(name = "${provider.payment.name}",configuration = MyRoundRibbonByFiveRuleConfig.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } } ``` **4. 測試效果** 訪問消費端的 http://localhost/order/idport ,經過測試,確實刷新5次后才會更換下一個服務器。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看