02.Spring Cloud Ribbon負載均衡
阿新 • • 發佈:2019-01-04
Spring Cloud Ribbon
Spring Cloud Ribbon
1.負載均衡示例
新建三個專案,一個註冊中心(A),一個提供服務的client(B),一個消費服務的client(C)。配置好並啟動,B在不同埠啟動多份。這樣就有了一個註冊中心A,服務提供client B叢集,和一個消費服務client c。在c中獲取B服務:
@RestController
public class UserController {
@Autowired
private LoadBalancerClient client;
@GetMapping("/log")
public String log() {
return "當前列印的節點:" +client.choose("provider").getInstanceId();
}
}
client.choose(“provider”)這個方法回去獲取provider服務,啟動專案訪問/log請求,會列印當前請求的具體是哪個服務。測試發現發現 負載均衡 的實現方式是輪詢的方式去請求服務。
2.修改負載均衡策略
方式一:程式碼配置
配置負載均衡規則為 隨機, RibbonConfiguration不能被@ComponentScan掃描,否則全部都會應用這個規則:
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 配置負載均衡規則為 隨機
return new RandomRule();
}
}
@RibbonClient設定為某一個服務啟動指定的負載均衡策略:
@Configuration
// 指定provider服務使用RibbonConfiguration配置的策略(provider是服務名client.choose("provider"))
@RibbonClient(name = "provider", configuration=RibbonConfiguration.class)
public class TestConfiguration {
}
重啟專案,訪問/log,會發現此時訪問的服務是隨機的。
@SpringBooApplication配置了掃描這個類路徑及其以下的所有元件。RibbonConfiguration 這個不應該被掃描(如果全部應用這個規則,就不需要@RibbonClient這個來指定哪個服務呼叫用哪個規則)。
方式二:配置方式
#provider是服務名
provider:
ribbon:
# 自定義規則
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
內建演算法
RoundRobinRule: 輪詢
RandomRule: 隨機
AvailabilityFilteringRule: 過濾故障熔斷跳閘狀態的服務,併發連線的數量超過閾值的服務,剩下的輪詢
WeightedResponseTimeRule: 根據平均響應時間計算權重,響應時間越快服務權重越大被選中的概率越高,權重資訊不足(如剛啟動時),採用輪詢策略
RetryRule: 先採用輪詢策略,如果獲取服務失敗則在指定時間內會進行重試,獲取可用服務
BestAvailableRule: 過濾多次訪問故障服務,訪問併發量小的服務
ZoneAvoidanceRule: 預設規則,複合判斷server所在區域的效能和server的可用性選擇伺服器
3.在沒有Eureka的情況下使用Ribbon
新建工程,提供服務,pom檔案:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--打包執行,要加這個-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.yml中配置:
spring:
application:
name: common-service
就一個spring boot的web工程就可以了,建立好啟動類,就打包,然後執行打包好 的jar包,使其分別執行在9000和9001埠。
新建工程,使用ribbon呼叫服務:
pom檔案:
<dependencies>
<!--提供web支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--匯入ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
啟動類:
@SpringBootApplication
public class ServiceConsumerApp {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApp.class, args);
}
}
呼叫服務:
@RestController
public class UserController {
@Autowired
private LoadBalancerClient client;
@GetMapping("/info")
public String getInfo() {
return client.choose("common-service").getInstanceId();
}
}
application.yml配置:
# 通過這種方式指定服務
common-service:
ribbon:
listOfServers: http://localhost:9000,localhost:9001
server:
port: 9000
啟動專案 ,訪問localhost:9000/info,就能發現服務是輪詢呼叫的,也就是ribbon的負載均衡生效了。