SpringBoot學習8.4-ribbon負載均衡調用微服務

概要

當請求數量大,高併發時,爲減輕服務器壓力,可以增加微服務部署數量,在請求客戶端通過ribbon將請求分配到各個微服務

開發要點:

1.maven依賴

實現調用微服務負載均衡的主要依賴ribbon

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.0.RELEASE</version>
	<relativePath /> <!-- lookup parent from repository -->
</parent>
 
......
 
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
	<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
 
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	<!-- 實現負載均衡的ribbon依賴包 -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
	</dependency>
</dependency>
 
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

2.spring配置文件

關注ribbon的配置

server:
  port: 8001 # 服務器端口
spring:
  application:
    name: app-server # 微服務名稱
  mvc: #定義視圖解析器的規則
    view:
      prefix: classpath:/templates/ #文件前綴,templates是thymeleafd的默認路徑
      suffix: .html #文件後綴
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7001/eureka/ # 治理客戶端服務域
ribbon:
  OkToRetryOnAllOperations: false #對所有操作請求都進行重試,默認false
  ReadTimeout: 2000   #負載均衡超時時間,默認值5000  # 超過則會斷路
  ConnectTimeout: 1000 #ribbon請求連接的超時時間,默認值2000
  MaxAutoRetries: 0     #對當前實例的重試次數,默認0
  MaxAutoRetriesNextServer: 1 #對切換實例的重試次數,默認1

3.實現負載均衡的RestTemplate

@LoadBalanced標註RestTemplate,就可以實現ribbon負載均衡。

package com.zyf.appserver.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
	/**restTemplate負載均衡訪問微服務*/
	@Bean("servcieRestTemplate")
	@LoadBalanced // ribbon負載均衡
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
}

4.RestTemplate調用微服務語法

要實現負載均衡調用微服務,調用的時候就不能指定IP和端口,而是指定微服務的ID。至於那個微服務實例來處理請求,有ribbon分配。

在寫url的時候將微服務id取代IP和端口,http://微服務ID/請求路徑1/請求路徑2

例如,service-user作爲微服務ID:

restTemplate.getForObject("http://service-user/userRestController/user/{id}", User.class, i);

另外,service-user微服務註冊起碼兩個或兩個以上。先用9001啓動service-user,然後修改端口爲9002,再次啓動service-user。

微服務搭建參考:SpringBoot學習8.3-搭建eureka微服務

如下圖,ID爲service-user的微服務有兩個。

4.測試

請求端代碼:

// rest請求模板-負載均衡調用
@Autowired
private RestTemplate servcieRestTemplate;

@RequestMapping(value = "/getUser/{id}")
public User getUser(@PathVariable int id) {
	User user2 = null;
	for(int i =1;i<=10;i++){
		user2 = 
		servcieRestTemplate.getForObject("http://service-user/userRestController" + "/user/{id}", User.class, i);
	}
	return user2;
}

微服務端代碼:

@RestController
@RequestMapping("/userRestController")
public class UserRestController {
	@GetMapping(value = "/user/{id}")
	public ResponseEntity<User> getUser2(@PathVariable int id) {
		System.out.println("用戶id=" + id);
		User user = new User(1, "李四", 1, "rest風格獲取用戶");
		HttpHeaders headers = new HttpHeaders();
		headers.add("issuccess", "true");// 設置響應頭
		// ResponseEntity 封裝錯誤消息和狀態碼
		return new ResponseEntity<User>(user, headers, HttpStatus.OK);
	}
}

微服務9001日誌:

微服務9002日誌:

可見請求平均分配帶9001和9002兩個微服務上了。

 

github:https://github.com/zhangyangfei/spring-cloud-learn.git 中的cloud-parent工程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章