Spring Cloud Ribbon 配置及詳解

  • Ribbon 介紹

Ribbon 是一個客戶端的負載均衡解決方案實現。它提供了咱們不少已經實現好的負載方案,咱們能夠直接拿來用,或者自定義本身的負載均衡規則。Ribbon客戶端在啓動的時候會從Eureka Server端獲取它須要調用服務的列表,而且作緩存,因此在Ribbon客戶端啓動之後,即便Eureka服務出現問題或者停掉,只要調用的服務沒有問題,仍是能夠保證客戶端的正常調用,這樣作主要是爲了保證CAP中的Availability。spring

  • Ribbon 配置

這裏咱們爲了演示輪詢的負載均衡方案,咱們須要啓動兩個服務的provider,設置不一樣的端口,下面咱們經過 Active profiles 來啓動服務,配置以下:緩存

application-7011.yml服務器

spring:
  application:
    name: provider-service

server:
  port: 7011

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

application-7012.yml併發

spring:
  application:
    name: provider-service

server:
  port: 7012

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

在啓動Application類中添加註解 @EnableDiscoveryClient,而後咱們添加一個測試的Controllers類,代碼以下:app

@RestController
public class RibbonTest {

    @Autowired
    ApplicationContext applicationContext;

    @RequestMapping(value = "/provider/ribbon/printLog", method = RequestMethod.GET)
    public String printLog() throws UnknownHostException {
        String IPAddress = InetAddress.getLocalHost().getHostAddress();
        String port = applicationContext.getEnvironment().getProperty("local.server.port");
        return "Hello Provider ".concat(IPAddress).concat(":").concat(port);
    }

}

至此,咱們的provider service配置好了,接下來咱們來配置 consumer service,首先咱們須要在 pom.xml 添加 ribbon 依賴:負載均衡

pom.xmldom

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

application.ymlide

spring:
  application:
    name: consumer-service

server:
  port: 7021

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone:  http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/

添加 Ribbon 的配置類:性能

@Configuration
// 若是多個服務能夠選擇不一樣的策略
/*@RibbonClients({
        @RibbonClient(name = "other",configuration = OtherConfig.class),
        @RibbonClient(name = "provider",configuration = ProviderConfig.class)
})*/
@RibbonClient(name = "provider-service")
public class RibbonConfig {

    //定義負載均衡規則
    @Bean
    public IRule ribbonRule(){
        return new RoundRobinRule();
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

這裏咱們主要介紹一下 Irule:測試

RoundRobinRule:輪詢規則
RandomRule:隨機規則
WeightedResponseTimeRule:使用響應時間的平均或者百分比爲每一個服務分配權重的規則,若是無法收集響應時間信息,會默認使用輪詢規則
BestAvailableRule:會先根據斷路器過濾掉處於故障的服務,而後選擇併發量最小的服務
ZoneAvoidanceRule:根據server所在Zone和其性能,選擇服務器,默認規則
AvailabilityFilteringRule:先根據斷路器規則過濾掉有問題的服務,而後對剩餘的服務按照輪詢的策略進行訪問
RetryRule:先按照RoundRobinRule規則進行服務獲取,若是調用服務失敗會在指定時間內進行重試,直到獲取到可用的服務。

Consumer service的Controller演示類:

@RestController
public class RibbonTest {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/ribbon/printLog")
    public String printProviderLog(){
        String result = restTemplate.getForObject("http://provider-service/provider/ribbon/printLog", String.class);
        return result;
    }

}
  • 演示Ribbon的輪詢負載均衡

此時咱們首先啓動的的Eureka服務,而後經過Active Profiles啓動兩個不一樣端口的provider service,最後啓動咱們的consumer service,而後訪問 http://localhost:7021/consumer/ribbon/printLog ,而後不斷刷新,咱們會看到端口7011和7012的不斷變化。

相關文章
相關標籤/搜索