Ribbon 介紹
Ribbon 是 Netflix 提供的一個基於 Http 和 TCP 的客戶端負載均衡工具,且已整合在 Eureka 依賴中。
實現原理:SpringCloud Ribbon 的底層採用了一個攔截器,攔截了 RestTemplate 發出的請求,對地址做了修改。
開啟客戶端負載均衡,簡化 RestTemplate 呼叫
1)在服務呼叫者的 RestTemplate 配置類上新增註解:
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 開啟客戶端負載均衡(預設輪詢策略)
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2)在呼叫時指定服務名:
package com.controller;
import com.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* 服務呼叫方
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/goods/{id}")
public Goods findOrderByGoodsId(@PathVariable("id") int id) {
String url = String.format("http://eureka-provider/goods/findOne/%d", id);
Goods goods = restTemplate.getForObject(url, Goods.class);
return goods;
}
}
負載均衡策略
負載均衡策略:
- 輪詢(預設)
- 隨機
- 最小併發
- 過濾
- 響應時間
- 輪詢重試
- 效能可用性
使用負載均衡:
方式一:使用 bean 的方式
- 在消費者端配置負載均衡策略 Bean:
package com.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
public class MyRule {
@Bean
public IRule rule() {
return new RandomRule(); // 隨機策略
}
}
- 在啟動類新增註解:
package com;
import com.config.MyRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@EnableDiscoveryClient // 啟用DiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name="eureka-provider", configuration= MyRule.class) // 指定服務提供方並配置負載均衡策略
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
方式二:使用配置檔案
server:
port: 9000
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:8761/eureka
spring:
application:
name: eureka-consumer
# 設定 Ribbon 的負載均衡策略:隨機策略
EUREKA-PROVIDER:
ribbon:
NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule.RandomRule
飢餓載入
Ribbon 預設是採用懶載入,即第一次訪問時才會去建立 LoadBalanceClient,請求時間會很長。而飢餓載入則會在專案啟動時建立,達到降低第一次訪問的耗時。
可以通過下面配置開啟飢餓載入:
ribbon:
eager-load:
enabled: true
clients: userservice