1. 程式人生 > >02.Spring Cloud Ribbon負載均衡

02.Spring Cloud Ribbon負載均衡

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的負載均衡生效了。