客戶端負載均衡 Spring Cloud Ribbon(二)使用筆記

服務消費與Ribbon負載均衡

在spring-cloud-demo工程中添加module:demo-service-ribbon
在pom.xml文件中加入依賴:java

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
    </dependency>

</dependencies>

在resource目錄下增長application.properties文件,添加以下內容:算法

################## 服務配置 ###############
server.port=9136
spring.application.name=demo-service-ribbon
#註冊到註冊中心
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

建立一個啓動類:ServiceRibbonApplication.java,添加以下內容:spring

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced ////負載均衡配置
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

添加Service類:DemoRibbonService.java,添加以下內容:併發

@Service
public class DemoRibbonService {

    @Autowired
    RestTemplate restTemplate;

    public String port() {
        return restTemplate.getForObject("http://demo-service/port", String.class);
    }
}

添加Controller類:DemoRibbonController.java,添加以下內容:app

@RestController
public class DemoRibbonController {

    @Autowired
    DemoRibbonService demoRibbonService;

    @RequestMapping("hello")
    public String port() {
        return demoRibbonService.port();
    }
}

分別使用980六、9807端口運行以前構建的demo-service工程
在運行demo-service-ribbon項目,訪問:http://localhost:9136/hello,顯示以下:
I am demo-service, I'm from port : 9806
再次訪問http://localhost:9136/hello,顯示以下:
I am demo-service, I'm from port : 9807負載均衡

說明demo-service-ribbon工程中加了@LoadBalanced註解的restTemplate在訪問demo-service服務時使用了Ribbon的負載均衡功能dom

Ribbon負載均衡策略配置

Ribbon的負載均衡經常使用的策略有

  1. RandomRule:從服務列表中隨機取一個服務實例rest

  2. RoundRobinRule:從服務列表中以輪詢的方式取實例code

  3. RetryRule:根據maxRetryMillis最大重試時間參數在獲取服務實例失敗時重試獲取服務實例server

  4. WeightedResponseTimeRule
    該策略是對RoundRobinRule的擴展, 增長了根據實例的運行狀況來計算權重, 並根據權重來挑選實例, 以達到更優的分配效

  5. ClientConfigEnabledRoundRobinRule
    這個策略跟RoundRobinRule功能相同,其做用是能夠繼承這個策略重寫choose()方法,當自定義的選擇策略沒法實施時能夠用父類的策略做爲備選方案

  6. BestAvailableRule
    該策略繼承自ClientConfigEnabledRoundRobinRule, 在實現中它注入了負載均衡器的統計對象LoadBalancerStats , 同時在具體的choose 算法中利用LoadBalancerStats 保存的實例統計信息來選擇知足要求的實例。從源碼中看出, 它經過遍歷負載均衡器中維護的全部服務實例,會過濾掉故障的實例, 並找出併發發請求數最小的一個, 因此該策略的特性是可選出最空閒的實例。

  7. PredicateBasedRule
    一個抽象策略,基於Google Guava Collection過濾條件接口Predicate實現的策略,基本實現的是「先過濾清單, 再輪詢選擇」
  8. AvailabilityFilteringRule
    基於PredicateBasedRule實現的,使用線性選擇,符合條件就使用,不符合條件就找下一個,而不像父類須要遍歷全部服務計算再選擇
  9. ZoneAvoidanceRule
    待補充。。

具體配置步驟

以配置隨機策略爲例
在啓動類文件ServiceRibbonApplication.java中加入方法:

//新增隨機策略
@Bean
public IRule ribbonRule() {
    return new RandomRule();    //這裏選擇隨機策略,對應配置文件
}

分別使用980六、9807端口運行以前構建的demo-service工程 再運行demo-service-ribbon項目,訪問:http://localhost:9136/hello,多訪問幾回就會發現返回的端口就是隨機的了 I am demo-service, I'm from port : 9806 I am demo-service, I'm from port : 9807 I am demo-service, I'm from port : 9806 I am demo-service, I'm from port : 9806

相關文章
相關標籤/搜索